力扣719.找出第K小的数对距离
力扣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;elseif(++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;}};