658. Find K Closest Elements【二分查詢 + 雙指標 + 找最近】
阿新 • • 發佈:2019-01-03
class Solution { public static List<Integer> findClosestElements(List<Integer> arr, int k, int x) { LinkedList<Integer> results = new LinkedList<>(); int i = 0; for(; i < arr.size();i++){ if(arr.get(i) > x){ break; } } if(i != 0){ i--;//指向最後一個小的或等的。 } int p1 = i; int p2 = i+1; //兩個指標分別向兩邊走。 while(k >0){ if( p1>= 0 && p2 < arr.size() ){ //注意 【距離最近】: 需要用絕對值判斷。 if(Math.abs(arr.get(p1)- x) <= Math.abs(arr.get(p2) - x)){ results.addFirst(arr.get(p1--));//為滿足按序輸出。 k--; }else{ results.addLast(arr.get(p2++));//為滿足按序輸出。 k--; } }else if(p1 >= 0){ results.addFirst(arr.get(p1--)); k--; }else if(p2 < arr.size()){ results.addLast(arr.get(p2++)); k--; } } return results; } }