給定一個排序好的數組,兩個整數 k 和 x,從數組中找到最靠近 x(兩數之差最小)的 k 個數。返回的結果必須要是按升序排好的。如果有兩個數與 x 的差值一樣,優先選擇數值較小的那個數。
示例 1:
輸入: [1,2,3,4,5], k=4, x=3
輸出: [1,2,3,4]
示例 2:
輸入: [1,2,3,4,5], k=4, x=-1
輸出: [1,2,3,4]
說明:
k 的值爲正數,且總是小於給定排序數組的長度。
數組不爲空,且長度不超過 104
數組裏的每個元素與 x 的絕對值不超過 104來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/find-k-closest-elements
思路:
找到最靠近 x 的k個數,感覺不太難,但是實現起來還真的不太簡單,於是我們可以轉變一下思路,去除最不靠近x的len-k個數。似乎這個比剛剛那個方案好實現,而且得到的是一個連續的子序列,不需要進行排序操作。
使用兩個指針,一個表示數組開始,可以表示數組結束,判斷距離然後移動兩個指針。最終把兩個指針區域的數字返回就行了
public List<Integer> findClosestElements(int[] arr, int k, int x) {
List<Integer> res = new ArrayList<>();
if(k<=0){ // 特殊值處理
return res;
}
// len 表示arr的長度
// l 表示數組低位
// h 表示數組高位
int len = arr.length;
int l=0,h=len-1;
while(len>k){
// 判斷數組地位距離x近還是高位距離x近
if(Math.abs(arr[l]-x) > Math.abs(arr[h]-x)){
l++;
}else {
h--;
}
len--;
}
// 製作結果
for(int i=l;i<=h;i++) {
res.add(arr[i]);
}
return res;
}