1. 程式人生 > 實用技巧 >LeetCode719. 找出第 k 小的距離對

LeetCode719. 找出第 k 小的距離對

☆☆☆☆☆(太繞了 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; } }

參考:

動用「二分查詢模板」來巧妙解決此題