二分+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); 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) { --l; } else { ++r; } } } return vector<int>(begin(arr) + l + 1, begin(arr) + r); } };
|