658. 找到 K 个最接近的元素
给定一个排序好的数组 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]
题解参考
方法:滑窗
直接采用二分法有很多复杂情况,如x的值超出了数组范围,所以可以换一种思维,那就是:
1、直接把K个元素当成数组上面一个能够左右滑动的框.
2、 因为x的值是给定了的,所以,不管x在不在数组里面, x在数组里面的位置其实是固定的(如果按大小排序的话).
3、也就是说,我们需要确定这个框的起点p,使得[p,p+k]
这几个元素对于x满足题意.
4、那么我们可以用二分查找来算这个起点p.
[0, n-k]
(最大的起点为n-k
,这样才能保证选取长度为k
的连续子数组)l , r
,计算中点mid
, 这个中点mid是我们的暂定起点p,我们将通过不断循环来更新这个mid最终找到p。# (闭区间写法)
class Solution:
def findClosestElements(self, arr, k, x):
n = len(arr)
l = 0
r = n - k
while l <= r:
mid = (l + r) // 2
if x - arr[mid] <= arr[mid + k] -x:
r = mid - 1
else:
l = mid + 1
return arr[l:l+k]
注意二分法的区间写法
(左闭右开区间写法)
while l <= r: 改为 while l <= r:
r = mid - 1 改为 r = mid - 1