题目
![](https://img-blog.csdnimg.cn/2179c99a07394f969edf28d761e27db9.png)
思路
这个题仔细思考一下就可以发现要使用二分法来解题。最重要的部分就是要思考要对哪个变量进行二分。冥思苦想加wa了一发之后还是参考了题解,我们要对数对的距离进行二分。在每次进行二分搜索时,计算小于m的数对有几个,如果大于等于k,则r=m-1;否则l=m+1。最后的答案就是l。因为我们要求的是小于m的数对有k-1对的情况,l可以起到lastpoint的作用。
代码
class Solution {
public:
int smallestDistancePair(vector<int>& nums, int k) {
sort(nums.begin(), nums.end());
int n = nums.size(), l = 0, r = nums.back()-nums.front();
while(l <= r) {
int cnt = 0;
int m = (l+r)/2;
for(int i = 0; i < n; ++i) {
int x = lower_bound(nums.begin(), nums.end(), nums[i]-m)-nums.begin();
cnt += i-x;
}
if(cnt >= k) {
r = m-1;
} else {
l = m+1;
}
}
return l;
}
};