# 0658. Find K Closest Elements
###### tags: `Leetcode` `Medium` `FaceBook` `Binary Search` `BFS` `Sliding Window`
Link: https://leetcode.com/problems/find-k-closest-elements/
## 思路
非常巧妙的一道题
**看到sorted array就要想到binary search**
对左边界进行binary search,移动的条件是 如果arr[mid+k]-x>x-arr[mid]的时候,移动右指针,因为这说明arr[mid]+k以及后面的数不可能出现在结果当中,如果出现的话距离更小的arr[mid]就不能出现在答案里面了,反之同理
这里要注意的是**移动条件**,如果写```Math.abs(arr[mid+k]-x)>Math.abs(x-arr[mid])``` 那么如果遇到两个值相等的情况则容易出错
例如[1,2,2,2,2,2,2,3,3] x = 3,k = 3,答案就会变成[2,2,2]
(如果不理解的话,可以看这个网站(https://leetcode.com/problems/find-k-closest-elements/discuss/106426/JavaC%2B%2BPython-Binary-Search-O(log(N-K)-%2B-K))
## Code
```java=
class Solution {
public List<Integer> findClosestElements(int[] arr, int k, int x) {
List<Integer> ans = new ArrayList<>();
int start = 0;
int end = arr.length-k;
while(start<end){
int mid = (start+end)/2;
if(x-arr[mid]>arr[mid+k]-x){
start = mid+1;
}
else{
end = mid;
}
}
for(int i = start;i < start+k;i++){
ans.add(arr[i]);
}
return ans;
}
}
```