Leetcode 56.合并区间 Python实现

在这里插入图片描述
这道题只要能发现一个规律就能做出来:如果列表中每一个子列表的第一个元素是升序的,那么只要前一个子列表的第二位元素比后一个子列表的第一位元素大,就可以将这两个子列表(区间)进行合并,举个例子,如果[1,3]和[2,6],这两个区间的第一位分别是1和2满足升序,那么[1,3]中第二位元素3>[2,6]中第一位元素,即可以将这两个区间合并为[1,6]
那么我们应该怎么实现呢?难道要遍历intervals数组的同时在内部不断合并吗?这样也太麻烦了,何不构建一个列表merge,在遍历intervals的同时将此时的子列表与merge中合并的区间列表不断比较,生成最终结果呢
实现过程:

class Solution:
    def merge(self, intervals: List[List[int]]) -> List[List[int]]:
        # 用数组merged存储最终的答案,首先,我们将列表中的区间按照左端点升序排序。然后我们将第一个区间加入merged数组中,并按顺序依次考虑之后的每个区间
        # 如果当前区间的左端在在数组merged中最后一个区间的右端点之后,那么他们不会重合,我们可以直接将这个区间加入数组megerd的末尾
        # 否则,它们重合,我们需要用当前区间的右端点更新数组merged中最后一个区间的右端点,将其置为二者的较大值。
        # 不用考虑两个区间的左端点了,因为已经按顺序排列了
    	merge = []
    	intervals.sort(key=lambda x:x[0])
    	for interval in intervals:
    		# 如果列表为空,或者当前区间与上一区间不重合,则直接添加
    		if not merge or merge[-1][1]<interval[0]:
    			merge.append(interval)
   		    # 否则,我们可以与上一区间进行合并,只要合并的时候我们已经确定好了下限(第一维),只要确定上限(第二位)就好了
    		else:
    			merge[-1][1]= max(merge[-1][1],interval[1])
    	return merge
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值