📜  门| GATE-CS-2016(套装2)|第 34 题(1)

📅  最后修改于: 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)。