Leetcode658题找到k个最接近的数

题目

给定一个排序好的数组,两个整数 k 和 x,从数组中找到最靠近 x(两数之差最小)的 k 个数。返回的结果必须要是按升序排好的。如果有两个数与 x 的差值一样,优先选择数值较小的那个数。

输入: [1,2,3,4,5], k=4, x=3
输出: [1,2,3,4]

k 的值为正数,且总是小于给定排序数组的长度。
数组不为空,且长度不超过 104
数组里的每个元素与 x 的绝对值不超过 104

题解

下面参考图片来源于leetcode题解区。本题采用二分查找法进行求解,如下图所示,二分过程中,需要找到离目标x最近的数以判断出连续的起始区间,本题最终结果让二分后的left作为最终返回子数组开始点,所以在二分过程中当x靠mid更近时,继续从左边的子数组查找起始left。

class Solution {
    public List<Integer> findClosestElements(int[] arr, int k, int x) {
        int left = 0;
        int right = arr.length - k;
        while(left < right){
            int mid = left + (right - left) / 2;
            if(x - arr[mid] > arr[mid + k] - x){    
                left = mid + 1;
            }
            else{
                right = mid;    //因为最后返回的是left开始的子数组,所以这里找返回数组的起始点是继续从左边开始找
            }
        }
        List<Integer> result = new ArrayList<>();
        for(int i = left; i < left + k; ++i){
            result.add(arr[i]);
        }
        return result;
    }
}

 参考:https://leetcode-cn.com/problems/find-k-closest-elements/solution/pai-chu-fa-shuang-zhi-zhen-er-fen-fa-python-dai-ma/

原文地址:https://www.cnblogs.com/jianglinliu/p/11813624.html