来自北大算法课的Leetcode题解:56. 合并区间

本文介绍了两种解决区间合并问题的方法。解法1是先按左端点排序,使用栈进行合并,确保没有重叠。解法2是通过填充布尔数组,然后扫描得到合并后的区间。代码实现中给出了具体的Python类Solution的merge方法。注意,区间[1,2][3,4]不应合并为[1,4],需要保持间隔。

代码仓库Github | Leetcode solutions @doubleZ0108 from Peking University.

  • 解法1(T76% S64%): 先按照左端点排序,然后一次遍历进行合并,用一个结果栈,栈顶始终是等待跟下个合并的状态,如果当前的左端点比栈顶右端点小则二者可以合并,注意合并时左端点不一定谁小、右端点不一定谁大,直接通过min和max选取即可
    • 注意可能连续合并
  • 解法2: 直接开一个1~10000的bool数组,按照intervals一个一个填进去,最后扫描一遍就可以
    • 有个问题 [1,2] [3,4]是不应该合并成[1,4]的,可以将其变为[2,4][6,8]就有间隔了,最后再除个2就可以了
class Solution(object):
    def merge(self, intervals):
        """
        :type intervals: List[List[int]]
        :rtype: List[List[int]]
        """
        if len(intervals) < 2:
            return intervals
        
        intervals.sort(key=lambda x: x[0])
        ans = [intervals[0]]
        for i in range(1, len(intervals)):
            if intervals[i][0] <= ans[-1][-1]:
                ans[-1] = [min(intervals[i][0], ans[-1][0]), max(intervals[i][1], ans[-1][1])]
            else:
                ans.append(intervals[i])
        return 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

doubleZ0108

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值