Skip to content

Latest commit

 

History

History
executable file
·
70 lines (63 loc) · 1.79 KB

719. Find K-th Smallest Pair Distance.md

File metadata and controls

executable file
·
70 lines (63 loc) · 1.79 KB

719. Find K-th Smallest Pair Distance

Question:

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.

Solution:

  • Method 1: Bucket sort

    class Solution {
        public int smallestDistancePair(int[] nums, int k) {
            int len = nums.length;
            int size = len * (len - 1) / 2;
            int[] arr = new int[1000000];
            for(int i = 0; i < len; i++){
                for(int j = i + 1; j < len; j++){
                    arr[Math.abs(nums[i] - nums[j])]++;
                }
            }
            int cur = 0;
            while(k > 0){
                k -= arr[cur++];
            }
            return cur - 1;
        }
    }
  • Method 2: Binary Search + dp

    class Solution {
        public int smallestDistancePair(int[] nums, int k) {
            Arrays.sort(nums);
            int len = nums.length;
            int left = 0, right = nums[nums.length - 1];
            while(left <= right){
                int mid = left + (right - left) / 2;
                int j = 0;
                int count = 0;
                for(int i = 0; i < len; i++){
                    while(j < len && nums[j] - nums[i] <= mid) ++j;
                    count += j - i - 1;
                }
                if(count >= k) right = mid - 1;
                else left = mid + 1;
            }
            return left;
        }
    }