题目链接:https://leetcode-cn.com/problems/minimum-number-of-arrows-to-burst-balloons/
难度:中等
描述:
有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points
,其中points[i] = [xstart, xend]
表示水平直径在 xstart
和 xend
之间的气球。你不知道气球的确切 y
坐标。
一支弓箭可以沿着 x
轴从不同点 完全垂直 地射出。在坐标 x
处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend
, 且满足 xstart ≤ x ≤ xend
,则该气球会被 引爆 。可以射出的弓箭的数量 没有限制 。 弓箭一旦被射出之后,可以无限地前进。
给你一个数组 points
,返回引爆所有气球所必须射出的 最小
弓箭数 。
题解
思路:
要想用最少的箭就需要让一支箭尽可能射中更多的气球。
那么我们需要先对数组排序;
若按xstart
来排序的话,可能会发生这种情况:[[0, 4], [0, 1], [2, 3]]
。第一个区间与第三个区间重合,然而第三个区间与第二个区间不重合。
若按照xend
来排序的话,上面的情况就会变成:[[0, 1], [2, 3], [0, 4]]
。我们的箭应尽量靠右,才能射中更多的气球。
class Solution:
def findMinArrowShots(self, points: List[List[int]]) -> int:
points.sort(key=lambda x: x[1])
length = len(points)
idx, count = 0, 0
while idx < length:
array = points[idx][1]
idx += 1
while idx < length and points[idx][0] <= array:
idx += 1
count += 1
return count