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.
More from this channel