719. 找出第 k 小的距离对

Posted vampire6

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了719. 找出第 k 小的距离对相关的知识,希望对你有一定的参考价值。

719. 找出第 k 小的距离对

技术图片

思路:

首先采用了暴力求差值,11组数据超时,优化后利用map来求,结果在最后的两组超时。。然而还是要用二分写,二分差值,最小的为0,最大的是排完序后最后一个数的值减去第一个数的值,取mid,然后在原来数组里继续二分找有多少对差值cnt是小于等于mid的。

  • 若对数cnt大于了k,则说明,mid左边的差值(即差值<=mid的)个数>k,够了,则在mid左边继续寻找,即将右指针为mid
  • 若对数cnt小于了k,则说明,mid左边的差值(即差值<=mid的)的个数<k,不够,则在mid的右边继续找,即将左指针为mid+1,
    直到找到刚好个数<k的那个mid,最后返回mid+1即可。

一:速度慢的二分,采用lower_bound来求有多少个数对的差值小于mid

class Solution {
public:
    bool check(vector<int>& nums,int mid,int k)
   {
            int cnt=0;
            for(int i=0;i<nums.size();i++)
            {
                int ops=lower_bound(nums.begin(),nums.end(),nums[i]+mid)-(nums.begin()+i);
                cnt+=ops-1;
            }
            return cnt<k;
    }   
    int smallestDistancePair(vector<int>& nums, int k) {
        sort(nums.begin(),nums.end());
        int L=0,R=nums[nums.size()-1]-nums[0];
        while(L<=R)
        {
            int mid=(L+R)>>1;
            if(check(nums,mid,k))
                L=mid+1;
            else
                R=mid-1;
        }
        return R;
    }
};

二:快的二分,采用双指针来求有多少个数对的差值小于mid

class Solution {
public:
    bool check(vector<int>& nums,int mid,int k)
   {
            int cnt=0;
            int now=0;
            for(int i=0;i<nums.size();i++)
            {
                while(now<nums.size()&&nums[i]-nums[now]>mid)
                    now++;
                cnt+=(i-now);
            }
            return cnt<k;
    }   
    int smallestDistancePair(vector<int>& nums, int k) {
        sort(nums.begin(),nums.end());
        int L=0,R=nums[nums.size()-1]-nums[0];
        while(L<R)
        {
            int mid=(L+R)>>1;
            if(check(nums,mid,k))
                L=mid+1;
            else
                R=mid;
        }
        return L;
    }
};

以上是关于719. 找出第 k 小的距离对的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode719.找出第k小的距离对二分 & 双指针

Leetcode719.找出第k小的距离对二分 & 双指针

LeetCode 719 找出第K小的数对距离[二分法 双指针] HERODING的LeetCode之路

对于给定的n个元素的数组a[1..n] 要求从中找出第k小的元素,输出这个元素 pascal

找出n个有序数组中第K小的数。怎么写算法啊?各位帮帮忙!

第k小数1