美文网首页LeeCode题目笔记
2020-01-09 *找出第 k 小的距离对

2020-01-09 *找出第 k 小的距离对

作者: Antrn | 来源:发表于2020-01-09 22:25 被阅读0次

给定一个整数数组,返回所有数对之间的第 k 个最小距离。一对 (A, B) 的距离被定义为 A 和 B 之间的绝对差值。

示例 1:

输入:

nums = [1,3,1]
k = 1

输出:0
解释:
所有数对如下:

(1,3) -> 2
(1,1) -> 0
(3,1) -> 2

因此第 1 个最小距离的数对是 (1,1),它们之间的距离为 0。
提示:

2 <= len(nums) <= 10000.
0 <= nums[i] < 1000000.
1 <= k <= len(nums) * (len(nums) - 1) / 2.

C++1

二分法

class Solution {
public:
    int smallestDistancePair(vector<int>& nums, int k) {
        sort(nums.begin(), nums.end());
        int len = nums.size();
        // 转化为差
        int left = 0, right = nums[len - 1] - nums[0];

        while(left < right){
            int mid = left + (right - left) / 2;
            int count = getCount(nums, mid);
            if(count < k)   
                left = mid + 1;
            else            
                right = mid;
        }

        return left;
    }
    
    //计数方式
    int getCount(vector<int>& nums, int mid){
        int count = 0;
        int left = 0;
        for(int i = 1; i < nums.size();i++){
            while(nums[i] - nums[left] > mid)   
                left++;
            count += i - left;
        }

        return count;
    }
};

相关文章

网友评论

    本文标题:2020-01-09 *找出第 k 小的距离对

    本文链接:https://www.haomeiwen.com/subject/opmuactx.html