链接:https://leetcode.com/problems/find-k-th-smallest-pair-distance/description/
Given an integer array, return the k-th smallest distance among all the pairs. The distance of a pair (A, B) is defined as the absolute difference between A and B.
Example 1:
Input: nums = [1,3,1] k = 1 Output: 0 Explanation: Here are all the pairs: (1,3) -> 2 (1,1) -> 0 (3,1) -> 2 Then the 1st smallest distance pair is (1,1), and its distance is 0.
Note:
2 <= len(nums) <= 10000
.0 <= nums[i] < 1000000
.1 <= k <= len(nums) * (len(nums) - 1) / 2
.
思路:二分查找+滑动窗口思想,很巧妙的一道题。最后二分查找注释的位置困扰了我好久。
class Solution { public: int smallestDistancePair(vector<int>& nums, int k) { sort(nums.begin(),nums.end()); int l=0; int h=nums[nums.size()-1]-nums[0]; while(l<h)//二分查找,因为当count==k时,搜索到的m差值可能并不存在,需要继续循环判断,直到范围确定 { int m=l+(h-l)/2; int left=0; int count=0; for(int right=0;right<nums.size();right++) { while(nums[right]-nums[left]>m) { left++; } count+=right-left; } if(count>=k) { h=m; } else if(count<k) { l=m+1; } } return l; } };