Algorithms first

用最少数量的箭引爆气球 · 交互式算法学习

用最少的竖直箭射穿所有气球区间。

#452 · 区间

用最少数量的箭引爆气球

Minimum Number of Arrows to Burst Balloons

测试用例points = [[10,16],[2,8],[1,6],[7,12]]
区间轴3 个关键状态
步骤 1按右端点排序,第一箭射在 6。pos=6,arrows=1
1–6
2–8
7–12
10–16
推荐

按结束点贪心射箭

时间 O(n log n)空间 O(1)

每支箭射在当前最早结束点,可覆盖尽可能多的后续气球。

1function findMinArrowShots(a) {2  a.sort((x, y) => x[1] - y[1]);3  let arrows = 0,4    pos = -Infinity;5  for (const [l, r] of a)6    if (l > pos) {7      arrows++;8      pos = r;9    } return arrows;10}
多语言参考

Java · C++ · Go

来源 · CC BY-SA 4.0 ↗

这是一组同题正确实现,独立于上方当前动画方法;不同语言可能采用另一种正确策略。

1class Solution {2    public int findMinArrowShots(int[][] points) {3        // 直接 a[1] - b[1] 可能会溢出4        Arrays.sort(points, Comparator.comparingInt(a -> a[1]));5        int ans = 0;6        long last = -(1L << 60);7        for (var p : points) {8            int a = p[0], b = p[1];9            if (a > last) {10                ++ans;11                last = b;12            }13        }14        return ans;15    }16}
交互式算法学习

从执行步骤真正理解 LeetCode 经典 150

本站整理 150 道高频算法面试题和 302 种解法。动画方法同步展示 JavaScript 与 Python;每题另提供 Java、C++ 与 Go 同题参考实现。

多形态可视化数组、矩阵、DP 表、递归树、树图、链表、栈队列堆、区间和状态机按解法选择。
动画与代码同步当前状态、步骤说明、变量和代码高亮保持一一对应,可逐步播放和回退。
适合面试复习每种方案都给出思路、时间复杂度、空间复杂度、测试用例和 LeetCode 中文原题入口。
AlgoViz Lab

用最少数量的箭引爆气球 · 解法对比

用最少的竖直箭射穿所有气球区间。

测试用例
points = [[10,16],[2,8],[1,6],[7,12]]
题目分类
区间
解法对比
2
方案 1

按起点维护交集

排序后维护当前可共同射中的交集,交集为空时增加一箭。

时间
O(n log n)
空间
O(1)
方案 2

按结束点贪心射箭

每支箭射在当前最早结束点,可覆盖尽可能多的后续气球。

时间
O(n log n)
空间
O(1)