719. Find K-th Smallest Pair Distance

Difficulty:
Related Topics:
Similar Questions:

Problem

The distance of a pair of integers a and b is defined as the absolute difference between a and b.

Given an integer array nums and an integer k, return the kth **smallest *distance among all the pairs*** nums[i] *and* nums[j] where 0 <= i < j < nums.length.

  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.

Example 2:

Input: nums = [1,1,1], k = 2
Output: 0

Example 3:

Input: nums = [1,6,1], k = 3
Output: 5

  Constraints:

Solution

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
var smallestDistancePair = function(nums, k) {
    nums.sort((a,b) => a-b);
    let lo = 0;
    let hi = nums[nums.length - 1] - nums[0];

    while (lo < hi) {
        let mi = lo + Math.floor((hi-lo) / 2);
        // Sliding window
        let count = 0, left = 0;
        for (let right = 1; right < nums.length; ++right) {
            // Keep moving left pointer until we reach a difference between two pointers that is less than mi
            while (nums[right] - nums[left] > mi) left++;
            // Add the amount of pairs in the window to the count
            count += right - left;
        }
        //count = number of pairs with distance <= mi
        if (count >= k) hi = mi;
        else lo = mi + 1;
    }
    return lo;
};

Explain:

nope.

Complexity: