🤔 新手做题思路:

  第1步:理解题目

  - 找距离x最近的k个数
- 数组已排序
- 返回结果也要排序(升序)
- 距离相同时,选择较小的数

  第2步:关键insight

  - 数组已排序 → 考虑二分查找
- 最近的k个数一定是连续的k个数 → 考虑滑动窗口/双指针
- 只需要找到这个连续区间的起始位置

数组排序和二分查找有关 ,注意滑动窗口不用排序

指定的子串长度和滑动窗口有关

  第3步:核心思想

  最近的k个数字一定形成一个长度为k的连续子数组,问题转化为:
在所有长度为k的子数组中,找到距离x总和最小的那个

● 💡 解题方法(从简单到优化):

  方法1:暴力法(新手先理解这个)

  def findClosestElements_brute(arr, k, x):# 计算每个元素与x的距离,然后排序distances = []for num in arr:distances.append((abs(num - x), num))# 按距离排序,距离相同时按值排序distances.sort(key=lambda item: (item[0], item[1]))# 取前k个元素result = [item[1] for item in distances[:k]]# 返回排序结果return sorted(result)

  方法2:双指针法(推荐理解)

  def findClosestElements_two_pointers(arr, k, x):left, right = 0, len(arr) - 1# 收缩到k个元素while right - left >= k:# 比较左右边界哪个离x更远,移除更远的if abs(arr[left] - x) > abs(arr[right] - x):left += 1elif abs(arr[left] - x) < abs(arr[right] - x):right -= 1else:# 距离相同,移除更大的数if arr[left] > arr[right]:left += 1else:right -= 1return arr[left:right + 1]

  方法3:二分查找(最优解)

  def findClosestElements_binary(arr, k, x):# 二分查找最佳起始位置left, right = 0, len(arr) - kwhile left < right:mid = (left + right) // 2# 比较mid位置和mid+k位置哪个更适合作为起点# 如果x离右边界更近,说明最佳区间应该右移if x - arr[mid] > arr[mid + k] - x:left = mid + 1else:right = midreturn arr[left:left + k]

  🔍 详细解析双指针法(最容易理解):

  核心思想:

  - 初始时:左指针=0,右指针=n-1(包含所有元素)
- 目标:缩小到恰好k个元素
- 策略:每次移除距离x最远的边界元素

  手动模拟:

  arr = [1,2,3,4,5], k = 4, x = 3

  初始: left=0, right=4, 区间=[1,2,3,4,5] (5个元素)
比较: |1-3|=2 vs |5-3|=2,距离相等,移除较大的5
结果: left=0, right=3, 区间=[1,2,3,4] (4个元素) ✓

  完整代码实现:

● def findClosestElements(arr, k, x):
"""
推荐的双指针解法
时间复杂度: O(n)
空间复杂度: O(1)
"""
left, right = 0, len(arr) - 1

      # 收缩窗口直到剩下k个元素
while right - left + 1 > k:
# 计算左右边界与x的距离
left_dist = abs(arr[left] - x)
right_dist = abs(arr[right] - x)

          if left_dist > right_dist:
# 左边更远,移除左边
left += 1
elif left_dist < right_dist:
# 右边更远,移除右边
right -= 1
else:
# 距离相等,移除数值更大的(题目要求)
if arr[left] > arr[right]:
left += 1
else:
right -= 1

      return arr[left:right + 1]

  # 测试
print(findClosestElements([1,2,3,4,5], 4, 3))      # [1,2,3,4]
print(findClosestElements([1,1,2,3,4,5], 4, -1))  # [1,1,2,3]

  🚀 二分查找优化版(面试加分):

  def findClosestElements_optimal(arr, k, x):
"""
二分查找最优起始位置
时间复杂度: O(log n)
空间复杂度: O(1)
"""
# 在[0, n-k]范围内找最佳起始位置
left, right = 0, len(arr) - k

      while left < right:
mid = (left + right) // 2

          # 关键判断:比较mid和mid+k位置
# 如果x更靠近右边界,说明最优区间应该右移
if x - arr[mid] > arr[mid + k] - x:
left = mid + 1
else:
right = mid

      return arr[left:left + k]

  🎯 复杂度对比:

  | 方法   | 时间复杂度      | 空间复杂度 | 难度  |
|------|------------|-------|-----|
| 暴力法  | O(n log n) | O(n)  | ⭐   |
| 双指针  | O(n)       | O(1)  | ⭐⭐  |
| 二分查找 | O(log n)   | O(1)  | ⭐⭐⭐ |

  📝 考试建议:

  优先掌握双指针法:
- 思路清晰,容易理解
- 代码简洁,不容易出错
- 时间复杂度已经很好了

  二分查找法作为加分项:
- 面试时展现算法功底
- 但逻辑相对复杂,容易出错

  ★ Insight ─────────────────────────────────────
这道题的关键洞察是:最近的k个元素必然是连续的。因为如果不连续,中间跳过的元素肯定比端点的某个元素更接近x,这与最优性矛盾。基于这个洞察,问题就转化为寻找最
优的连续k元素子数组,可以用双指针或二分查找来高效求解。
─────────────────────────────────────────────────

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/95766.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/95766.shtml
英文地址,请注明出处:http://en.pswp.cn/web/95766.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习心得分享

我认为知识是一定要系统化的学习&#xff0c;结构化梳理&#xff0c;这样在运用或思考的时候&#xff0c;能够回忆起自己在这一块梳理的知识结构&#xff0c;如果有记录那么能快速回忆并理解&#xff0c;如果没有记录&#xff0c;那么说明对自己来说超纲了&#xff0c;把知识进…

为什么说 Linode 和 DigitalOcean 的差距,不止于 VPS?

在今天这个全球化的商业战场上&#xff0c;中国企业的出海已从“选择题”变为“必答题”。当我们满怀雄心&#xff0c;将产品和业务推向海外市场时&#xff0c;基础设施的选择&#xff0c;往往是决定成败的第一步。它不仅关乎成本与性能&#xff0c;更直接影响着团队的开发效率…

NSSCTF每日一题_Web_[SWPUCTF 2022 新生赛]奇妙的MD5

为了保持做题的感觉和持续学习&#xff0c;也就有了每日一题系列&#xff0c;选一些有意义的题目或者一些CTF新颖题目作为参考学习。[SWPUCTF 2022 新生赛]奇妙的MD51. 访问首页界面并进行分析估计题目MD5提示,查询得知ffifdyop 这个字符串是一个奇妙的MD5字符串因为将“ffifdy…

服务器IP暴露被攻击了怎么办?

当服务器IP暴露后&#xff0c;可能会面临各种网络攻击&#xff0c;如DDoS攻击、端口扫描、恶意入侵等&#xff0c;这将严重影响服务器的正常运行和数据安全。本文将从检测攻击类型、采取紧急防护措施、优化服务器配置、寻求专业支持以及预防未来攻击五个方面&#xff0c;详细探…

TDengine 时间函数 TIMETRUNCATE 用户手册

TDengine TIMETRUNCATE 函数用户使用手册 函数概述 TIMETRUNCATE 是 TDengine 中的一个时间处理标量函数&#xff0c;用于将时间戳按照指定的时间单位进行截断操作。该函数在时间数据聚合、分组和统计分析中非常有用&#xff0c;特别适用于智能电表等时序数据的分析场景。 语…

Linux电脑怎样投屏到客厅的大电视?支持远程投屏吗?

一般的电脑投屏软件都会推出Windows版本和macOS版本&#xff0c;虽然这两个版本已经覆盖大部分消费者的常用电脑&#xff0c;但是依然有一部分群体因为电脑系统版本问题不能使用投屏软件。 如果你当前使用的是Linux系统的电脑&#xff0c;而且又要将电脑投屏投屏到客厅的大电视…

MP4视频太大如何压缩?分享6种简单便捷的压缩小技巧

随着拍摄高清视频的设备越来越多&#xff0c;我们经常会遇到MP4视频文件体积过大的问题&#xff0c;无论是上传到社交平台、发送给朋友&#xff0c;还是存储在设备中&#xff0c;过大的视频文件都会带来诸多不便。那么&#xff0c;MP4视频太大怎么压缩呢&#xff1f;本文将介绍…

k8s 部署 redis

创建部署文件 vim redis.yaml添加如下内容&#xff1a; apiVersion: v1 kind: Namespace metadata:name: redis --- apiVersion: v1 kind: Secret metadata:name: redis-passwordnamespace: redis type: Opaque data:password: d2d3cmhnZWE # 建议生产环境使用更复杂的密码 ---…

FFMPEG H264

一、H264压缩编码1.1 H264 中的 I 帧、P帧和 B帧H264 使用帧内压缩和帧间压缩的方式提高编码压缩率&#xff1b;H264 采用了独特的 I 帧、P 帧和 B 帧策略来实现&#xff0c;连续帧之间的压缩&#xff1b;1.2 其他概念GOP&#xff08;图像组&#xff09;&#xff1a;一个IDR帧到…

Unity 解决天空盒中间出现一条线

问题解决找到天空盒对应贴图&#xff0c;在Inspector 面板中找到Advanced →Generate Mip Maps 并取消勾选即可。效果动态修改天空盒RenderSettings.skybox targetSkyboxMaterial; DynamicGI.UpdateEnvironment();

Python爬虫实战:研究Showcase模块,构建电商平台销售数据采集和分析系统

1. 引言 1.1 研究背景 在数字经济快速发展的今天,电商平台积累了海量的商品信息、交易数据和用户反馈,这些数据蕴含着丰富的市场洞察。根据中国电子商务研究中心数据,2024 年我国网络零售市场规模突破 15 万亿元,平台商品数据呈现指数级增长。如何高效提取这些数据并转化…

C++中的Reactor和Proactor模型进行系统性解析

<摘要> 本解析系统阐述了网络编程中Reactor与Proactor两种高性能I/O模型的核心概念。Reactor基于同步I/O多路复用&#xff0c;通过事件循环分发通知&#xff0c;由应用层自行完成I/O操作&#xff1b;而Proactor则基于异步I/O&#xff0c;由操作系统完成I/O操作后主动回调…

【技术教程】如何将文档编辑器集成至基于Node.js的网页应用程序中

当今数字化时代&#xff0c;Web应用对在线文档编辑的需求日益增长。无论是构建在线办公系统、内容管理平台还是协作工具&#xff0c;让用户能够直接在浏览器中编辑和处理文档已成为基本需求。 想知道如何为你的 Node.js 应用添加强大的在线文档编辑功能吗&#xff1f;本文手把…

[论文阅读] 人工智能 + 软件工程 | 别让AI写的代码带“漏洞”!无触发投毒攻击的防御困境与启示

别让AI写的代码带“漏洞”&#xff01;无触发投毒攻击的防御困境与启示 论文信息 原标题&#xff1a;Evaluating Defenses Against Trigger-Free Data Poisoning Attacks on NL-to-Code Models&#xff08;评估NL-to-Code模型应对无触发数据投毒攻击的防御方法&#xff09;主要…

【Windows】通过 runas 命令实现多用户权限测试的完整流程

▒ 目录 ▒&#x1f6eb; 导读需求1️⃣ 前期准备&#xff1a;创建管理员/普通测试用户1.1 创建普通用户Test&#xff08;无管理员权限&#xff09;1.2 创建管理员用户Admin&#xff08;含管理员权限&#xff09;2️⃣ 核心操作&#xff1a;通过runas命令切换用户命令行环境2.1…

新后端漏洞(上)- H2 Database Console 未授权访问

漏洞介绍&#xff1a; H2 database是一款Java内存数据库&#xff0c;多用于单元测试。 H2 database自带一个Web管理页面&#xff0c;在Spirng开发中&#xff0c;如果我们设置如下选项&#xff0c;即可允许外部用户访问Web管理页面&#xff0c;且没有鉴权&#xff1a; spring.h2…

2025-09-04 HTML3——区块布局与表单

文章目录1 块元素与行内元素1.1 块元素 (Block-level Element)1.2 行内元素 (Inline Element)2 HTML 布局2.1 使用 <div> 元素2.2 使用 <table> 元素3 表单 (<form>)3.1 输入域&#xff08;<input>&#xff09;3.1.1 文本域&#xff08;Text Fields&am…

云数据库服务(参考自腾讯云计算工程师认证课程)更新中......

数据库基础介绍面临的挑战&#xff1a;数据库系统架构&#xff1a; 数据库DB、数据库管理系统DBMS&#xff08;负责数据库的搭建、使用和维护的系统软件&#xff0c;通过组织、索引、查询、修改数据库文件、实现数据定义、组织、存储、管理以及数据库操作、运行和维护等主要功能…

源滚滚AI编程SillyTavern酒馆配置Claude Code API教程

什么是酒馆 SillyTavern&#xff08;简称 ST&#xff09;是一款本地安装的用户界面&#xff0c;让你能够与文本生成大模型&#xff08;LLM&#xff09;、图像生成引擎以及语音合成&#xff08;TTS&#xff09;模型进行交互。我们的目标是尽可能赋予用户对 LLM 提示词的最大掌控…

软件设计师——软件工程学习笔记

软件工程 一、软件工程基础知识 1. 软件的生存周期&#xff08;1&#xff09;可行性分析与项目开发计划。这个阶段主要确定软件的开发目标及其可行性。参与该阶段的人员有用户、项目负责人、系统分析师。产生的文档有 可行性分析报告、项目开发计划。 &#xff08;2&#xff09…