以数组 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 <= 10^4intervals[i].length == 20 <= starti <= endi <= 10^4
方法一:动态维护法
它的核心思想是:维护一个动态的、始终保持不重叠且有序的结果数组 result。每次拿到一个新的区间,就强行把它'塞'进 result 里,并修复由于这个新区间插入而引发的任何重叠问题。
这种解法虽然不是最优解(时间复杂度最差为 $O(N^2)$),但它的逻辑极其严密,非常考验对边界条件和数组操作的把控。
一、核心解题思路
- 初始化:把输入数组的第一个区间直接放进
result里作为基准。 - 逐个处理:从第二个区间开始遍历,把当前区间设为
cur。 - 定位插入点 (寻找
j):在result中从左往右找,只要cur还在当前比较的区间result[j]的完全右侧(即cur[0] > result[j][1]),就说明它们绝对没有交集,继续往右找(j += 1)。 - 分类讨论:当循环停下时,说明找到了
cur应该'落脚'的位置j。此时面临三种情况,进行相应的处理(追加、插入或合并)。
二、所有情况的详细例子
假设当前我们维护的 result 数组状态是这样的:
result = [[1, 3], [6, 8], [12, 15]]
现在我们拿到了一个新的待处理区间 cur,来看看不同 cur 触发的三种情况:

