给定一个整数数组,返回所有数对之间的第k个最小距离(绝对值)。
解题思路 :
1.对于(A,B)的距离的值进行二分搜索,对于每个距离判断小于当前距离的个数n,如果n<k舍弃左边集合,否则舍去右边集合
2.在计算小于当前距离的个数n时, 使用双指针方法。
#include<bits/stdc++.h>
using namespace std;
int fun_count(vector<int>& arr, int val){
int left = 0, ans = 0;
for(int i = 0; i < arr.size(); ++i){
while(arr[i] - arr[left] > val) ++left;
ans += (i - left);
}
return ans;
}
int smallestDistancePair(vector<int>& arr, int k){
sort(arr.begin(), arr.end());
int left = 0, right = arr.back() - arr[0];
while(left <right){
int mid = (right - left) / 2 + left;
if(fun_count(arr, mid) >= k){
right = mid;
}
else{
left = mid + 1;
}
}
return left;
}
int main()
{
vector<int> arr = {1,3,1};
int k = 1;
cout<<smallestDistancePair(arr, k)<<endl;
return 0;
}