第k小(套路问题)

问题一:

传送门

给定一个整数数组,返回所有数对之间的第 k 个最小距离。一对 (A, B) 的距离被定义为 A 和 B 之间的绝对差值。

示例 1:

输入:
nums = [1,3,1]
k = 1
输出:0
解释:
所有数对如下:
(1,3) -> 2
(1,1) -> 0
(3,1) -> 2
因此第 1 个最小距离的数对是 (1,1),它们之间的距离为 0。
提示:

2 <= len(nums) <= 10000.
0 <= nums[i] < 1000000.
1 <= k <= len(nums) * (len(nums) - 1) / 2.

题目解析:

遇见这种第k小的题我感觉是一个二分的套路题,就是说二分这个条件,如果这个judge(mid)>=k的话就是减小边界,要不然就增大边界。

然后这个judge(mid)指的是有多少对a[i]和a[j]小于mid。这个是有单调性的

然后就转化成另一个问题就是给你一个序列,求有多少对a[i]和a[j]小于等于x,然后这个题就是一个双指针的题,首先把序列排一下序,然后看看利用双指针求

 

Code:

class Solution {
public:
    int judge(vector<int>& nums,int x){
        int ans=0;
        for(int i=0,j=0;i<nums.size();i++){
            while(nums[i]-nums[j]>x){
                j++;
            }
            ans+=(i-j);
        }
        return ans;
    }
    int smallestDistancePair(vector<int>& nums, int k) {
        sort(nums.begin(),nums.end());
        int n = nums.size();
        int l=0,r=1e6,ans;
        while(r>=l){
            int mid=(l+r)/2;
            if(judge(nums,mid)>=k){
                r=mid;
                ans=mid;
            }
            else{
                l=mid;
            }
        }
        return ans;

    }
};

然后这个题也是这样传送门

还有一个题就是这个传送门

 

posted @ 2021-10-21 20:56  lipu123  阅读(96)  评论(0)    收藏  举报