给定一个整数数组,返回所有数对之间的第 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个最小的距离 的范围是在 [0,Max - Min] 之间的,也就是我们要在这个范围中找到这个数字,
直接枚举肯定会超时! 我们 可以使用二分 来找! 然后判断 这个 mid是否满足要求 。
判断是否满足要求 方法如下: 对于给定的 i 来说 start从0 开始,知道 nums[i] - nums[start]<= mid ,我们 res+= i-start;
把 i 继续往后加 即可
class Solution {
public:
int JK(vector<int>& nums, int target){
int len = nums.size();
int start = 0;
int res = 0;
for(int i=0;i<len;i++){
while(start<len && nums[i]-nums[start]>target)
start++;
res += i - start;
}
return res;
}
int smallestDistancePair(vector<int>& nums, int k) {
sort(nums.begin(),nums.end());
int len = nums.size();
int l = 0;
int r = nums[len-1] - nums[0];
while(l<r){
int mid = (l+r) /2;
if(JK(nums,mid)>=k)
r = mid;
else
l = mid+1;
}
return l;
}
};