美文网首页
LeetCode Find K-th Smallest Pair

LeetCode Find K-th Smallest Pair

作者: codingcyx | 来源:发表于2018-04-20 11:04 被阅读0次

    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:

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

    解法一(桶排序):
    空间开销太大。

    解法二(二分法):

        int smallestDistancePair(vector<int>& nums, int k) {
            sort(nums.begin(), nums.end());
            int left = 0, right = nums.back() - nums[0];
            while(left < right) {
                int mid = left + (right - left) / 2, cnt = 0, start = 0;
                for(int i = 0; i<nums.size(); i++){
                    while(start < nums.size() && nums[i] - nums[start] > mid)
                        start++;
                    cnt += i - start;
                }
                if(cnt < k) left = mid + 1;
                else right = mid;
            }
            return left;
        }
    

    cnt 记录距离小于mid的pair数。
    时间复杂度O(nlogk + nlogn),其中k是最大差值。

    相关文章

      网友评论

          本文标题:LeetCode Find K-th Smallest Pair

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