Leetcode 658.找到 K 个最接近的元素(Find K Closest Elements)

Leetcode 658.找到 K 个最接近的元素

1 题目描述(Leetcode题目链接)

  给定一个排序好的数组,两个整数 k 和 x,从数组中找到最靠近 x(两数之差最小)的 k 个数。返回的结果必须要是按升序排好的。如果有两个数与 x 的差值一样,优先选择数值较小的那个数。

输入: [1,2,3,4,5], k=4, x=3
输出: [1,2,3,4]
输入: [1,2,3,4,5], k=4, x=-1
输出: [1,2,3,4]

说明:

  • k 的值为正数,且总是小于给定排序数组的长度。
  • 数组不为空,且长度不超过 104
  • 数组里的每个元素与 x 的绝对值不超过 104

2 题解

  从头开始遍历,遇到右边界就停止。

class Solution:
    def findClosestElements(self, arr: List[int], k: int, x: int) -> List[int]:
        res = []
        for i in range(len(arr)):
            if len(res) < k:
                res.append(arr[i])
            else:
                if arr[i] > x and abs(arr[i] - x) >= abs(res[0] - x):
                    break
                res.pop(0)
                res.append(arr[i])
        return res

二分查找,定位左边界的位置。

class Solution:
    def findClosestElements(self, arr: List[int], k: int, x: int) -> List[int]:
        i, j = 0, len(arr) - k
        while i < j:
            mid = (i + j)//2
            if x - arr[mid] > arr[mid + k] - x:
                i = mid + 1
            else:
                j = mid
        return arr[i:i+k]

你可能感兴趣的:(Leetcode)