https://leetcode.cn/problems/find-k-closest-elements/ 给定一个 排序好 的数组 arr ,两个整数 k 和 x ,从数组中找到最靠近 x(两数之差最小)的 k 个数。返回的结果必须要是按升序排好的。 整数 a 比整数 b 更接近 x 需要满足: a - x < b - x 或者 a - x == b - x 且 a < b 示例 1:

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

示例 2:

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

提示:

1 <= k <= arr.length
1 <= arr.length <= 104
arr 按 升序 排列
-104 <= arr[i], x <= 104

# 题解

解法一:按照题意进行排序,返回前 k 个,官方解法写的确实短。

class Solution {
public:
vector findClosestElements(vector<int>& arr, int k, int x) {
sort(arr.begin(), arr.end(), [x](int a, int b) -> bool {
return abs(a - x) < abs(b - x) abs(a - x) == abs(b - x) && a < b;
});
sort(arr.begin(), arr.begin() + k);
return vector(arr.begin(), arr.begin() + k);
}
};

解法二:二分加双指针,依旧是简短的官方代码。

class Solution {
public:
vector findClosestElements(vector<int>& arr, int k, int x) {
int right = lower_bound(arr.begin(), arr.end(), x) - arr.begin();
int left = right - 1;
while (k--) {
if (left < 0) { right++; } else if (right >= arr.size()) {
left--;
} else if (x - arr[left] <= arr[right] - x) {
left--;
} else {
right++;
}
}
return vector(arr.begin() + left + 1, arr.begin() + right);
}
};