力扣719.找出第K小的数对距离
- 二分答案
朴素版
-
双指针遍历数组 超过界限break
-
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个数对
-
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; } };