以数组 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] 可被视为重叠区间。
示例 3:
输入:intervals = [[4,7],[1,4]]
输出:[[1,7]]
解释:区间 [1,4] 和 [4,7] 可被视为重叠区间。
提示:
1 <= intervals.length <=intervals[i].length == 20 <= starti <= endi <=
解题思路
- 特殊情况处理:若输入区间列表为空,直接返回空列表。
- 排序区间 :按每个区间的起始值 升序排序(例如示例 3 的
[[4,7],[1,4]]排序后变为[[1,4],[4,7]]),确保后续能按顺序检查重叠。 - 初始化结果:将排序后的第一个区间存入结果列表,作为合并的起始。
- 遍历合并 :
- 取当前区间与结果中最后一个已合并的区间对比;
- 若当前区间的起始值 ≤ 最后区间的结束值,说明两者重叠,更新最后区间的结束值为 "两者结束值的最大值";
- 若不重叠,直接将当前区间加入结果列表。
示例验证
以示例 1 为例:
- 输入排序后:
[[1,3],[2,6],[8,10],[15,18]] - 结果初始化为
[[1,3]] - 合并
[2,6]:2 ≤ 3,更新为[[1,6]] - 加入
[8,10]:8 > 6,结果变为[[1,6],[8,10]] - 加入
[15,18]:15 > 10,最终结果为[[1,6],[8,10],[15,18]],与示例一致。
Python代码:
python
from typing import List
class Solution:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
# 处理空输入
if not intervals:
return []
# 按区间的起始值升序排序(关键步骤,确保后续能顺序合并)
intervals.sort(key=lambda x: x[0])
# 初始化结果列表,存入第一个区间
result = [intervals[0]]
# 遍历剩余区间,依次合并
for curr in intervals[1:]:
last = result[-1] # 取结果中最后一个已合并的区间
# 若当前区间的起始值 <= 最后区间的结束值,说明重叠/相邻,执行合并
if curr[0] <= last[1]:
last[1] = max(last[1], curr[1]) # 合并后取最大结束值
# 否则无重叠,直接加入结果
else:
result.append(curr)
return result
# 测试示例(验证代码正确性)
if __name__ == "__main__":
solution = Solution()
# 示例1测试
intervals1 = [[1, 3], [2, 6], [8, 10], [15, 18]]
print("示例1输入:", intervals1)
print("示例1输出:", solution.merge(intervals1)) # 预期: [[1,6],[8,10],[15,18]]
# 示例2测试
intervals2 = [[1, 4], [4, 5]]
print("\n示例2输入:", intervals2)
print("示例2输出:", solution.merge(intervals2)) # 预期: [[1,5]]
# 示例3测试
intervals3 = [[4, 7], [1, 4]]
print("\n示例3输入:", intervals3)
print("示例3输出:", solution.merge(intervals3)) # 预期: [[1,7]]
LeetCode提交代码:
python
class Solution:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
from typing import List
# 处理空输入
if not intervals:
return []
# 按区间的起始值升序排序(关键步骤,确保后续能顺序合并)
intervals.sort(key=lambda x: x[0])
# 初始化结果列表,存入第一个区间
result = [intervals[0]]
# 遍历剩余区间,依次合并
for curr in intervals[1:]:
last = result[-1] # 取结果中最后一个已合并的区间
# 若当前区间的起始值 <= 最后区间的结束值,说明重叠,合并
if curr[0] <= last[1]:
last[1] = max(last[1], curr[1])
# 否则无重叠,直接加入结果
else:
result.append(curr)
return result
程序运行截图展示:

总结
该算法用于合并重叠区间。首先对区间按起始值排序,然后遍历检查相邻区间是否重叠:若当前区间起始值≤前一区间结束值,则合并为更大的区间;否则直接保留。通过排序确保相邻区间可顺序处理,时间复杂度O(nlogn)(排序主导),空间复杂度O(n)。示例验证表明算法能正确处理各种重叠情况,如完全重叠、部分重叠和相邻区间。Python实现简洁高效,适用于LeetCode等编程挑战。