📅  最后修改于: 2023-12-03 15:12:43.467000             🧑  作者: Mango
给定一个整数数组 arr 和两个整数 k 和 x,在数组中找到最靠近 x 的 k 个元素,其中 k > 0,且假设数组 arr 中的元素不重复。返回这 k 个元素按与 x 的距离升序排列的列表。如果有两个元素与 x 的距离相同,那么它们按数值升序排列返回。
函数原型为:
def findClosestElements(arr: List[int], k: int, x: int) -> List[int]:
pass
输入:
arr = [1,2,3,4,5]
k = 4
x = 3
输出:
[1,2,3,4]
解释:
数组中距离3最近的4个元素是 [1,2,3,4],按照与x的距离升序排列返回。
这道题可以先通过二分查找得到离x最近的数的下标,然后双指针向两边扩展,找到距离离x最近的k个数。具体实现见下面的代码:
from typing import List
def findClosestElements(arr: List[int], k: int, x: int) -> List[int]:
n = len(arr)
# 二分找到离x最近的数的下标
left, right = 0, n-k
while left < right:
mid = left + (right-left)//2
if x - arr[mid] <= arr[mid+k] - x:
right = mid
else:
left = mid + 1
# 双指针寻找距x最近的k个数
return arr[left:left+k]
这里的时间复杂度是O(log(n)+k),空间复杂度是O(1)。