【leetcode658】有序数组找出k个最接近x的数

一.问题描述

给定一个 排序好 的数组 arr ,两个整数 k 和 x ,从数组中找到最靠近 x(两数之差最小)的 k 个数。返回的结果必须要是按升序排好的。

整数 a 比整数 b 更接近 x 需要满足:

  • |a - x| < |b - x| 或者
  • |a - x| == |b - x| 且 a < b

示例 1:

java 复制代码
<strong>输入:</strong>arr = [1,2,3,4,5], k = 4, x = 3
<strong>输出:</strong>[1,2,3,4]

示例 2:

java 复制代码
<strong>输入:</strong>arr = [1,1,2,3,4,5], k = 4, x = -1
<strong>输出:</strong>[1,1,2,3]

提示:

  • 1 <= k <= arr.length
  • 1 <= arr.length <= 104
  • arr 按 升序 排列
  • -104 <= arr[i], x <= 104

Related Topics

  • 数组
  • 双指针
  • 二分查找
  • 排序
  • 滑动窗口
  • 堆(优先队列)

二.示例代码

java 复制代码
public List<Integer> findClosestElements(int[] arr, int k, int x) {
        int left = 0, right = arr.length - 1;
        int removeSize = arr.length - k;
        while (removeSize > 0) {
            if (x - arr[left] <= arr[right] - x) {
                right--;
            } else {
                left++;
            }
            removeSize--;
        }
        List<Integer> res = new ArrayList<>();
        for (int i = left; i < left + k; i++) {
            res.add(arr[i]);
        }
        return res;
    }

三.代码解读

  • removeSize 表示需要移除的元素个数,即 n - k。
  • 循环内每次比较两端点距离,移除较远的一端,直到窗口收缩到长度 k。
  • 最后从 left 开始连续取 k 个元素即为答案。

arr[left] 必然小于右端点 arr[right],所以相等时保留左端点、移除右端点。

复杂度分析

  • 时间复杂度: O(n),其中 n 为数组长度,最多移除 n - k 个元素。
  • 空间复杂度: O(1),仅使用常数个变量。

四.总结

  • 本题的关键是利用数组有序性 ,将问题转化为寻找长度为 k 的连续子数组。
  • 双指针收缩法直观易懂,时间复杂度 O(n),空间复杂度 O(1)。
  • 进阶思考:能否用二分查找 将时间复杂度优化到 O(log n)?提示:二分搜索的目标是左边界 left,比较 arr[mid] 与 arr[mid + k] 谁更接近 x。
相关推荐
SL_staff32 分钟前
打破风控迭代死循环:用决策编排重构业务与技术协作链路
java·产品·全栈
Mikko71 小时前
Redis 连接数满了服务端有错误信息吗?连接数不增加却命令超时?6.2 实测连接池、超时与大 key 怎么判定
java·spring boot·redis·后端
.Bryce.1 小时前
从零到一开发技术名词大全:从需求分析到 AI Agent 工程
java·网络·人工智能·agent·需求分析·agent评测
小超人诞生日记1 小时前
C++ 智能指针的使用及其原理详解
c++·算法
SL_staff1 小时前
JVS-APS的7个刚性约束设计:从无限产能幻觉到可执行排产的工程实践
java·spring cloud·全栈
代码山河3 小时前
基本类型转换:自动类型转换与强制类型转换
java·学习·架构·教程·面向对象·项目
lisw053 小时前
互联网上的数据结构可视化!
数据结构·信息可视化
Escalating_xu4 小时前
【Linux 网络编程】五种 I/O 模型与非阻塞 I/O:从“等数据”到正确处理 EAGAIN
java·linux·网络
程序猿乐锅4 小时前
万字详解Single-flight(单飞模式)
java·开发语言·分布式·后端·学习·single-flight