news 2026/5/17 8:56:15

LeetCode 452 - 用最少数量的箭引爆气球

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode 452 - 用最少数量的箭引爆气球


文章目录

    • 摘要
    • 描述
    • 题解答案(核心思路)
      • 关键策略
      • 为什么是按右边界排序?
    • 题解代码(Swift 可运行 Demo)
    • 题解代码分析
      • 1. 排序是整个解法的灵魂
      • 2. 为什么初始箭数是 1?
      • 3. 核心判断逻辑
      • 4. 为什么不用管 y 坐标?
    • 示例测试及结果
      • 示例 1
      • 示例 2
      • 示例 3
    • 实际场景结合
    • 时间复杂度
    • 空间复杂度
    • 总结
网罗开发(小红书、快手、视频号同名)

大家好,我是展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。

图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:华为HDE/HDG

我的博客内容涵盖广泛,主要分享技术教程、Bug解决方案、开发工具使用、前沿科技资讯、产品评测与使用体验。我特别关注云服务产品评测、AI 产品对比、开发板性能测试以及技术报告,同时也会提供产品优缺点分析、横向对比,并分享技术沙龙与行业大会的参会体验。我的目标是为读者提供有深度、有实用价值的技术洞察与分析。

展菲:您的前沿技术领航员
👋 大家好,我是展菲!
📱 全网搜索“展菲”,即可纵览我在各大平台的知识足迹。
📣 公众号“Swift社区”,每周定时推送干货满满的技术长文,从新兴框架的剖析到运维实战的复盘,助您技术进阶之路畅通无阻。
💬 微信端添加好友“fzhanfei”,与我直接交流,不管是项目瓶颈的求助,还是行业趋势的探讨,随时畅所欲言。
📅 最新动态:2025 年 3 月 17 日
快来加入技术社区,一起挖掘技术的无限潜能,携手迈向数字化新征程!


文章目录

    • 摘要
    • 描述
    • 题解答案(核心思路)
      • 关键策略
      • 为什么是按右边界排序?
    • 题解代码(Swift 可运行 Demo)
    • 题解代码分析
      • 1. 排序是整个解法的灵魂
      • 2. 为什么初始箭数是 1?
      • 3. 核心判断逻辑
      • 4. 为什么不用管 y 坐标?
    • 示例测试及结果
      • 示例 1
      • 示例 2
      • 示例 3
    • 实际场景结合
    • 时间复杂度
    • 空间复杂度
    • 总结

摘要

这道题是一个非常经典、也非常容易被「想复杂」的题。

表面上看:

  • 有一堆区间
  • 要用最少的点去覆盖所有区间

本质上:

  • 这是一个标准的区间贪心问题
  • 而且是「按右边界排序」这一类的代表题

如果你以后在项目里遇到:

  • 时间段资源复用
  • 区间合并
  • 最少触发次数、最少请求次数

那这道题的思路,基本可以原封不动地搬过去用。

描述

题目给了一个二维数组points

points[i] = [xstart, xend]

表示一个气球在 x 轴上的覆盖范围。

规则是:

  • 你可以在任意一个x位置射箭
  • 如果xstart ≤ x ≤ xend,这个气球就会被引爆
  • 一支箭可以引爆多个气球
  • 箭的数量没有限制
  • 要求:用最少的箭,引爆所有气球

题解答案(核心思路)

这道题的正确打开方式只有一句话:

尽量用一支箭,覆盖尽可能多的气球。

怎么做到?

关键策略

  1. 按气球的右边界排序

  2. 第一支箭,射在第一个气球的xend

  3. 后面的气球:

    • 如果它的xstart <= 当前箭的位置,说明能一起引爆
    • 否则,必须再射一支箭

为什么是按右边界排序?

因为:

  • 右边界越靠左,能“兼容”的区间越少
  • 优先处理这些区间,能保证后面的选择空间最大

这是贪心算法里非常典型的一种「局部最优保证全局最优」的场景。

题解代码(Swift 可运行 Demo)

classSolution{funcfindMinArrowShots(_points:[[Int]])->Int{ifpoints.isEmpty{return0}// 1. 按右边界排序letsortedPoints=points.sorted{$0[1]<$1[1]}// 2. 至少需要一支箭vararrows=1// 当前箭射在的位置varcurrentEnd=sortedPoints[0][1]// 3. 遍历剩余气球foriin1..<sortedPoints.count{letstart=sortedPoints[i][0]// 如果当前气球和当前箭没有重叠ifstart>currentEnd{arrows+=1currentEnd=sortedPoints[i][1]}}returnarrows}}

题解代码分析

1. 排序是整个解法的灵魂

letsortedPoints=points.sorted{$0[1]<$1[1]}

我们只关心一件事:

  • 谁先「结束」

因为:

  • 箭射在xend,是当前能兼容最多气球的位置

2. 为什么初始箭数是 1?

vararrows=1varcurrentEnd=sortedPoints[0][1]

只要有气球,就至少需要一支箭。
第一支箭直接射在第一个气球的右边界,这是当前最优选择。

3. 核心判断逻辑

ifstart>currentEnd{arrows+=1currentEnd=sortedPoints[i][1]}

这句判断非常重要:

  • start <= currentEnd

    • 当前箭还能打到这个气球
  • start > currentEnd

    • 无论怎么射,都得新来一支箭

4. 为什么不用管 y 坐标?

题目已经帮我们简化了问题:

  • 箭是「完全垂直」射出
  • y 坐标不影响是否命中

所以这是一个纯一维区间问题。

示例测试及结果

示例 1

letsolution=Solution()letpoints1=[[10,16],[2,8],[1,6],[7,12]]print(solution.findMinArrowShots(points1))

输出:

2

示例 2

letpoints2=[[1,2],[3,4],[5,6],[7,8]]print(solution.findMinArrowShots(points2))

输出:

4

每个区间都不重叠,只能一箭一个。

示例 3

letpoints3=[[1,2],[2,3],[3,4],[4,5]]print(solution.findMinArrowShots(points3))

输出:

2

边界相接是可以共用一支箭的。

实际场景结合

这个模型在真实项目里非常常见,比如:

  • 批量任务调度

    • 一次任务可以覆盖多个时间窗口
  • 接口请求合并

    • 尽量用一次请求,覆盖多个需求
  • 资源释放策略

    • 用最少的操作,释放最多的资源

只要你看到:

  • 区间
  • 覆盖
  • 最少次数

第一反应就应该是:
是不是可以排序 + 贪心?

时间复杂度

  • 排序:O(n log n)
  • 单次遍历:O(n)

总体时间复杂度:

O(n log n)

这是这类问题的最优解法级别。

空间复杂度

  • 排序使用额外数组:O(n)
  • 其他变量常量级

空间复杂度:

O(n)

总结

LeetCode 452 是一道:

  • 非常经典的贪心题
  • 非常适合用来建立「区间问题直觉」
  • 面试和实际开发都很常见的模型题
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/16 14:40:22

28、Windows Media Player使用指南:音乐、视频播放与光盘操作全解析

Windows Media Player使用指南:音乐、视频播放与光盘操作全解析 1. 播放播放列表中的音乐文件 Windows Media Player能播放多种类型的数字音乐文件。当你让它播放某首歌曲或专辑时,它会立即将其添加到“正在播放”列表中,该列表中的项目会按顺序依次播放。 2. Windows隐私…

作者头像 李华
网站建设 2026/5/11 20:49:13

31、Windows使用问题及解决办法全攻略

Windows使用问题及解决办法全攻略 1. 网络与备份相关 如果你连接到网络,可能需要告知Windows你使用的是家庭网络还是公共网络。若已将硬盘完全清空,可以使用File History备份来恢复曾经存于“文档”“音乐”“图片”和“视频”文件夹中的文件。 File History是Windows的备…

作者头像 李华
网站建设 2026/5/12 5:40:38

35、平板电脑和笔记本电脑的实用指南

平板电脑和笔记本电脑的实用指南 笔记本设置调整 电源选项设置 - 从桌面右键单击“开始”按钮,在弹出菜单中选择“电源选项”。 - 在“电源选项”窗口的左窗格中,点击“选择关闭盖子的功能”。 通常,Windows 为笔记本电脑提供三种关闭盖子的选项,无论电脑是插电还是使…

作者头像 李华
网站建设 2026/4/27 15:19:59

本地私有知识库新选择:访答软件真实体验分享

本地私有知识库新选择&#xff1a;访答软件真实体验分享 为什么选择本地私有知识库 在信息爆炸的时代&#xff0c;高效管理个人知识变得愈发重要。与云端知识库不同&#xff0c;本地私有知识库将数据完全存储在个人设备上&#xff0c;既保障了隐私安全&#xff0c;又避免了网络…

作者头像 李华
网站建设 2026/5/11 12:45:00

合肥工业大学团队首创TIMAR:3D虚拟人实现真实对话交互

这项由合肥工业大学陈俊杰团队主导&#xff0c;联合中国科学技术大学、上海交通大学、中国电信人工智能研究院、西北工业大学、阿联酋大学和安徽理工大学等多家机构合作完成的研究&#xff0c;于2024年12月发表在arXiv预印本平台&#xff08;论文编号&#xff1a;arXiv:2512.15…

作者头像 李华
网站建设 2026/5/16 18:51:45

维也纳大学团队破解超双曲几何在强化学习中的训练难题

在人工智能的世界里&#xff0c;有一个一直困扰研究者们的问题&#xff1a;如何让机器像人类一样理解事物之间的层次关系&#xff1f;当你下棋时&#xff0c;每一步棋都会开启无数种可能的未来&#xff0c;这些可能性像树枝一样层层分叉。传统的AI系统在处理这种树状结构时就像…

作者头像 李华