您的位置:首页 > 大数据 > 人工智能

719. Find K-th Smallest Pair Distance

2017-10-29 11:32 337 查看
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次,虽然说可以最坏情况的复杂度还是可能蛮大的
*
4000
/
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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: