719. Find K-th Smallest Pair Distance

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:

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.

cpp_code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Solution {
public:
int f_abs(int x){
return x > 0 ? x : -x;
}
int count(vector<int>& nums, int mid){
int cnt = 0;
int n = nums.size();
int j = 0;
//寻找i前面与nums[i]差值刚好不大于mid的j,找i+1的时候直接就在j的基础上往后找,利用了滑动窗口的思想
for(int i = 0; i < n; i++){
while(j < i && (nums[i] - nums[j]) > mid) j++;
cnt += (i - j);
}
return cnt;
}
int smallestDistancePair(vector<int>& nums, int k) {
int n = nums.size();
sort(nums.begin(),nums.end());
int left = 0;
int right = nums[n-1] - nums[0];
//二分,若小于差值mid的个数小于k,则需要将差值增大,反之,则减小。
while(left < right){
int mid = (right + left) / 2;
if(count(nums, mid) < k){
left = mid + 1;
}else{
right = mid;
}
}
return left;
}
};