题目
有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points ,其中points[i] = [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足 xstart ≤ x ≤ xend,则该气球会被引爆。可以射出的弓箭的数量 没有限制 。 弓箭一旦被射出之后,可以无限地前进。给你一个数组 points ,返回引爆所有气球所必须射出的最小弓箭数 。
例:
输入:points = [[10,16],[2,8],[1,6],[7,12]]
输出:2
解释:气球可以用2支箭来爆破:
在x = 6处射出箭,击破气球[2,8]和[1,6]。
在x = 11处发射箭,击破气球[10,16]和[7,12]。
方法:贪心算法
为了实现用最小弓箭数射击气球,那么一只箭应尽可能多的引爆气球
- 若没有气球,那么不需要射击,则最小弓箭数为零
- count 表示需要射出的最小弓箭数,起始值为 1。由于已经排除了无气球的情况,那么在有气球的情况下,弓箭数一定是大于等于 1 的
- 按照 xstart 对气球进行从大到小的排序
- 循环遍历,起始值为 1,因为至少射出一直箭,想要判断是否需要增加箭的数量那么需要判断第二个气球和第一个气球的参数。存在 xstart 大小相邻的两个气球,若第二个气球的 xstart 大于第一个气球的 xend,那么两个气球并未重叠,则弓箭数加一;否则,更新两个气球的最大重叠位置至第二个气球的 xend,那么此时第二个气球的 xstart 和 xend 即为目前两个气球的最大重叠部分
class Solution(object):
def findMinArrowShots(self, points):
if len(points) == 0:
return 0
count = 1
points.sort(key = lambda x:x[0])
for i in range(1, len(points)):
if points[i][0] > points[i-1][1]:
count += 1
else:
points[i][1] = min(points[i][1], points[i-1][1])
return count