原题链接:719. 找出第 K 小的数对距离
Solution:
二分+排序+双指针
① 数对距离一定在数组元素的最大值max - 最小值min中
② 将数组nums进行排序,计算出二分的区间l = 0,r = nums.back() - nums[0];
② 编写函数计算出数组中数对距离小于等于k的个数(双指针),利用此函数进行二分
class Solution {
public:
int smallestDistancePair(vector<int>& nums, int k) {
sort(nums.begin(),nums.end());
int l = 0,r = nums.back() - nums[0]; //第k小数对距离一定在max - min中
while(l < r) {
int mid = l + (r - l) / 2;
int cnt = get_NomoreThan_k(nums, mid);
if(cnt >= k) r = mid;
else l = mid + 1;
}
return l;
}
//在nums中查找不超过k的数对距离个数
int get_NomoreThan_k(vector<int> &nums, int k) {
int n = nums.size();
int tot = 0;
for(int i = 0,j = 0;i < n;i++) {
while(j < i && nums[i] - nums[j] > k) j++;
tot += i - j;
}
return tot;
}
};