0658. 找到 K 个最接近的元素
大约 2 分钟
0658. 找到 K 个最接近的元素
- 标签:数组、双指针、二分查找、排序、滑动窗口、堆(优先队列)
- 难度:中等
题目链接
题目大意
描述:给定一个有序数组 ,以及两个整数 、。
要求:从数组中找到最靠近 (两数之差最小)的 个数。返回包含这 个数的有序数组。
说明:
整数 比整数 更接近 需要满足:
- 或者
- 且 。
。
。
按升序排列。
。
示例:
- 示例 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:二分查找算法
数组的区间为 ,查找的子区间长度为 。我们可以通过查找子区间左端点位置,从而确定子区间。
查找子区间左端点可以通过二分查找来降低复杂度。
因为子区间为 ,所以左端点最多取到 的位置。
设定两个指针 ,。 指向 , 指向 。
每次取 和 中间位置,判断 与左右边界的差值。 与左边的差值为 , 与右边界的差值为 。
- 如果 与左边界的差值大于 与右边界的差值,即 ,将 右移,,从右侧继续查找。
- 如果 与左边界的差值小于等于 与右边界的差值, 即 ,则将 向左侧靠拢,,从左侧继续查找。
最后返回 即可。
思路 1:代码
class Solution:
def findClosestElements(self, arr: List[int], k: int, x: int) -> List[int]:
n = len(arr)
left = 0
right = n - k
while left < right:
mid = left + (right - left) // 2
if x - arr[mid] > arr[mid + k] - x:
left = mid + 1
else:
right = mid
return arr[left: left + k]
思路 1:复杂度分析
- 时间复杂度:,其中 为数组中的元素个数。
- 空间复杂度:。