leetcode452,435,56

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值