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