

LeetCode Hot 100:合并区间
用排序和 output 最后一段讲清合并区间:判断 start <= lastEnd,重叠取最大右端点,并给出 JavaScript 实现。
本期讲 LeetCode Hot 100 的「合并区间」。给定若干
[start, end] 区间,目标是合并所有重叠部分,让结果覆盖原范围,且区间之间互不重叠。原题页面给出的三个关键例子是:[[1,3],[2,6],[8,10],[15,18]] 合并为 [[1,6],[8,10],[15,18]];[1,4] 与 [4,5] 也要合并;输入无序时,[[4,7],[1,4]] 先排序后得到 [[1,7]]。题面约束是区间数量最多 10^4,每个区间恰好有两个端点,且 0 <= start <= end <= 10^4。详见 LeetCode 56. 合并区间 和 LeetCode 56. Merge Intervals。解法只有一个核心不变量:先按左端点排序。遍历时,
output 始终保存已经处理区间的合并结果,并且只需要比较当前区间和 output 最后一段。若 start <= lastEnd,两段重叠,把右端点更新为 Math.max(lastEnd, end);否则直接追加新区间。这个判断也覆盖了端点相接和包含关系。排序与扫描的思路、复杂度和 JavaScript 写法可对照 NeetCode: Merge Intervals。function merge(intervals) {
intervals.sort((a, b) => a[0] - b[0]);
const output = [intervals[0]];
for (let i = 1; i < intervals.length; i++) {
const [start, end] = intervals[i];
const last = output[output.length - 1];
if (start <= last[1]) {
last[1] = Math.max(last[1], end);
} else {
output.push([start, end]);
}
}
return output;
}时间复杂度是
O(n log n),主要来自排序;扫描本身是 O(n)。额外空间取决于排序实现,结果数组本身最多保存 O(n) 个区间。题面当前未单独列出 Follow-up;面试里最容易被追问的是为什么必须先排序,以及为什么合并时右端点要取最大值。Related content
- Sign in to comment.
