算法-数组实战【合并区间】中等

合并区间

相关企业

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

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

示例 2:

lua 复制代码
输入: intervals = [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。

提示:

  • 1 <= intervals.length <= 104
  • intervals[i].length == 2
  • 0 <= starti <= endi <= 104

解法

核心思路:​排序 + 合并
  1. 排序预处理 ​:将所有区间按起始位置升序排序

  2. 合并重叠区间​:

    • 遍历排序后的区间列表
    • 维护当前合并区间 [start, end]
    • 若当前区间起始位置 ≤ 上一区间的结束位置(存在重叠),则更新合并区间的结束位置
    • 若没有重叠,则将前一合并区间加入结果,并开始新合并区间
ini 复制代码
import java.util.*;
class Solution {
    public int[][] merge(int[][] intervals) {
        // 1. 排序:按区间起始位置升序
        Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0]));
        List<int[]> merged = new ArrayList<>();
        int start = intervals[0][0];
        int end = intervals[0][1];
        // 2. 遍历合并
        for (int i = 1; i < intervals.length; i++) {
            if (intervals[i][0] <= end) {  // 有重叠
                end = Math.max(end, intervals[i][1]);  // 扩展结束位置
            } else {  // 无重叠
                merged.add(new int[]{start, end});  // 保存当前合并区间
                start = intervals[i][0];  // 新合并区间开始
                end = intervals[i][1];
            }
        }
        merged.add(new int[]{start, end});  // 添加最后一个合并区间
        // 3. 转为数组输出
        return merged.toArray(new int[merged.size()][]);
    }
}
算法步骤解析(以示例1 [[1,3],[2,6],[8,10],[15,18]] 为例)
  1. 排序后:保持顺序不变 1,3 -> 2,6 -> 8,10 -> 15,18
  2. 初始化start=1, end=3
  3. 遍历
    • 第1区间 [2,6]2 ≤ 3 → 有重叠
      • end = max(3,6) = 6
      • 状态:[1,6]
    • 第2区间 [8,10]8 > 6 → 无重叠
      • 保存 [1,6]
      • 新区间:start=8, end=10
    • 第3区间 [15,18]15 > 10 → 无重叠
      • 保存 [8,10]
      • 新区间:start=15, end=18
  4. 结束 :保存最后一个区间 [15,18]
  5. 输出[[1,6],[8,10],[15,18]]
关键优势
  • 排序保证连续性:排序后只需比较相邻区间
  • 合并逻辑简单:只需维护当前合并区间的结束位置
  • 原地操作:无需额外数据结构(仅使用链表存储结果)
相关推荐
兰令水2 小时前
hot100【acm版】【2026.7.14打卡-java版本】
java·数据结构·算法·leetcode·面试
cpp_25013 小时前
P10098 [ROIR 2023] 地铁建设 (Day 2)
数据结构·c++·算法·贪心·二分答案·洛谷题解
米尔的可达鸭6 小时前
深入操作系统 Socket 底层:套接字控制块、FD映射、阻塞IO核心完整实现
arm开发·数据结构·websocket·网络协议·算法·架构·安全架构
tachibana26 小时前
hot100 课程表(207)
java·数据结构·算法·leetcode
Frostnova丶7 小时前
(15)LeetCode 189. 轮转数组
数据结构·算法·leetcode
来一碗刘肉面8 小时前
顺序表的按值查找
数据结构·c++·算法
延凡科技8 小时前
延凡科技 - 发生器设备管理控制系统:AI 驱动的全生命周期智能管控方案
大数据·数据结构·人工智能·算法
小肝一下9 小时前
2. 顺序表和链表
c语言·数据结构·c++·链表·dijkstra·依蕾娜·香香的依蕾娜
j7~9 小时前
【数据结构初阶】带头双向循环链表 (DSList) --增删查改完整实现详解
c语言·数据结构·链表·带头双向循环链表
石像鬼₧魂石10 小时前
贵州商会管理系统 —— 商协会数字化运营一站式平台
大数据·数据结构·物联网·eclipse·数据库架构