leetcode 658 | 找到 K 個最接近的元素

給定一個排序好的數組,兩個整數 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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章