Code
錯誤版本,錯誤的原因在於假設 l, r
為 index,用 mid
計算 [0:mid]
之間有多少 pair,但是 pair 之間並不具有 monotonicity,例如 [4, 62, 100]
,100 - 62 < 62 - 4
。
class Solution {
public:
int smallestDistancePair(vector<int>& nums, int k) {
sort(nums.begin(), nums.end());
int l = 0, r = nums.size() - 1;
while(l < r) {
int mid = l + (r - l) / 2;
int pairCount = mid * (mid + 1) / 2;
if(pairCount < k) l = mid + 1;
else r = mid;
}
return nums[l] - nums[0];
}
};
題目要求 pair distance,那就應該將 l, r
設為 pair distance 的上下 limit,然後對其做 binary search。
class Solution {
public:
int smallestDistancePair(vector<int>& nums, int k) {
sort(nums.begin(), nums.end());
int n = nums.size();
int l = 0, r = nums[n - 1] - nums[0];
while(l < r) {
int mid = l + (r - l) / 2;
int i = 0, j = 0;
int pairCount = 0;
while(i < n || j < n) {
while( j < n && (nums[j] - nums[i]) <= mid) j++;
pairCount += j - i - 1;
i++;
}
if(pairCount < k) l = mid + 1;
else r = mid;
}
return l;
}
};