Find K Closest Elements
class Solution {
public List<Integer> findClosestElements(int[] arr, int k, int x) {
List<Integer> list = new ArrayList<>();
if(arr == null || arr.length == 0)
return list;
int start = 0, end = arr.length - 1;
while(start + 1 < end){
int mid = start + (end - start)/2;
if(arr[mid] >= x)
end = mid;
else
start = mid;
}
int index = arr[end] <= x ? end : arr[start] <= x ? start : -1;
int left = index, right = index + 1;
for(int i = 0; i < k; i++){
if(leftCloser(left,right,x,arr)){
list.add(0,arr[left]);
left--;
}else{
list.add(arr[right]);
right++;
}
}
return list;
}
public boolean leftCloser(int left, int right, int target, int[] arr){
if(left < 0){
return false;
}
if(right >= arr.length)
return true;
return target - arr[left] <= arr[right] - target;
}
}Last updated