zoukankan      html  css  js  c++  java
  • 719. Find K-th Smallest Pair Distance

    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.

     Approach #1: Brute Force.[Memory Limit Exceeded] 

    class Solution {
    public:
        int smallestDistancePair(vector<int>& nums, int k) {
            int len = nums.size();
            vector<int> temp;
            for (int i = 0; i < len; ++i) {
                for (int j = i+1; j < len; ++j) {
                    int sub = abs(nums[i] - nums[j]);
                    temp.push_back(sub);
                }
            }
            sort(temp.begin(), temp.end());
            return temp[k-1];
        }
    };
    

      

    Approach #2: Brute Force. [Bucter Sort]

    class Solution {
    public:
        int smallestDistancePair(vector<int>& nums, int k) {
            int len = nums.size();
            sort(nums.begin(), nums.end());
            int N = nums.back();
            vector<int> container(N+1, 0);
            for (int i = 0; i < len; ++i) {
                for (int j = i+1; j < len; ++j) {
                    ++container[nums[j]-nums[i]];
                }
            }
            for (int i = 0; i <= N; ++i) {
                k -= container[i];
                if (k <= 0) return i;
            }
            return 0;
        }
    };
    

    Runtime: 580 ms, faster than 13.29% of C++ online submissions for Find K-th Smallest Pair Distance.

    Approach #2: Binary Search + DP

    class Solution {
    public:
        int smallestDistancePair(vector<int>& nums, int k) {
            int len = nums.size();
            sort(nums.begin(), nums.end());
            int l = 0;
            int r = nums.back() - nums.front();
            while (l <= r) {
                int count = 0;
                int j = 0;
                int m = l + (r - l) / 2;
                for (int i = 0; i < len; ++i) {
                    while (j < len && nums[j] - nums[i] <= m) j++;
                    count += j - i - 1;
                }
                count >= k ? r = m - 1 : l = m + 1;
            }
            return l;
        }
    };
    
    Runtime: 16 ms, faster than 43.93% of C++ online submissions for Find K-th Smallest Pair Distance.

    we can use a constant to instead dp array.

    永远渴望,大智若愚(stay hungry, stay foolish)
  • 相关阅读:
    980不同路径III
    输入函数
    IDEA更新maven依赖包
    join()函数
    方差偏差困境
    np.bincount()函数
    72编辑距离
    741摘樱桃
    523连续的子数组和
    1306跳跃游戏III
  • 原文地址:https://www.cnblogs.com/h-hkai/p/9931935.html
Copyright © 2011-2022 走看看