题目解析:
先对若干个区间排序,那么所有区间的起始值必然是从小到大的,而只要保证当前每一步的结束值是最大的就行了。这时候就要用到贪心算法,依次遍历每一个区间,当前一时刻的结束值大于等于当前区间的起始值时,则比较前一时刻的结束值与当前区间的结束值,保存最大的结束值,并标记从这一区间开始已经重叠了,而当前一时刻的结束值小于当前区间的起始值时,则根据是否重叠区间,将前一时刻的起始值和结束值保存下来。
class Solution(object):
def merge(self, intervals):
"""
:type intervals: List[List[int]]
:rtype: List[List[int]]
"""
flag = 0
intervals.append([100000, 100000]) # 因为是从下标1开始,需添加一个很大的区间,这样就省去了边界条件
intervals.sort() # 排序,使得区间的起始值递增,则只需记录结束值
L = []
end = intervals[0][1] # 记下第一个区间的结束值
for i in range(1, len(intervals)):
if end >= intervals[i][0]: # 如果上一时刻与当前区间有重叠,(注意这里的上一时刻指的是当前区间前面的所有区间,则记下上一时刻的起始值(最开始产生重叠的起始值)),则保存当前区间的结束值与上一时刻的结束值最大的那一个
if flag == 0: # 标记是否产生重叠
start = intervals[i-1][0]
flag = 1
end = max(end, intervals[i][1])
else: # 上一时刻与当前时刻并未产生重叠
if flag == 0: # 并且之前也并未重叠,则直接保存上一区间
start, end = intervals[i-1][0], intervals[i-1][1]
L.append([start, end])
else: # 之前发生了重叠,保存最终重叠区间
L.append([start, end])
flag = 0
end = intervals[i][1] # 结束值从当前区间重新开始
return L