LeetCode每日一题2022/7/22

757.设置交集大小至少为2
在这里插入图片描述
本题利用贪心算法解决
1、对给出的intervals进行排序,按照intervals[0]升序,intervals[1]降序排列。例如
intervals =[[1, 2], [2, 5], [2, 4], [2, 3]],排序后intervals =[[1, 2], [2, 5], [2, 4], [2, 3]]。
2、从后往前遍历数组。经过排序后的数组在[0]维相同时,后面的区间在前一个的区间内,所以取cur=intervals[-1][0],next=cur+1。在上例中取cur=2,next=3则区间[cur,next]同时属于区间[2, 5], [2, 4], [2, 3]
3、判断上一个的区间[x,y]情况
(1)y<cur时两个区间无交集,令cur=x,next=x+1
(2)y>=next时有交集,cur和next保持不变
(3)cur<=y<next时,令next=cur,cur=x

class Solution:
    def intersectionSizeTwo(self, intervals: List[List[int]]) -> int:
        if not intervals:
            return 0
        intervals.sort(key = lambda x:(x[0], -x[1])) 
        ans = 2
        cur, next = intervals[-1][0], intervals[-1][0]+1
        for x, y in reversed(intervals[:-1]):
            if y>=next:
                continue
            elif y<cur:
                cur = x
                next = x+1
                ans+=2
            elif cur<=y<next:
                next = cur
                cur = x
                ans+=1
        return ans

以后的每日一题发布到知乎专栏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值