Given an integer array, return the k-th smallest distance among all the pairs. The distance of a pair (A, B) is defined as the absolute difference between A and B.
Example 1:
Input:
nums = [1,3,1]
k = 1
Output: 0
Explanation:
Here are all the pairs:
(1,3) -> 2
(1,1) -> 0
(3,1) -> 2
Then the 1st smallest distance pair is (1,1), and its distance is 0.
Note:
- 2 <= len(nums) <= 10000.
- 0 <= nums[i] < 1000000.
- 1 <= k <= len(nums) * (len(nums) - 1) / 2.
解法一(桶排序):
空间开销太大。
解法二(二分法):
int smallestDistancePair(vector<int>& nums, int k) {
sort(nums.begin(), nums.end());
int left = 0, right = nums.back() - nums[0];
while(left < right) {
int mid = left + (right - left) / 2, cnt = 0, start = 0;
for(int i = 0; i<nums.size(); i++){
while(start < nums.size() && nums[i] - nums[start] > mid)
start++;
cnt += i - start;
}
if(cnt < k) left = mid + 1;
else right = mid;
}
return left;
}
cnt 记录距离小于mid的pair数。
时间复杂度O(nlogk + nlogn),其中k是最大差值。
网友评论