0

0

如何用最少的箭射爆一排气球:贪心算法与哈希计数解法

聖光之護

聖光之護

发布时间:2026-01-23 14:31:00

|

854人浏览过

|

来源于php中文网

原创

如何用最少的箭射爆一排气球:贪心算法与哈希计数解法

本文介绍解决“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,将当前气球加入待匹配池。

最终,字典中所有剩余计数值之和,即为必须作为“链起点”的气球数——也就是所需的最少箭数。

Sora
Sora

Sora是OpenAI发布的一种文生视频AI大模型,可以根据文本指令创建现实和富有想象力的场景。

下载

以下是完整、可直接提交的 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开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

772

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

661

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

765

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

679

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1385

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

570

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

579

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

730

2023.08.11

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 14.4万人学习

Django 教程
Django 教程

共28课时 | 3.4万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号