1、二分法找最接近的一个
之后再寻找其它几个
vector<int> findClosestElements(vector<int>& arr, int k, int x) {
vector<int> ans;
int n = arr.size();
//最靠近k的
int mid, l = 0, r = n - 1;
int nearest;
while (l < r) {
mid = l + (r - l) / 2;
if (arr[mid] >= x) {
r = mid;
}
else {
l = mid + 1;
}
}
if (l - 1 >= 0 && arr[l] - x >= x - arr[l - 1])
nearest = l - 1;
else nearest = l;
int left = max(nearest - k + 1, 0);
int right = left + k - 1;
for (int i = max(nearest - k + 1, 0) + k; i < min(nearest + k, n); i++) {
if (arr[i] - x < x - arr[left]) {
left++;
right = i;
}
}
for (int i = left; i <= right; i++) {
ans.push_back(arr[i]);
}
return ans;
}
2、根据最左的一个二分
vector<int> findClosestElements(vector<int>& arr, int k, int x) {
int n = arr.size();
int l = 0, r = n -k- 1;//找最左一个的位置
int mid;
while (l <= r) {
mid = l + (r - l) / 2;
if (x - arr[mid] > arr[mid + k] - x) {
l = mid + 1;
}
else {
r = mid - 1;
}
}
return vector<int>(arr.begin() + l, arr.begin() + l + k);
}
注意结尾返回的时候可以直接用vector(arr.begin() + l, arr.begin() + l + k);
方法二参考:
作者:jyj407
链接:https://leetcode-cn.com/problems/find-k-closest-elements/solution/zhong-gui-zhong-ju-san-chong-jie-fa-er-fen-hua-chu/
来源:力扣(LeetCode)