作者:cecilysun | 来源:互联网 | 2024-12-08 21:37
题目描述:给定一个整数数组,任务是找出所有可能的数对之间的第 k 小距离。具体来说,对于数组中的任意两个元素 (A, B),它们的距离定义为 |A - B|,即两数之差的绝对值。
示例:
输入:
nums = [1,3,1],
k = 1,
输出:0
解析:
可能的数对及其距离分别为:
(1,3) -> 2,
(1,1) -> 0,
(3,1) -> 2,
因此,第 1 小的距离是 0,对应的数对为 (1,1)。
限制条件:
数组长度范围:2 ≤ nums.length ≤ 10000,
数组元素范围:0 ≤ nums[i] <1000000,
k 的取值范围:1 ≤ k ≤ nums.length * (nums.length - 1) / 2。
解决方案概述:
采用二分查找策略,首先对数组进行排序,然后通过两次二分查找来确定第 k 小的距离。第一次二分用于缩小可能的距离范围,第二次二分则用于验证当前假设的距离是否为第 k 小。
class Solution {
public int smallestDistancePair(int[] nums, int k) {
Arrays.sort(nums);
int n = nums.length;
int left = 0, right = nums[n - 1] - nums[0];
while (left int mid = (left + right) / 2;
if (countPairs(nums, mid) >= k) {
right = mid;
} else {
left = mid + 1;
}
}
return left;
}
private int countPairs(int[] nums, int distance) {
int count = 0;
for (int i = 0, j = 0; i while (nums[i] - nums[j] > distance) {
j++;
}
count += i - j;
}
return count;
}
}