题目描述:以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
示例 1:
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。
思路:
首先我们根据区间的起点做了一个排序,起点小的靠前,起点大的靠后;
其次我们根据前一个区间的终点和后一个区间的起点是否有重合,判断区间是否可以合并;
最后,合并后的区间起点一定是靠前的那个区间的起点,终点是两个区间中终点更大的那个;
从两个区间的合并过程中我们可以看出,合并区间:
根据区间起点排序;
维护一个当前合并的区间[start, end]
判断当前区间是否可以合并到当前的合并区间;可以则更新合并区间的终点,不可以这个区间作为新的一个合并区间去合并后面的区间。
python:
如果我们每次判断当前区间是否可以合并到当前的合并区间,那么最后一个区间无论是加入到原有的合并区间还是自己作为一个新的区间,最后一个合并区间都没有加入到结果列表中。因此,最后遍历完所有区间,要把当前的合并区间加入结果列表中。
class Solution:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
# 对区间进行升序排序
intervals.sort()
# 初始化合并区间为首个区间
start,end=intervals[0]
# 结果列表
res=[]
for (s,e) in intervals:
# 判断每一个区间能否加入当前合并区间
if s>end:
# 当前区间不能加入当前的合并区间,记录当前合并区间,以此区间作为新的合并区间
res.append([start,end])
start,end=s,e
else:
# 当前区间加入当前的合并区间,更新合并区间的终点
end=max(end,e)
# 补充加入最后一个合并区间
res.append([start,end])
return res