如何用最少的箭射爆一排气球:贪心算法与哈希计数解法
发布时间 - 2026-01-23 00:00:00 点击率:次本文介绍解决“baloni”问题的核心思路——通过哈希表动态维护各高度剩余未匹配气球数量,利用“高度差为1”的连续性特征实现贪心匹配,时间复杂度 o(n),空间复杂度 o(n),正确高效地求出最少箭数。
该问题的本质是:每支箭从左向右水平射出,初始高度为某值 h,每击中一个气球后高度自动减 1;因此一支箭能击中的气球序列,其高度必须严格构成一个递减连续整数序列(如 5→4→3→2→1),且在原数组中按从左到右顺序出现。
关键观察在于:一支箭的路径等价于一条“高度递减链”。若某个气球高度为 h,它要么作为某条链的起点(需新增一支箭),要么恰好接在某个已存在的、高度为 h+1 的气球之后(即被同一支箭续上)。因此,我们应尽可能“复用”已有箭——每当遇到高度为 h 的气球时,优先尝试将其链接到尚未被消耗的、高度为 h+1 的气球之后。
这自然引出贪心策略:
- 从左到右遍历每个气球;
- 对当前气球高度 h,检查是否还有未匹配的 h+1 高度气球(即之前出现过、但尚未被后续气球接续的);
- 若有,则消耗一个 h+1 气球(表示该箭延续至此),不新增箭;
- 无论是否匹配成功,当前气球 h 都成为一条潜在新链的起点,因此需计入 h 高度的待匹配计数中。
实现上,我们使用字典 d 记录各高度当前“待被接续”的气球数量(即作为某支箭中间节点或起点的候选)。遍历时:
- 若 d[h + 1] > 0,说明存在可延续的箭,执行 d[h + 1] -= 1;
- 然后 d[h] += 1,将当前气球加入待匹配池。
最终,字典中所有剩余计数值之和,即为必须作为“链起点”的气球数——也就是所需的最少箭数。
以下是完整、可直接提交的 Python 实现:
def min_arrows(balloons):
# d[height] 表示当前有多少个高度为 height 的气球可作为箭的起点或中间节点
d = {}
for h in balloons:
# 尝试将当前气球 h 接在高度为 h+1 的气球之后(复用已有箭)
if d.get(h + 1, 0) > 0:
d[h + 1] -= 1
# 当前气球 h 成为新的潜在起点(或新链首)
d[h] = d.get(h, 0) + 1
return sum(d.values())
# 主程序
n = int(
input().strip())
balloons = list(map(int, input().split()))
print(min_arrows(balloons))✅ 正确性验证:以 [2, 1, 5, 4, 3] 为例 h=2:d{2:1} → 箭数暂计 1 h=1:发现 d[2]>0,消耗一个 2 → d{2:0, 1:1} h=5:d{2:0, 1:1, 5:1} h=4:d[5]>0,消耗 5 → d{2:0, 1:1, 5:0, 4:1} h=3:d[4]>0,消耗 4 → d{2:0, 1:1, 5:0, 4:0, 3:1} 最终 sum = 1 + 1 = 2,符合预期。
⚠️ 常见误区提醒:
- ❌ 不可排序原数组——顺序决定能否形成合法链;
- ❌ 不可原地修改输入——会破坏高度关系与遍历逻辑;
- ❌ 不可无条件累加箭数——必须基于“能否接续”做条件判断。
该解法简洁、高效、符合直觉,是处理此类“递减链覆盖”问题的经典范式。
# python
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解
详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南
如何在建站之星网店版论坛获取技术支持?
手机软键盘弹出时影响布局的解决方法
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
Laravel如何构建RESTful API_Laravel标准化API接口开发指南
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
php打包exe后无法访问网络共享_共享权限设置方法【教程】
图册素材网站设计制作软件,图册的导出方式有几种?
JavaScript如何实现继承_有哪些常用方法
PHP正则匹配日期和时间(时间戳转换)的实例代码
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
如何为不同团队 ID 动态生成多个非值班状态按钮
网站页面设计需要考虑到这些问题
简历在线制作网站免费版,如何创建个人简历?
Laravel怎么使用artisan命令缓存配置和视图
米侠浏览器网页背景异常怎么办 米侠显示修复
高端建站三要素:定制模板、企业官网与响应式设计优化
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
Laravel如何实现本地化和多语言支持?(i18n教程)
ChatGPT 4.0官网入口地址 ChatGPT在线体验官网
Internet Explorer官网直接进入 IE浏览器在线体验版网址
深入理解Android中的xmlns:tools属性
如何基于PHP生成高效IDC网络公司建站源码?
悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤
微信小程序 scroll-view组件实现列表页实例代码
七夕网站制作视频,七夕大促活动怎么报名?
音乐网站服务器如何优化API响应速度?
如何选择可靠的免备案建站服务器?
Laravel项目怎么部署到Linux_Laravel Nginx配置详解
Windows Hello人脸识别突然无法使用
Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询
JavaScript如何实现音频处理_Web Audio API如何工作?
如何在腾讯云服务器快速搭建个人网站?
Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面
免费网站制作appp,免费制作app哪个平台好?
Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤
如何用已有域名快速搭建网站?
Laravel如何实现文件上传和存储?(本地与S3配置)
详解jQuery中的事件
Claude怎样写结构化提示词_Claude结构化提示词写法【教程】
Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤
如何使用 jQuery 正确渲染 Instagram 风格的标签列表
如何在阿里云购买域名并搭建网站?
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
制作电商网页,电商供应链怎么做?
Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】
javascript基本数据类型及类型检测常用方法小结
深圳网站制作培训,深圳哪些招聘网站比较好?


