链接: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(left < nums.size() && nums[right]-nums[left]>m)
{
left++;
}
count+=right-left;
}
if(count>=k)
{
h=m;
}
else if(count<k)
{
l=m+1;
}
}
return l;
}
};