給定一個 排序好 的數組 arr ,兩個整數 k 和 x ,從數組中找到最靠近 x(兩數之差最小)的 k 個數。返回的結果必須要是按升序排好的。
整數 a 比整數 b 更接近 x 需要滿足:
|a - x| < |b - x| 或者
|a - x| == |b - x| 且 a < b
示例 1:
輸入:arr = [1,2,3,4,5], k = 4, x = 3
輸出:[1,2,3,4]
示例 2:
輸入:arr = [1,1,2,3,4,5], k = 4, x = -1
輸出:[1,1,2,3]
提示:
1 <= k <= arr.length
1 <= arr.length <= 104^44
arr 按 升序 排列
-104^44 <= arr[i], x <= 104^44
相向雙指針,我們需要從arr里刪去arr.size()-k個元素:
class Solution {
public:vector<int> findClosestElements(vector<int>& arr, int k, int x) {int left = 0;int right = arr.size() - 1;int deleteNum = 0;while (left < right) {if (deleteNum == arr.size() - k) {break;}if (abs(arr[left] - x) > abs(arr[right] - x)) {++left;} else {--right;}++deleteNum;}return vector<int>(arr.begin() + left, arr.begin() + right + 1);}
};
如果arr的長度為n,則此算法時間復雜度為O(n - k),空間復雜度為O(1)。