力扣719.找出第K小的数对距离
- 二分答案
朴素版
-
双指针遍历数组 超过界限break
cpp
auto check = [&](int mid) -> bool
{
int res=0;
for(int i=0;i<n-1;i++)
for(int j=i+1;j<n;j++)
{
if(nums[j] - nums[i] > mid) break;
else
if(++res >= k) return true;
}
return false;
};
优化版
-
双指针遍历 j找到位置以后直接+=j - i - 1个数对
cpp
class Solution {
public:
int smallestDistancePair(vector<int>& nums, int k) {
ranges::sort(nums);
int n = nums.size();
auto check = [&](int mid) -> bool
{
int res=0;
for(int i=0,j=0;i<n-1;i++)
{
while(j<n && nums[j] - nums[i] <= mid) j++;
res += j - i - 1;
if(res >= k) return true;
}
return false;
};
int l = 0,r = nums[n-1] - nums[0];
while(l<r)
{
int mid = l + r >> 1;
if(check(mid)) r = mid;
else l = mid + 1;
}
return l;
}
};