二分法 双指针 找出第k小的距离对

给定一个整数数组,返回所有数对之间的第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;
}

猜你喜欢

转载自blog.csdn.net/qq_24624539/article/details/108613666