Find K-th Smallest Pair Distance

HardArrayTwo PointersBinary SearchSorting

Solution

export function smallestDistancePair(nums: number[], k: number): number {
  nums.sort((a, b) => a - b);
 
  const n = nums.length;
  let [left, right] = [0, nums[n - 1] - nums[0]];
  while (left < right) {
    const mid = left + Math.floor((right - left) / 2);
    if (countPair(nums, mid) < k) {
      left = mid + 1;
    } else {
      right = mid;
    }
  }
  return left;
}
 
function countPair(nums: number[], distance: number) {
  const n = nums.length;
  let count = 0;
  let [i, j] = [0, 0];
  while (i < n || j < n) {
    while (j < n && nums[j] - nums[i] <= distance) {
      j += 1;
    }
    count += j - i - 1;
    i += 1;
  }
  return count;
}

Complexity

  • Time: O(NlogN)
  • Space: O(1)