0%

658. Find K Closest Elements

二分+two pointers O(k+logn) time
两个指针分别向左右移,最后把两个指针之间的数返回即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public:
vector<int> findClosestElements(vector<int>& arr, int k, int x) {
auto it = upper_bound(begin(arr), end(arr), x); // lower_bound也行
int n = arr.size(), r = it == end(arr) ? n - 1 : it - begin(arr), l = r - 1;
while (k-- > 0) {
if (l < 0) {
++r;
} else if (r >= n) {
--l;
} else {
if (x - arr[l] <= arr[r] - x) { // arr[l] < x <= arr[r]
--l;
} else {
++r;
}
}
}
return vector<int>(begin(arr) + l + 1, begin(arr) + r); // 因为l和r都会多走一步,所以l要回退一步,r正好不用
}
};