给出一个区间的集合,请合并所有重叠的区间。
示例 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