二分查找+双指针
首先使用二分查找,如果数组存在该元素,返回该元素的位置,不存在则找到待插入的位置index,详见力扣第35题 【搜索插入位置】_liushu521521的博客-CSDN博客
易得目标值肯定在[index-1,index]这个闭区间内,于是在这里使用双指针,让left=index-1,right=index,然后进行k此循环,判断是将left还是right加入到结果数组res中
if((Math.abs(arr[left]-x)<=Math.abs(arr[right]-x) && left>=0)||right==arr.length)
如果左边的绝对值小于等于右边的绝对值,并且左边未越界(left>=0),将left对应的值加入结果数组的首部,或者满足right已经到达右边界,也将left对应的值加入结果数组的首部。
否则加入尾部。
完整代码如下:
//先用二分查找找到可以插入的位置,然后使用双指针找到可以插入的值
var findIndex=function(arr,x){
let left=0,right=arr.length-1;
//[)
while(left<=right){
let mid=Math.floor((left+right)/2);
if(arr[mid]==x){
return mid;
}else if(arr[mid]>x){
right=mid-1;
}else{
left=mid+1;
}
}
return left;
}
var findClosestElements = function(arr, k, x) {
let index=findIndex(arr,x);
let left=index-1,right=index;
let res=[];
while(k--){
if((Math.abs(arr[left]-x)<=Math.abs(arr[right]-x) && left>=0)||right==arr.length){
res.unshift(arr[left])
left--;
}else{
res.push(arr[right])
right++
}
}
return res
};