题目
给定一个 排序好 的数组 arr ,两个整数 k 和 x ,从数组中找到最靠近 x(两数之差最小)的 k 个数。返回的结果必须要是按升序排好的。
整数 a 比整数 b 更接近 x 需要满足:
|a - x| < |b - x| 或者
|a - x| == |b - x| 且 a < b
示例
输入:arr = [1,2,3,4,5], k = 4, x = 3
输出:[1,2,3,4]
输入:arr = [1,2,3,4,5], k = 4, x = -1
输出:[1,2,3,4]
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-k-closest-elements
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
方法1:二分+双指针
Java实现
class Solution {
public List<Integer> findClosestElements(int[] arr, int k, int x) {
int n = arr.length;
int l = 0, r = n - 1;
while (l < r) {
int mid = l + r + 1 >> 1;
if (arr[mid] <= x) {
l = mid;
} else {
r = mid - 1;
}
}
//⭐
r = r + 1 < n && Math.abs(arr[r + 1] - x) < Math.abs(arr[r] - x) ? r + 1 : r;
//向两边扩散
int i = r - 1, j = r + 1;
while (j - i - 1 < k) {
if (i >= 0 && j < n) {
if (Math.abs(arr[j] - x) < Math.abs(arr[i] - x)) j++;
else i--;
} else if (i >= 0) {
i--;
} else if (j < n) {
j++;
}
}
//不包括边界的 i 和 j
List<Integer> res = new ArrayList<>();
for (int p = i + 1; p <= j - 1; p++) {
res.add(arr[p]);
}
return res;
}
}