LeetCode719. 找出第 k 小的距離對
阿新 • • 發佈:2020-12-12
☆☆☆☆☆(太繞了 T_T)
思路:二分 + 雙指標。題目要求第K個最小距離,所以如果我們有一個有序陣列記錄著所有可能的最小距離,那麼問題就可以變成一個最簡單的二分法求解了
本題的難點在於二分查詢的不是某個數,而是兩個數的差值(即距離)。需要使用雙指標來計算出所有小於等於mid
的距離對數目。
class Solution { public int smallestDistancePair(int[] nums, int k) { /** * 思路:分兩步求解,第一步 理清楚二分; 第二步 雙指標計算出所有小於等於mid的距離對數目*/ Arrays.sort(nums); int len = nums.length; int low = 0, high = nums[len - 1] - nums[0]; // 第 k 小的距離一定在最小距離 和 最大距離之間。 while (low < high) { int mid = low + ((high - low) >> 1); int count = 0; // 記錄所有<= mid 的距離對數目。 int left = 0;for (int right = 0; right < len; right++) { while (nums[right] - nums[left] > mid) left ++; count += right - left; } if (count >= k) { high = mid; // mid有可能是要找的值。 }else { // count < k 整個數列中比mid小的數列對的數量小於k個:low = mid + 1; } } return low; } }
參考: