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; } }