Leetcode题库56. 合并区间(python实现)

文章目录

思路

举例:
[[1, 9], [2, 5], [19, 20], [10, 11], [12, 20], [0, 3], [0, 1], [0, 2]]
根据第一个元素进行升序排列
ls1 = [[5, 0, 3], [6, 0, 1], [7, 0, 2], [0, 1, 9], [1, 2, 5], [3, 10, 11], [4, 12, 20], [2, 19, 20]]

根据第二个元素进行升序排列
ls2 = [[6, 0, 1], [7, 0, 2], [5, 0, 3], [1, 2, 5], [0, 1, 9], [3, 10, 11], [2, 19, 20], [4, 12, 20]]

ls1中[5, 0, 3]右边所有元素的第一个元素都比它要小
ls2中[5, 0, 3]左边所有元素的第二个元素都比它的第二个元素要小,左边边所有元素的第一个元素都比它的第一个元素要大,所以ls2中[5, 0, 3]左边所有元素都被包括在[0, 3]中
将ls2中[5, 0, 3]左边所有元素从ls1和ls2中删除,将[5, 0, 3]保存在 t 中然后也从ls1和ls2中删除

删除后:
ls1 = [[0, 1, 9], [1, 2, 5], [3, 10, 11], [4, 12, 20], [2, 19, 20]]
ls2 = [[1, 2, 5], [0, 1, 9], [3, 10, 11], [2, 19, 20], [4, 12, 20]]

ls1中[0, 1, 9]右边所有元素的第一个元素都比它要小
ls2中[0, 1, 9]左边所有元素的第二个元素都比它的第二个元素要小,左边边所有元素的第一个元素都比它的第一个元素要大,所以ls2中[0, 1, 9]左边所有元素都被包括在[1, 9]中
将ls2中[0, 1, 9]左边所有元素从ls1和ls2中删除,将[0, 1, 9]保存在 t 中然后也从ls1和ls2中删除

删除后:
ls1 = [[3, 10, 11], [4, 12, 20], [2, 19, 20]]
ls2 = [[3, 10, 11], [2, 19, 20], [4, 12, 20]]

依次迭代可以得到[3, 10, 11]、[4, 12, 20],保存在 t 中
t = [[5, 0, 3], [0, 1, 9], [3, 10, 11], [4, 12, 20]]
这样得到的 t 能保证 t 中前后两元素不存在包含关系

遍历t,若前一个元素的第二个元素大于后一个元素第一个元素则将两者融合
最后得到结果

代码

class Solution:
    def merge(self, intervals: List[List[int]]) -> List[List[int]]:
        flag=0
        for i in intervals:
            i.insert(0,flag)
            flag=flag+1

        sorted0_intervals = sorted(intervals, key = lambda x:x[1])
        sorted1_intervals = sorted(intervals, key = lambda x:x[2])
        print(sorted0_intervals)
        t = []
        i = 0
        while i < len(sorted0_intervals):
            t.append(sorted0_intervals[i])
            for j in range(len(sorted0_intervals)-1,-1,-1):
                if sorted0_intervals[i] == sorted1_intervals[j]:
                    i = j + 1
                    break
        i = 0
        while i < len(t)-1:
            if t[i][2] >= t[i+1][1]:
                t[i+1][1] = t[i][1]
                del t[i]
            else:
                i = i + 1
        
        ret = []
        for i in t:
            ret.append([i[1],i[2]])

        return ret

#字典数据类型降低搜索时间
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值