LeetCode 719. 找出第 k 小的距离对

90 阅读1分钟
class Solution {
public:
    //返回差值比mid小的个数
    int get(vector<int>& nums,  int mid) {
        int res = 0;
        for(int i = 0, j = 0; i < nums.size(); i ++) {
            while(nums[i] - nums[j] > mid) j ++;
            res += i - j;//i-j表示有(i-j)个元素到nums[i]的距离小于等于mid距离对数量
        }
        return res;
    }

    int smallestDistancePair(vector<int>& nums, int k) {
        sort(nums.begin(), nums.end());
        int l = 0, r = 1e6;
        while(l < r) {
            int mid = (l + r) >> 1;
            if(get(nums, mid) >= k) r = mid;//如果差值比mid小的个数比k大,则说明mid比较大,在mid的左边寻找即可
            else l = mid + 1;
        }
        return r;
    }
};