LeetCode 719. 找出第 k 小的距離對 (Java)
阿新 • • 發佈:2020-11-28
題目:
給定一個整數陣列,返回所有數對之間的第 k 個最小距離。一對 (A, B) 的距離被定義為 A 和 B 之間的絕對差值。
示例 1:
輸入:
nums = [1,3,1]
k = 1
輸出:0
解釋:
所有數對如下:
(1,3) -> 2
(1,1) -> 0
(3,1) -> 2
因此第 1 個最小距離的數對是 (1,1),它們之間的距離為 0。
提示:
2 <= len(nums) <= 10000.
0 <= nums[i] < 1000000.
1 <= k <= len(nums) * (len(nums) - 1) / 2.
分析:
通過對陣列排序,我們知道第k小距離一定是在0到nums陣列中最大值和最小值差值之間。基於這個條件我們可以通過二分法來計算,通過計算距離對的數量和k的關係,來修改二分搜尋的邊界,最後求的結果。
在計算陣列中距離對時可以使用雙指標,由於陣列是有序的,i,j從0開始,當nums[j] - nums[i]的值大於我們給的距離m時,則小於m的距離對數就是j-i。不斷移動i和j直到陣列的末尾,將距離對數累加起來。
當距離對數count小於k時,意味著我們求的m較小,此時需要調整左邊界,反之,則調整右邊界。
程式:
class Solution { public int smallestDistancePair(int[] nums, int k) { Arrays.sort(nums); int l = 0, r = nums[nums.length-1] - nums[0];while(l < r){ int mid = l + (r - l) / 2; int count = 0; //compute number of pairs with distance <= mid int i = 0; for(int j = 0; j < nums.length; ++j){ while(nums[j] - nums[i] > mid){ i++; } count+= j - i; } if(count < k){ l = mid+1; }else{ r = mid; } } return l; } }