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

一.问题描述

给定一个 排序好 的数组 arr ,两个整数 kx ,从数组中找到最靠近 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
相关推荐
sunburn-21 分钟前
Java堆(Heap)详解与实战教学
java·开发语言·数据结构·ide·算法
Kyrie_kk21 分钟前
Java--TimeUnit时间单位枚举类(时间单位规范)
java·后端
念何架构之路41 分钟前
beego总体架构与工程结构
java·架构·beego
典典分享指南1 小时前
用飞书多维表格搭建内容管理看板
java·python·r语言·composer·symfony
智碳能碳管理平台1 小时前
工业能耗台账标准化:能碳管理系统的数据口径怎么设计
算法·能碳管理系统·智碳能碳管理平台·企业能碳管理系统·碳排放核算软件·绿色工厂申报saas·能碳管理平台
带多刺的玫瑰2 小时前
Leecode#15刷题之三数之和
算法·leetcode·职场和发展
哭泣方源炼蛊2 小时前
并查集进阶 P1(带权并查集,并查集分类)
数据结构·c++·算法·二进制·带权并查集
东坡白菜2 小时前
windows下使用Trae启动java项目遇到的乱码问题
java
SQL-First布道者2 小时前
⚡Spring JDBC 完整体系 · 第 10 集 · 手搓 `BaseCondition`
java·spring boot·后端·spring·mybatis·spring jdbc