【二分+二分】
首先对数组排序,然后算出最大值和最小值之间的差值,这个差值就是解空间的最大值,然后对解空间进行二分,每次对解空间的mid统计数对距离小于他的个数,通过个数来决定查询哪边的区间。
统计个数同样可以采用二分查找。
class Solution {
int[] nums;
int n;
int binarySearch(int left, int target){
int right = n - 1;
while(left <= right){
int mid = (left + right) >>> 1;
if(nums[mid] > target) right = mid - 1;
else left = mid + 1;
}
return right;
}
public int smallestDistancePair(int[] nums, int k) {
this.nums = nums;
n = nums.length;
Arrays.sort(nums);
int left = 0, right = nums[n - 1] - nums[0];
while(left <= right){
int mid = (left + right) >>> 1;
int t = 0;
for(var i = 0; i < n; i++){
t += binarySearch(i + 1, nums[i] + mid) - i;
}
if(t >= k) right = mid - 1;
else left = mid + 1;
}
return left;
}
}