LeetCode Hot100(11/100)——56. 合并区间

文章目录

一、题目描述

给定一个区间集合,请你合并所有重叠的区间。

每个区间 intervals[i] = [start_i, end_i] 表示一个闭区间,要求返回一个新的区间列表,使得其中所有的区间互不重叠,并且能覆盖原来的所有区间。


🔍 示例

输入:

复制代码
intervals = [[1,3],[2,6],[8,10],[15,18]]

输出:

复制代码
[[1,6],[8,10],[15,18]]

解释:

  • [1,3][2,6] 重叠,合并成 [1,6]
  • 其他区间之间没有交集

二、题意分析与思考导图

下面的思维导图展示了解题整体思路 👇
合并区间
题意理解
区间可能重叠
输出非重叠区间集合
关键思路
按起点排序
依次遍历区间
判断是否重叠
若重叠则合并
实现细节
排序 -> 遍历 -> 合并 -> 输出结果
复杂度分析
n log n
n


三、算法思路讲解

解法核心思路(排序 + 区间合并)

  1. 排序:首先按每个区间的起点升序排列。这样处理后的区间更容易判断重叠关系。
  2. 遍历 & 合并
    用一个变量(如 merged)维护合并后的列表。
    对每个区间:
    • 如果当前区间的起点 > 已合并区间的末尾,说明没有重叠,直接加入结果;
    • 否则,说明有重叠,更新末尾为较大值(即 max(end1, end2))。

过程可视化

下面用流程图展示算法执行流程:


开始
按区间起点排序
初始化 merged 为空列表
遍历每个区间
merged为空 或 当前区间起点 > merged.last.end ?
加入 merged 列表
更新 merged.last.end = max(merged.last.end, 当前区间.end)
继续下一个区间
输出 merged 作为结果
结束


四、详细示例推演

假设输入:

复制代码
intervals = [[1,3], [2,6], [8,10], [15,18]]

1️⃣ 排序后结果(按起点):

复制代码
[[1,3], [2,6], [8,10], [15,18]]

2️⃣ 遍历:

  • 初始化结果 merged = []
  • 第一个区间 [1,3] → 直接加入 merged
    👉 merged = [[1,3]]
  • 第二个区间 [2,6]2 <= 3,有重叠 → 合并成 [1,6]
    👉 merged = [[1,6]]
  • 第三个区间 [8,10]8 > 6,无重叠 → 直接加入
    👉 merged = [[1,6],[8,10]]
  • 第四个区间 [15,18]15 > 10,无重叠 → 直接加入
    👉 merged = [[1,6],[8,10],[15,18]]

✅ 最终结果:[[1,6],[8,10],[15,18]]


五、代码实现(Java版本)

java 复制代码
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class MergeIntervals {
    public int[][] merge(int[][] intervals) {
        // 1. 按区间起点排序
        Arrays.sort(intervals, (a, b) -> a[0] - b[0]);
        
        // 2. 初始化结果列表
        List<int[]> merged = new ArrayList<>();
        
        // 3. 遍历每个区间
        for (int[] interval : intervals) {
            // 如果结果为空 或 当前起点 > merged最后一个区间的终点
            if (merged.isEmpty() || interval[0] > merged.get(merged.size() - 1)[1]) {
                merged.add(interval); // 无重叠区间,直接加入
            } else {
                // 存在重叠,取最大终点更新
                merged.get(merged.size() - 1)[1] = Math.max(
                    merged.get(merged.size() - 1)[1], interval[1]
                );
            }
        }
        
        // 4. 转换为数组返回
        return merged.toArray(new int[merged.size()][]);
    }

    // 测试
    public static void main(String[] args) {
        MergeIntervals m = new MergeIntervals();
        int[][] intervals = {{1,3},{2,6},{8,10},{15,18}};
        int[][] result = m.merge(intervals);
        System.out.println(Arrays.deepToString(result));
        // 输出: [[1,6],[8,10],[15,18]]
    }
}

六、复杂度分析

指标 分析
时间复杂度 O(n log n),主要来源于排序操作。遍历合并部分为 O(n)
空间复杂度 O(n),用于存储合并后的区间结果
相关推荐
无极低码14 小时前
ecGlypher新手安装分步指南(标准化流程)
人工智能·算法·自然语言处理·大模型·rag
软件算法开发15 小时前
基于海象优化算法的LSTM网络模型(WOA-LSTM)的一维时间序列预测matlab仿真
算法·matlab·lstm·一维时间序列预测·woa-lstm·海象优化
superior tigre15 小时前
22 括号生成
算法·深度优先
努力也学不会java16 小时前
【缓存算法】一篇文章带你彻底搞懂面试高频题LRU/LFU
java·数据结构·人工智能·算法·缓存·面试
旖-旎17 小时前
二分查找(x的平方根)(4)
c++·算法·二分查找·力扣·双指针
ECT-OS-JiuHuaShan17 小时前
朱梁万有递归元定理,重构《易经》
算法·重构
智者知已应修善业17 小时前
【51单片机独立按键控制数码管移动反向,2片74CH573/74CH273段和位,按键按下保持原状态】2023-3-25
经验分享·笔记·单片机·嵌入式硬件·算法·51单片机
khddvbe18 小时前
C++并发编程中的死锁避免
开发语言·c++·算法
C羊驼18 小时前
C语言:两天打鱼,三天晒网
c语言·经验分享·笔记·算法·青少年编程
菜菜小狗的学习笔记18 小时前
剑指Offer算法题(四)链表
数据结构·算法·链表