如何用最少箭数击破一排高度各异的气球:贪心 + 哈希计数解法
技术百科
花韻仙語
发布时间:2026-01-23
浏览: 次 本文介绍解决“baloni”问题的最优算法——通过哈希表维护各高度剩余气球数,对每个气球尝试复用前一高度(+1)的箭路径,从而最小化新增箭数。时间复杂度 o(n),无需排序或修改原数组。
该问题本质是求最少箭数,使得每支箭从左向右水平射出,初始高度为某整数 h,每击破一个气球后高度自动减 1(即下一支被击中的气球必须恰好位于高度 h−1)。因此,一支箭能连续击破的气球序列必须满足:从某个位置开始,其高度严格递减 1(如 5→4→3→2→1),且在数组中保持原有从左到右的相对顺序。
关键洞察在于:一支箭的轨迹可视为一条“高度递减链”,而每个气球只能被一条链覆盖;要最小化箭数,就应尽可能延长已有链,而非频繁新建。这提示我们采用贪心策略:对每个气球 h,优先尝试将其接续到一条“当前末端高度为 h+1”的箭链上(因为该链下一次可下降至 h);若不存在这样的链,则必须发射一支新箭,以 h 为起始高度开启新链。
实现时无需显式构建链,只需用哈希表 d 记录「当前有多少条箭链的末端高度恰好为 key」。遍历每个气球高度 h 时:
- 若 d[h + 1] > 0,说明存在一条末端在 h+1 的链,可延伸至此气球 → 将 d[h + 1] 减 1,并将 d[h] 加 1(链末端更新为 h);
- 否则,必须新增一支箭 → d[h] += 1。
最终,sum(d.values()) 即为所有未被接续、仍处于活跃状态的箭链数量,也就是最小箭数。
以下是完整可运行代码:
def min_arrows(balloons):
from collections import defaultdict
d = defaultdict(int) # d[h] = 当前末端高度为 h 的箭链数量
for h in balloons:
if d[h + 1] > 0:
d[h + 1] -= 1
d[h] += 1
return sum(d.values())
# 示例验证
print(min_arrows([2, 1, 5, 4, 3])) # 输出: 2
print(min_arrows([5, 4, 3, 2, 1])) # 输出: 1
print(min_arrows([1, 2, 3, 4, 5])) # 输出: 5注意事项:
- 绝对不要对输入数组排序(如原始错误代码),否则破坏左右顺序约束,导致逻辑失效;
- 不应原地修改 balloons 数组,所有状态应由辅助数据结构(如 defaultdi
ct)独立维护;
- 使用 defaultdict(int) 可避免手动检查键是否存在,提升代码简洁性与鲁棒性;
- 该算法时间复杂度为 O(n),空间复杂度为 O(H),其中 H 是不同高度的数量,实际中非常高效。
此解法已通过 Kattis 平台全部测试用例,是解决 Baloni 问题的标准贪心范式。
# 将其
# 有多少
# 一支
# 已有
# 不应
# 要对
# 并将
# 数据结构
# int
# 算法
# 遍历
# 绝对不
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- mac怎么退出id_MAC退出iCloud账号与A
- c++如何实现一个高性能的环形队列(Ring Bu
- Python异步网络编程_aiohttp说明【指导
- Win11怎么设置屏保时间_调整Win11屏幕保护
- c# Task.Yield 的作用是什么 它和Ta
- php订单日志怎么在swoole写_php协程sw
- Windows10系统怎么查看显卡驱动_Win10
- C#如何使用XPathNavigator高效查询X
- Python生成器表达式内存优化_惰性计算说明【指
- 如何在 Go 项目开发中正确处理本地包导入与远程模
- php删除数据怎么清空表_truncate与del
- Python迭代器生成器进阶教程_节省内存与懒加载
- Win11怎么把图标拖到任务栏_Win11固定应用
- Win11笔记本怎么看电池健康度_Win11电池报
- Win11怎么关闭自动调节亮度 Win11禁用内容
- Windows10系统怎么查看防火墙状态_Win1
- Win11怎么设置桌面图标间距_Windows11
- Win10闹钟铃声怎么自定义 Win10闹钟自定义
- Win11怎么关闭自动维护 Win11禁用系统自动
- 如何提升Golang JSON序列化性能_Gola
- 如何使用Golang template生成文本模板
- c++的mutex和lock_guard如何使用
- Win11怎么连接投影仪_Win11多显示器投屏设
- Windows10如何更改日期格式_Win10区域
- Win11怎么更改任务栏颜色_Windows11个
- Win11怎么关闭专注助手 Win11关闭免打扰模
- Ajax提交表单PHP怎么接收_处理Ajax发送的
- Python数据挖掘核心算法实践_聚类分类与特征工
- 企业SEO优化选择网站建设模板的技巧
- Python异步编程高级项目教程_asyncio协
- php本地部署后数据库连接报错_1045acces
- Win11怎么关闭定位服务 Win11禁止应用获取
- win11如何清理传递优化文件 Win11为C盘瘦
- php控制舵机角度怎么调_php发送pwm信号控制
- Windows10电脑怎么设置虚拟光驱_Win10
- Windows家庭版如何开启组策略(gpedit.
- MySQL 中使用 IF 和 CASE 实现查询字
- PHP 中如何在函数内持久修改引用变量所指向的目标
- Windows10电脑怎么设置文件权限_Win10
- Win11怎么设置系统还原_Windows11系统
- Win11怎么设置默认浏览器Chrome_Wind
- mac本地php环境如何开启curl_curl扩展
- MAC的“接续互通”功能无法使用怎么办_MAC检查
- C++ static_cast和dynamic_c
- 如何在 Python 中将 ISO 8601 时间
- Windows10如何更改鼠标灵敏度_Win10鼠
- Windows10电脑怎么设置虚拟内存_Win10
- 微信企业付款回调PHP怎么接收_处理企业付款异步通
- Python列表推导式与字典推导式教程_简化代码高
- 微信JSAPI支付回调PHP怎么接收_处理JSAP


QQ客服