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

合并区间

相关企业

以数组 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]]
关键优势
  • 排序保证连续性:排序后只需比较相邻区间
  • 合并逻辑简单:只需维护当前合并区间的结束位置
  • 原地操作:无需额外数据结构(仅使用链表存储结果)
相关推荐
肆佰.35 分钟前
c++ 派生类
数据结构·c++·算法
命苦的孩子1 小时前
List 接口
java·数据结构·list·intellij-idea
lifallen3 小时前
Java stream 并发问题
java·开发语言·数据结构·算法
亮亮爱刷题3 小时前
算法能力提升之快速矩阵
数据结构·算法·矩阵
野原鑫之祝3 小时前
嵌入式开发学习———Linux环境下数据结构学习(五)
linux·c语言·数据结构·学习·vim·排序算法·嵌入式
草莓熊Lotso4 小时前
【数据结构初阶】--二叉树(五)
c语言·数据结构·经验分享·笔记·其他
蒟蒻小袁5 小时前
力扣面试150题--只出现一次的数字
数据结构·算法·leetcode
啊阿狸不会拉杆5 小时前
《Java 程序设计》第 11 章 - 泛型与集合
java·开发语言·jvm·数据结构·算法
Jay Kay6 小时前
跳跃表可视化深度解析:动态演示数据结构核心原理
数据结构·数据库
OKkankan7 小时前
string类的模拟实现
开发语言·数据结构·c++·算法