
这题干也挺长的,但是说了个啥意思呢,我们给它扒拉扒拉,让它原形毕露。
如图
天空中飘着这么多五颜六色的气球,它们的y轴坐标忽略不计,只给出了x轴的起始坐标和结束坐标。现在我要在x轴沿着y轴方向射箭,问最少射出几根箭才能将气球全部扎破。
我们再抽象一下
问题变成了:穿过所有区间,至少需要几根线?
这样的话题目的特性就很明显了,自然而然就想到了排序和贪心。
如果按照结束位置从小到大排序,那么问题就很简单了。
我们将一个气球用箭穿过的时候,从哪里穿才能使得这支箭多穿几个气球呢?
因为是按照结束位置从小到大排序的,所以从一个气球的结束位置穿过,能够保证在穿过本个气球的情况下,能够最多的穿后面的气球。
Python代码
def findMinArrowShots(self, points: List[List[int]]) -> int:n = len(points)if n < 2: # 特判return npoints = sorted(points, key=lambda x: x[1])# count计数, arrow记录当前这根箭的坐标,初始化为第一个气球的结束位置count, arrow = 1, points[0][1]for i in range(1, n):# 如果这根箭能够穿过这个气球if points[i][0] <= arrow and points[i][1] >= arrow:continue# 如果这根箭不能穿过这个气球,那么拿一根新的箭else:arrow = points[i][1]count += 1return count
时间复杂度O(nlogn)
排序算法使用时间O(nlogn)
