第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; } };
然后这个题也是这样传送门
还有一个题就是这个传送门