Given a sorted integer array arr, two integers k and x, return the k closest integers to x in the array. The result should also be sorted in ascending order.
An integer a is closer to x than an integer b if:
|a - x| < |b - x|, or
|a - x| == |b - x| and a < b
Example 1:
1 2
Input: arr = [1,2,3,4,5], k = 4, x = 3 Output: [1,2,3,4]
Example 2:
1 2
Input: arr = [1,2,3,4,5], k = 4, x = -1 Output: [1,2,3,4]
Constraints:
1 <= k <= arr.length
1 <= arr.length <= 104
arr is sorted in ascending order.
-104 <= arr[i], x <= 104
Hints/Notes
2023/11/16
since we need the smaller index, find the left boundary
classSolution { public: vector<int> findClosestElements(vector<int>& arr, int k, int x){ int index = findLeft(arr, x); int left = index - 1, right = index; list<int> res; while (k > 0) { if (left < 0) { res.push_back(arr[right++]); } elseif (right == arr.size()) { res.push_front(arr[left--]); } else { int ldelta = abs(arr[left] - x); int rdelta = abs(arr[right] - x); if (ldelta <= rdelta) { res.push_front(arr[left--]); } else { res.push_back(arr[right++]); } } k--; } returnvector<int>(res.begin(), res.end()); }
intfindLeft(vector<int>& arr, int x){ int left = 0, right = arr.size(); // left - 1 < x // right >= x while (left < right) { int mid = (right - left) / 2 + left; if (arr[mid] == x) { right = mid; } elseif (arr[mid] > x) { right = mid; } else { left = mid + 1; } } return right; } };