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:
n == nums.length
2 <= n <= 10^4
0 <= nums[i] <= 10^6
1 <= k <= n * (n - 1) / 2
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:
- Time complexity : O(n).
- Space complexity : O(n).