给出一个区间的集合,请合并所有重叠的区间。
示例 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] 可被视为重叠区间。
首先要做的是根据节点的start和end对节点进行从小到大的排序。
这题目其实很简单,用双指针就可以解决,i,j永远指向intervals中还没处理完的的节点。
分为三种情况。
情况1 intervals[i].start < intervals[j].start。说明两个节点的区间没有交叉,所以把intervals[i]添加到结果中去。
情况2 intervals[i].end <= intervals[j].end。说明两个节点的区间有交叉,并且,节点j并没有被包含。
情况3 intervals[i].end > intervals[j].end。说明,节点j的区间被节点i的区间所包含。
class Solution:
def merge(self, intervals):
"""
:type intervals: List[Interval]
:rtype: List[Interval]
"""
if len(intervals) < 2:
return intervals
intervals.sort(key=lambda ele: (ele.start, ele.end))
print(intervals)
i, j = 0, 1
res = []
while j < len(intervals):
# 终点小于起点
if intervals[i].end < intervals[j].start:
res.append(intervals[i])
i, j = j, j+1
# 终点小于终点
elif intervals[i].end < intervals[j].end:
intervals[j].start = intervals[i].start
intervals[j].end = intervals[j].end
i, j = j, j+1
# 终点大于终点
else:
intervals[j] = intervals[i]
j = j + 1
res.append(intervals[-1])
return res