給定一個排序好的數組,兩個整數 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;}
}