class Solution:
def findMinArrowShots(self, points: List[List[int]]) -> int:
if len(points)==0:
return 0
points.sort(key=lambda x:x[0])#和根据身高还有分发糖果一个类型,先按照第一个元素排序。
res=1#最少也需要一次才可以全部引爆。
for i in range(1,len(points)):
if points[i][0]>points[i-1][1]:#如果气球2的开头比气球1的结尾还要大,一根箭是无法同时引爆的。
res+=1
else:#如果不是上述情况,我们需要判断一下第二个气球和第三个气球他们是不是也符合。因此我们需要
# 更新前两个重叠气球的最小右边界。然后判断这个右边界和第三个气球的左边界是否重叠。
points[i][1]=min(points[i][1],points[i-1][1])
return res
class Solution:
def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
if len(intervals)==0:
return 0
intervals.sort(key=lambda x:(x[0],x[1]))
res=0
for i in range(1,len(intervals)):
if intervals[i][0]<intervals[i-1][1]:
res+=1
intervals[i][1]=min(intervals[i-1][1],intervals[i][1])
return res
'''与452引爆气球差不多,自己写的。'''
56.
class Solution:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
if len(intervals)==1:
return intervals
intervals.sort(key=lambda x:x[0])#排序
res=[intervals[0]]#用来储存最后的结果.这一步要放在排序之后。
for i in range(1,len(intervals)):
last = res[-1]#用来记录上一个已经处理完,或者不需要处理的区间
if intervals[i][0]<=last[1]:#如果当前区间与上一个区间有重复
res[-1]=[last[0],max(intervals[i][1],last[1])]
#我们需要合并两个区间,合并后的区间的起始肯定是last[0],终止则取last和当前区间右端点较大的那一个。
else:#如果当前区间与上一个区间没有重复的地方,直接添加进res
res.append(intervals[i])
return res