LC 452贪心中等第 70 / 95 题

用最少数量的箭引爆气球

Minimum Number of Arrows to Burst Balloons

贪心区间交集
本机进度仅保存在当前浏览器

题目描述

在一个二维空间中有许多气球,每个气球用水平直径的坐标 [start, end] 表示。一支垂直射出的箭可以引爆所有与射线相交的气球(端点相触算相交)。求引爆所有气球所需的最少弓箭数。

示例:points = [[10, 16], [2, 8], [1, 6], [7, 12]],输出 2。

解题思路

  1. 一支箭能引爆的气球集合 = 与某条竖线都相交的气球 = 一组"有公共交集"的区间。
  2. 按左端点排序后扫描,维护当前箭的公共交集右端 limit(各区间右端点的最小值)。
  3. 新气球左端 > limit 时交集断裂,需要新箭;否则 limit 收缩为 min(limit, 当前右端)。

参考实现

查看参考实现Python · 建议先自行作答
def findMinArrowShots(points):
    points.sort(key=lambda x: x[0])
    arrows = 1
    limit = points[0][1]
    for start, end in points[1:]:
        if start > limit:
            arrows += 1
            limit = end
        else:
            limit = min(limit, end)
    return arrows

复杂度与归属

时间复杂度O(n log n)
空间复杂度O(log n)
所属分类贪心
题源LeetCode 452

关联教程

返回题图鉴