【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。
相关推荐
Pniubi11 分钟前
区分Java创建线程池、多线程
java·线程·线程池·多线程·并发
程序员梅雨17 分钟前
ZooKeeper面经总结
java·大数据·linux·分布式·后端·zookeeper·中间件
Yyyyyy~37 分钟前
【Java】多线程初阶
java
蜗牛互联网38 分钟前
Java 17 调用视觉 Responses API:JSON 约束与人工复核路由
java·人工智能·后端
Tisfy42 分钟前
LeetCode 2333.最小差值平方和:排序 + 数学计算(不用二分)
数学·算法·leetcode·题解·贪心·排序
aqiu1111111 小时前
【C++算法打怪专栏】LeetCode 217. 存在重复元素(解法总结)
c++·算法·leetcode
SL_staff2 小时前
物模型三要素误用避坑指南:属性、事件、服务的正确建模逻辑
java
一条泥憨鱼2 小时前
【Redis | 黑马点评】短信登录功能 源码深度分析
java·redis·后端·session·黑马点评
威哥爱编程2 小时前
【AI全栈12-12】Spring Boot 3.x → 4.x 迁移实操:Jakarta 11、Jackson 3 与 AI 2.0
java·spring boot·后端
威哥爱编程2 小时前
【AI全栈12-11】Spring Boot 把 AI 接口真正上线扛量:限流 / 降级 / 可观测
java·spring boot·后端