1. 程式人生 > >658. Find K Closest Elements【二分查詢 + 雙指標 + 找最近】

658. Find K Closest Elements【二分查詢 + 雙指標 + 找最近】

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;
    }

}