返回

发现离目标最近的k个元素,轻松掌握658题解题技巧

见解分享

哈喽,大家好,我是技术博客创作专家,今天我们来一起看看LeetCode中的第658题:找到K个最接近的元素。

题目

给定一个 排序好 的数组 arr ,两个整数 k 和 x ,从数组中找到最接近 x 的 k 个元素。

您需要以 升序 返回结果。

示例 1:

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

示例 2:

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

示例 3:

输入:arr = [1,1,1,10,10,10], k = 1, x = 9
输出:[10]

提示:

  • 1 <= k <= arr.length
  • 1 <= arr.length <= 10^4
  • arr 是 [-10^4, 10^4] 中的整数
  • arr 按 升序 排序
  • -10^4 <= x <= 10^4

解题思路

这道题的思路相对简单,我们可以利用二分查找算法来解决。

  1. 首先,我们先用二分查找算法找到一个元素,这个元素的值最接近x。
  2. 然后,我们以这个元素为中心,向两边扩展,找到最接近x的k个元素。
  3. 最后,我们将找到的这k个元素按照升序排列,并返回。

代码示例

def findClosestElements(arr, k, x):
    """
    :type arr: List[int]
    :type k: int
    :type x: int
    :rtype: List[int]
    """
    # 使用二分查找找到一个元素,这个元素的值最接近x
    left, right = 0, len(arr) - 1
    while left < right:
        mid = (left + right) // 2
        if arr[mid] == x:
            return arr[mid-k+1:mid+k]
        elif arr[mid] < x:
            left = mid + 1
        else:
            right = mid - 1

    # 以这个元素为中心,向两边扩展,找到最接近xk个元素
    left, right = max(0, left - k), min(len(arr) - 1, right + k)
    while right - left + 1 > k:
        if x - arr[left] < arr[right] - x:
            right -= 1
        else:
            left += 1

    # 将找到的这k个元素按照升序排列,并返回
    return arr[left:right+1]

结语

以上就是658题的解题思路和代码示例。希望大家能够通过这篇文章学到一些新的知识。如果您有任何问题,欢迎在评论区留言。