arr
,两个整数 k
和 x
,从数组中找到最靠近 x
(两数之差最小)的 k
个数。
k <= arr.size()
。a
比整数 b
更接近 x
需要满足:
|a - x| < |b - x|
或者 |a - x| == |b - x|
且 a < b
。k
。
x
更远就移动哪个位置的指针。arr.size()
,最后区间长度为 k
,所以实际上只需要移动 arr.size() - k
次就可以得出结果。x - arr[mid] <= arr[mid+k] - x
,其中 mid
为二分搜索中找的左边界。
x
位于 [mid, mid+k]
的右边、位于 [mid, mid+k]
之间等等,对于不同的情况,x - arr[mid] <= arr[mid+k] - x
的解释都是不一样的,所以比较麻烦,在此不展开了。class Solution
{
public:
vector<int> findClosestElements(vector<int>& arr, int k, int x)
{
int m = arr.size();
int l = 0, r = m-1;
for(int i = 0; i < m - k; ++i)
{
if(abs(x - arr[l]) > abs(x - arr[r])) // 左边差值更大
++l;
else // 右边差值更大
--r;
}
return vector<int>(arr.begin()+l, arr.begin()+l+k);
}
};
class Solution {
public:
vector<int> findClosestElements(vector<int>& arr, int k, int x) {
int left = 0;
int right = arr.size() - k;
while(left < right)
{
int mid = (left + right) / 2;
if(x - arr[mid] > arr[mid + k] - x)
{
left = mid + 1;
}
else
{
right = mid;
}
}
return vector<int>(arr.begin() + left, arr.begin() + k + left);
}
};