class Solution:
def findMinArrowShots(self, points: List[List[int]]) -> int:
if not points:
return 0
points.sort()
#合并区间
i=1
res = [points[0],]
for point in points:
if point[0]>res[-1][-1]:
res.append(point)
else:
res[-1] = point[0],min(res[-1][-1],point[1])
return len(res)
while i<len(points):
(l,r),(l1,r1) = points[i-1],points[i]
if l1<=r:
#更新新的区间,弹出下个区间
points[i-1] = l1,min(r,r1)
points.pop(i)
else:
i+=1
return len(points)
分析:
- 理解题目本身不是困难的,用最少数量的火箭引爆气球,那也就是让区间尽可能的少就可以了,如果区间够少,那么引爆的气球的箭自然而然也更少了
- 看到题目提示是贪心算法,基本就想到了区间的合并,不过这个题目的区间合并和之前的区间合并稍微有点不一样
- 但是基本功就是区间的合并操作
做题:
- 声明一个空列表,存放合并后的区间
- 对数组进行升序排序,根据区间左边的大小
- 将数字第一对区间放到res中,从第二个区间开始去遍历points
- 操作基本和合并区间一模一样,不过再更新合并后区间的最后一个区间的时候需要注意
- 最后一个区间的左端点是待比较的右端点,最后一个区间的右端点是待比较的右端点和最后一个区间的右端点,取它们两者的最小值即可
总结:区间合并的一个变形,求两个区间的交集。