给定一个排序好的数组,两个整数 k 和 x,从数组中找到最靠近 x(两数之差最小)的 k 个数。返回的结果必须要是按升序排好的。如果有两个数与 x 的差值一样,优先选择数值较小的那个数。
示例 1:
输入: [1,2,3,4,5], k=4, x=3
输出: [1,2,3,4]
代码
class Solution {public int getFindClosestElements(int[] arr, int x) {//查找x在数组中的位置int n=arr.length,l=0,r=n-1;while (l<=r){int mid=(r-l)/2+l;if(arr[mid]==x)return mid;else if(arr[mid]<x)l=mid+1;else r=mid-1;}if(l==0) return l;if(l==n) return n-1;return arr[l]-x>=x-arr[r]?r:l;//比较应该放在l还是r}public List<Integer> findClosestElements(int[] arr, int k, int x) {int n=arr.length,l=getFindClosestElements(arr, x);LinkedList<Integer> list=new LinkedList<>();list.add(arr[l]);k--;int le=l-1,ri=l+1;//双指针while (k>0){int ls=le<0?Integer.MAX_VALUE:x-arr[le];int rs=ri>=n?Integer.MAX_VALUE:arr[ri]-x; if(rs<ls)//取接近的那个数{list.addLast(arr[ri++]);}else list.addFirst(arr[le--]);k--;}return list;}
}