news 2026/5/3 12:46:03

LeetCode Hot 100 - 56. 合并区间

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode Hot 100 - 56. 合并区间

难度:中等 | 面试频率:⭐⭐⭐⭐

📝 题目描述

以数组intervals表示若干个区间的集合,其中单个区间为intervals[i] = [start_i, end_i]。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。

示例

示例 1:

text

输入:intervals = [[1,3],[2,6],[8,10],[15,18]] 输出:[[1,6],[8,10],[15,18]] 解释:区间 [1,3] 和 [2,6] 重叠,将它们合并为 [1,6]。

示例 2:

text

输入:intervals = [[1,4],[4,5]] 输出:[[1,5]] 解释:区间 [1,4] 和 [4,5] 被视为重叠区间(端点接触就算重叠)。

提示

  • 1 <= intervals.length <= 10^4

  • intervals[i].length == 2

  • 0 <= start_i <= end_i <= 10^4


🎯 解题思路

核心思想

排序 + 贪心合并

合并区间的本质:

  1. 如果两个区间有重叠(或端点相接),它们可以合并成一个更大的区间

  2. 合并后的区间 =[min(左边界), max(右边界)]

算法步骤

  1. 排序:按照区间的左端点升序排序

  2. 初始化:将第一个区间加入结果集

  3. 遍历:对于每个后续区间,判断是否与结果集中最后一个区间重叠

    • 重叠:更新最后一个区间的右端点(取最大值)

    • 不重叠:直接加入结果集


💻 完整代码

java

class Solution { public int[][] merge(int[][] intervals) { // 边界情况 if (intervals == null || intervals.length <= 1) { return intervals; } // 1. 按照区间左端点升序排序 Arrays.sort(intervals, (a, b) -> a[0] - b[0]); // 2. 用 List 存储合并后的结果 List<int[]> merged = new ArrayList<>(); // 3. 初始化:先把第一个区间放进去 int[] current = intervals[0]; merged.add(current); // 4. 遍历后续区间 for (int i = 1; i < intervals.length; i++) { int[] interval = intervals[i]; int currentEnd = current[1]; int nextStart = interval[0]; int nextEnd = interval[1]; // 判断是否重叠:当前区间的右端点 >= 下一个区间的左端点 if (currentEnd >= nextStart) { // 重叠!合并:更新当前区间的右端点 current[1] = Math.max(currentEnd, nextEnd); } else { // 不重叠:添加新区间 current = interval; merged.add(current); } } // 5. List 转数组返回 return merged.toArray(new int[merged.size()][]); } }

🔍 代码详解

1. 排序(关键第一步)

java

Arrays.sort(intervals, (a, b) -> a[0] - b[0]);
  • 按照每个区间的起点从小到大排序

  • 排序后,只需要和前一个区间比较,不需要和所有区间比较

为什么排序很重要?

text

排序前:[[2,6], [1,3]] → 无法直接判断 排序后:[[1,3], [2,6]] → 一目了然:1->3 和 2->6 重叠

2. 合并逻辑

重叠的判断条件:

text

当前区间的右端点 >= 下一个区间的左端点

图示:

text

重叠情况: [1 3] [2 6] → 3 >= 2,重叠 合并后:[1 6] 不重叠情况: [1 3] [4 6] → 3 < 4,不重叠 结果:[[1,3], [4,6]] 边界重叠(也算重叠): [1 4] [4 6] → 4 >= 4,重叠 合并后:[1 6]

3. 原地更新技巧

java

int[] current = intervals[0]; merged.add(current);

注意:merged.add(current)添加的是引用,后续修改current[1]会直接修改 merged 中的元素,不需要重新添加。


🖼️ 图解示例

示例:[[1,3],[2,6],[8,10],[15,18]]

步骤 1:排序(已经有序)

text

[1,3] [2,6] [8,10] [15,18]

步骤 2:初始化

text

merged = [[1,3]] current = [1,3]

步骤 3:处理 [2,6]

text

current = [1,3], 下一个 = [2,6] 判断:3 >= 2 → 重叠 合并:current[1] = max(3, 6) = 6 merged = [[1,6]]

步骤 4:处理 [8,10]

text

current = [1,6], 下一个 = [8,10] 判断:6 >= 8 ? 否(6 < 8)→ 不重叠 添加新区间:current = [8,10], merged = [[1,6], [8,10]]

步骤 5:处理 [15,18]

text

current = [8,10], 下一个 = [15,18] 判断:10 >= 15 ? 否 → 不重叠 添加新区间:current = [15,18], merged = [[1,6], [8,10], [15,18]]

最终结果

text

[[1,6], [8,10], [15,18]]

📊 复杂度分析

操作时间复杂度空间复杂度
排序O(n log n)O(log n)(快排栈空间)
遍历合并O(n)O(1)(不计输出)
总计O(n log n)O(log n)~ O(n)

✅ 测试验证

java

public static void main(String[] args) { Solution solution = new Solution(); // 示例 1 int[][] intervals1 = {{1,3},{2,6},{8,10},{15,18}}; int[][] result1 = solution.merge(intervals1); printResult(result1); // [[1,6],[8,10],[15,18]] // 示例 2(边界重叠) int[][] intervals2 = {{1,4},{4,5}}; int[][] result2 = solution.merge(intervals2); printResult(result2); // [[1,5]] // 完全包含 int[][] intervals3 = {{1,10},{2,3},{4,5},{6,7}}; int[][] result3 = solution.merge(intervals3); printResult(result3); // [[1,10]] // 无需合并 int[][] intervals4 = {{1,2},{3,4},{5,6}}; int[][] result4 = solution.merge(intervals4); printResult(result4); // [[1,2],[3,4],[5,6]] } private static void printResult(int[][] intervals) { System.out.print("["); for (int i = 0; i < intervals.length; i++) { System.out.print("[" + intervals[i][0] + "," + intervals[i][1] + "]"); if (i < intervals.length - 1) System.out.print(","); } System.out.println("]"); }

💡 关键点总结

要点说明
必须排序按左端点排序,保证每次只需和上一个区间比较
重叠条件当前右端点 >= 下一个左端点
合并操作右端点取max(当前右, 下一个右)
边界处理端点相接(如[1,4][4,5])也算重叠
原地修改使用引用,避免重复创建数组

⚠️ 常见错误

错误 1:忘记排序

java

// ❌ 错误:没有排序直接合并 // 输入 [[2,6],[1,3]] 会失败 // ✅ 正确:先排序 Arrays.sort(intervals, (a, b) -> a[0] - b[0]);

错误 2:重叠条件写错

java

// ❌ 错误:没有考虑相等的情况 if (currentEnd > nextStart) // 漏掉了相等的情况 // ✅ 正确:包含相等 if (currentEnd >= nextStart)

错误 3:合并时忘记更新右端点最大值

java

// ❌ 错误:直接赋值 current[1] = nextEnd; // ✅ 正确:取最大值 current[1] = Math.max(currentEnd, nextEnd);

🎓 举一反三

相关题目

题目难度解法要点
57. 插入区间中等先插入再合并,或直接遍历
435. 无重叠区间中等贪心:按右端点排序
452. 用最少数量的箭引爆气球中等区间重叠的变种
986. 区间列表的交集中等双指针遍历两个区间列表

变形:返回合并后的区间数量

java

public int countMerged(int[][] intervals) { if (intervals.length == 0) return 0; Arrays.sort(intervals, (a, b) -> a[0] - b[0]); int count = 1; int currentEnd = intervals[0][1]; for (int i = 1; i < intervals.length; i++) { if (currentEnd >= intervals[i][0]) { currentEnd = Math.max(currentEnd, intervals[i][1]); } else { count++; currentEnd = intervals[i][1]; } } return count; }

📌 面试技巧

面试官可能会问:

  1. Q:如果区间列表非常大(10^6 个区间),你的算法还能用吗?

    • A:排序 O(n log n) 是瓶颈,10^6 个区间排序约需 2×10^7 次比较,现代计算机可以接受。如果内存不够,可以用外部排序。

  2. Q:能否不用排序?

    • A:可以构建线段树或区间树,但复杂度更高(O(n log C)),且实现复杂,不如排序简单高效。

  3. Q:端点相接算重叠吗?

    • A:题目示例[1,4][4,5]合并为[1,5],说明算重叠。


🔗 相关链接

  • LeetCode 原题:56. 合并区间

  • LeetCode 官方题解:合并区间官方题解


💬 欢迎在评论区讨论交流!如果这篇文章对你有帮助,请点赞支持~
📢 关注我,持续更新 LeetCode Hot 100 题解!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/3 12:44:48

UniPush 2.0 进阶实战:云函数+厂商通道,搞定APP离线推送全链路

1. 为什么你的UniPush离线推送总失败&#xff1f; 很多开发者跟我吐槽&#xff1a;"明明按照文档配好了UniPush&#xff0c;测试时在线推送能收到&#xff0c;但用户手机一锁屏推送就石沉大海。" 这其实就是典型的离线推送失效问题。我去年接手的一个充电类APP就遇到…

作者头像 李华
网站建设 2026/4/16 7:36:56

2025_NIPS_LLM Meets Diffusion: A Hybrid Framework for Crystal Material Generation

一、文章主要内容总结 本文针对晶体材料生成中离散原子类型与连续结构特征难以同时精准建模的问题,提出了一种融合大型语言模型(LLM)与扩散模型的混合框架CrysLLMGen,用于高效生成新型、稳定的周期性晶体材料。 研究背景:晶体材料的发现对电池、太阳能电池等领域创新至关…

作者头像 李华
网站建设 2026/4/16 8:17:08

Janus-Pro-7B效果展示:游戏原画→生成多角度角色设定图+技能描述

Janus-Pro-7B效果展示&#xff1a;游戏原画→生成多角度角色设定图技能描述 重要提示&#xff1a;本文所有展示效果基于Janus-Pro-7B模型生成&#xff0c;实际效果可能因提示词、参数设置等因素有所差异 1. 模型能力概览 Janus-Pro-7B作为统一多模态理解与生成AI模型&#xff…

作者头像 李华
网站建设 2026/4/16 0:42:58

AIAgent数据流架构的“隐形断点”(95%工程师从未检测到的Schema漂移放大效应):附自动检测DSL工具包

第一章&#xff1a;AIAgent数据流架构的“隐形断点”本质解析 2026奇点智能技术大会(https://ml-summit.org) “隐形断点”并非系统故障或配置缺失&#xff0c;而是AI Agent在多阶段数据流转中因语义契约断裂、状态同步异步化及上下文生命周期错配所引发的**结构性静默失效**。…

作者头像 李华