LeetCode 56.合并区间(Medium)

给出一个区间的集合,请合并所有重叠的区间。

示例 1:

输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

示例 2:

输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。

这道题把每个区间看做了一个整体,并不能用类似a[0][0]来单独的取出区间的上限或者是下限。因此不能简单的对区间上下限进行比较来获得结果。

 

这里要先对区间的起始值start进行排序,排序用到的是sort()中的key值(不常用所以可能不熟悉)

排序好之后才能进行合并操作,操作分为三种情况:

先对简单的情况进行处理,第一种,就是intervals[i].start > b[-1].end这种情况,说明两区间没有交集,可以之间提取到b中

然后是intervals[i].start <= b[-1].end的情况,这个情况分为第二第三种情况:

第二种情况是有交集,有重叠部分但是不完全包含,也就是intervals[i].end > b[-1].end,这种情况,合并后的区间的end值为两区间end值中的较大数值

第三种情况是包含情况,这个区间完全被包含在b中的一个区间内,合并之后仍是大的那个区间,因此不需要进行操作。

这道题难在,要先排序,再进行合并,合并要考虑到多种情况,将每种情况都分别理解好(一次考虑一种情况,最好先将最简单的情况先提出来,再对另一种情况进行进一步的讨论),问题就变得很简单了。

注意注意!数组问题都需要注意的是输入为[ ]时候的情况

# Definition for an interval.
# class Interval:
#     def __init__(self, s=0, e=0):
#         self.start = s
#         self.end = e

class Solution:
    def merge(self, intervals):
        """
        :type intervals: List[Interval]
        :rtype: List[Interval]
        """
        if len(intervals)==0:
            return []
        intervals.sort(key=lambda x:x.start)
        b=[intervals[0]]
        # b.append(intervals[0])
        for i in range(len(intervals)):
            if intervals[i].start > b[-1].end:
                b.append(intervals[i])
            else:
                if intervals[i].end > b[-1].end:
                    b[-1].end = intervals[i].end
        return b

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值