Algorithms first

合并区间 · 交互式算法学习

合并所有重叠区间。

#56 · 区间

合并区间

Merge Intervals

测试用例intervals = [[1,3],[2,6],[8,10],[15,18]]
区间轴3 个关键状态
步骤 1按左端点排序。sorted
1–3
2–6
8–10
15–18
推荐

排序后线性合并

时间 O(n log n)空间 O(n)

按左端排序后,只需与结果中的最后一个区间比较。

1function merge(a) {2  a.sort((x, y) => x[0] - y[0]);3  const out = [];4  for (const cur of a) {5    const last = out.at(-1);6    if (last && cur[0] <= last[1]) last[1] = Math.max(last[1], cur[1]);7    else out.push([...cur]);8  }9  return out;10}
多语言参考

Java · C++ · Go

来源 · CC BY-SA 4.0 ↗

这是一组同题正确实现,独立于上方当前动画方法;不同语言可能采用另一种正确策略。

1class Solution {2    public int[][] merge(int[][] intervals) {3        Arrays.sort(intervals, Comparator.comparingInt(a -> a[0]));4        int st = intervals[0][0], ed = intervals[0][1];5        List<int[]> ans = new ArrayList<>();6        for (int i = 1; i < intervals.length; ++i) {7            int s = intervals[i][0], e = intervals[i][1];8            if (ed < s) {9                ans.add(new int[] {st, ed});10                st = s;11                ed = e;12            } else {13                ed = Math.max(ed, e);14            }15        }16        ans.add(new int[] {st, ed});17        return ans.toArray(new int[ans.size()][]);18    }19}
交互式算法学习

从执行步骤真正理解 LeetCode 经典 150

本站整理 150 道高频算法面试题和 302 种解法。动画方法同步展示 JavaScript 与 Python;每题另提供 Java、C++ 与 Go 同题参考实现。

多形态可视化数组、矩阵、DP 表、递归树、树图、链表、栈队列堆、区间和状态机按解法选择。
动画与代码同步当前状态、步骤说明、变量和代码高亮保持一一对应,可逐步播放和回退。
适合面试复习每种方案都给出思路、时间复杂度、空间复杂度、测试用例和 LeetCode 中文原题入口。
AlgoViz Lab

合并区间 · 解法对比

合并所有重叠区间。

测试用例
intervals = [[1,3],[2,6],[8,10],[15,18]]
题目分类
区间
解法对比
2
方案 1

反复寻找重叠对

找到任意重叠区间就合并,直到没有变化。

时间
O(n²)
空间
O(n)
方案 2

排序后线性合并

按左端排序后,只需与结果中的最后一个区间比较。

时间
O(n log n)
空间
O(n)