找出第k小的数对距离
数对 (a,b) 由整数 a 和 b 组成,其数对距离定义为 a 和 b 的绝对差值。
给你一个整数数组 nums 和一个整数 k ,数对由 nums[i] 和 nums[j] 组成且满足 0 <= i < j < nums.length 。返回 所有数对距离中 第 k 小的数对距离。
解题思路:对数组进行排序后,第k小数对距离必定在[0,nums[nums.length]-nums[0]]之间
取mid=(rigth-left)/2 , 设小于mid的数对的距离的个数为cnt, 当cnt>k,则right=mid-1,否则left=mid+1
cnt的求法:遍历数组,二分搜索 i = binaryserach(nums,j,num[j]-mid) cnt=j-i
import java.util.Array
class Solution {
public int smallestDistancePair(int[] nums, int k) {
Arrays.sort(nums);
int len = nums.length;
int right = nums[len-1]-nums[0];
int left = 0;
while(left<=right){
int mid = (right+left)/2;
int cnt = 0;
for (int j = 0; j < len; j++) {
int i = binarySearch(nums, j, nums[j] - mid);
cnt += j - i;
}
if (cnt >= k) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return left;
}
public int binarySearch(int[] nums,int end,int target){
int left=0;
int right = end;
while(left<right){
int mid = (left+right)/2;
if(nums[mid]<target){
left=mid+1;
}else{
right=mid;
}
}
return left;
}
}