Given an integer array, return the k-th smallest distance among all the pairs. The distance of a pair (A, B) is defined as the absolute difference between A and B.
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.
Note:
2 <= len(nums) <= 10000
.0 <= nums[i] < 1000000
.1 <= k <= len(nums) * (len(nums) - 1) / 2
.
思路:想到的是:PriorityQueue + pruning
* 还可以怎么优化?二分?Merge sort?
* 就是二分,转化为求差小于k的有多少个(还可以用二分法优化,确定减数是一个循环o(n),然后要找剩下的被减数就只要log(n)也可以双指针)
* 而且题目也有说0 <= nums[i] < 1000000,说明差最多也就1000000
* 暗示用二分就最多20次,虽然说可以最坏情况的复杂度还是可能蛮大的
package l719;
import java.util.Arrays;
/*
* 想到的是:PriorityQueue + pruning
* 还可以怎么优化?二分?Merge sort?
* 就是二分,转化为求差小于k的有多少个
* 而且题目也有说0 <= nums[i] < 1000000,说明差最多也就1000000
* 暗示用二分就最多20次,虽然说可以最坏情况的复杂度还是可能蛮大的
*/
class Solution {
public int smallestDistancePair(int[] nums, int k) {
Arrays.sort(nums);
int lo = 0, hi = 1000000;
while(lo+1 < hi) {
int mid = (lo+hi)/2;
if(getDiffLessThan(nums, mid) >= k)
hi = mid;
else
lo = mid;
}
return lo;
}
private int getDiffLessThan(int[] nums, int mid) {
int ret = 0;
for(int i=0; i<nums.length; i++) {
int j=i+1;
while(j<nums.length && nums[j]-nums[i]<mid) {
ret ++;
j++;
}
}
return ret;
}
}