题目
给定一个 排序好 的数组
arr
,两个整数k
和x
,从数组中找到最靠近x
(两数之差最小)的k
个数。返回的结果必须要是按升序排好的。整数
a
比整数b
更接近x
需要满足:
|a - x| < |b - x|
或者|a - x| == |b - x|
且a < b
解题
"""
时间复杂度为 O(log(n-k) + k),其中 n 是数组的长度。二分查找部分的时间复杂度为 O(log(n-k)),而结果提取部分的时间复杂度为 O(k)
"""
from typing import List
def findClosestElements(arr, k, x):
# 二分查找,找到最接近 x 的元素的位置
left, right = 0, len(arr) - k
# 使用二分查找来确定最左边的边界
while left < right:
mid = (left + right) // 2
# 比较 x 与 arr[mid] 和 arr[mid + k] 的距离
if x - arr[mid] > arr[mid + k] - x:
left = mid + 1
else:
right = mid
# 从找到的 left 位置开始的 k 个元素即为结果
return arr[left:left + k]
# 示例输入
arr = [1, 2, 3, 4, 5]
k = 4
x = 3
result = findClosestElements(arr, k, x)
print(result) # 输出: [1, 2, 3, 4]