LeetCode 56. 合并区间 _ 排序+贪心解法详解

LeetCode 56. 合并区间 | 排序+贪心解法详解

目录

TOC

题目描述

给定一组区间 intervals ,要求合并所有重叠的区间,返回一个不重叠的区间数组,且该数组需恰好覆盖输入中的所有区间。

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

解题思路

关键思路:排序 + 贪心
  1. 排序 :将所有区间按照起始点升序排列。这一步的目的是让可能重叠的区间相邻,便于后续合并。

  2. 合并 :遍历排序后的区间,逐个比较当前区间与下一个区间:

  • 不重叠 :当前区间的右端点 < 下一区间的左端点 → 将当前区间加入结果。

  • 重叠 :当前区间的右端点 ≥ 下一区间的左端点 → 合并两区间,右端点取两者的较大值。

  1. 处理末尾 :遍历结束后,最后一个合并的区间需加入结果。
为什么排序?

排序后,所有可能重叠的区间会连续出现。例如,排序后处理 [1,3][2,6] ,发现重叠后合并为 [1,6] 。此时只需继续与后续区间比较,无需回头处理前面的区间,保证线性时间复杂度。

代码实现

cobol 复制代码
var merge = function (intervals) {
    if (intervals.length === 0) return [];
    intervals.sort((a, b) => a[0] - b[0]); // 按起始点排序
    let result = [];
    let current = intervals[0]; // 当前合并的区间
    for (let i = 1; i < intervals.length; i++) {
        if (intervals[i][0] > current[1]) { // 不重叠
            result.push(current);
            current = intervals[i];
        } else { // 重叠,合并右端点
            current[1] = Math.max(current[1], intervals[i][1]);
        }
    }
    result.push(current); // 加入最后一个区间
    return result;
};

复杂度分析

  • 时间复杂度 :O(n log n),主要由排序决定。

  • 空间复杂度 :O(n),存储结果数组。若排序使用额外空间,则为 O(log n)。

示例解析

以输入 [[1,3],[2,6],[8,10],[15,18]] 为例:

  1. 排序 :已按起始点排列。

  2. 合并过程

  • current = [1,3] ,与 [2,6] 比较 → 合并为 [1,6]

  • current = [1,6] ,与 [8,10] 比较 → 不重叠,加入结果, current 更新为 [8,10]

  • current = [8,10] ,与 [15,18] 比较 → 不重叠,加入结果, current 更新为 [15,18]

  1. 加入最后一个区间 → 最终结果 [[1,6],[8,10],[15,18]]

边界条件处理

  • 空输入 :直接返回空数组。

  • 单个区间 :直接返回该区间。

  • 完全覆盖 :如 [[1,4],[2,3]] → 合并为 [1,4]

总结

本题通过排序将问题转化为线性遍历合并,是典型的贪心策略。关键在于理解排序如何简化重叠判断,以及如何通过一次遍历合并所有可能的重叠区间。类似问题如插入区间(LeetCode 57)也可用类似思路解决。

相关推荐
熊猫钓鱼>_>11 分钟前
动态网站发布部署核心问题详解
前端·nginx·容器化·网页开发·云服务器·静态部署
方也_arkling12 分钟前
elementPlus按需导入配置
前端·javascript·vue.js
爱吃大芒果23 分钟前
Flutter for OpenHarmony 实战: mango_shop 资源文件管理与鸿蒙适配
javascript·flutter·harmonyos
我的xiaodoujiao26 分钟前
使用 Python 语言 从 0 到 1 搭建完整 Web UI自动化测试学习系列 44--将自动化测试结果自动推送至钉钉工作群聊
前端·python·测试工具·ui·pytest
沛沛老爹28 分钟前
Web开发者转型AI:多模态Agent视频分析技能开发实战
前端·人工智能·音视频
David凉宸33 分钟前
vue2与vue3的差异在哪里?
前端·javascript·vue.js
Irene199134 分钟前
JavaScript字符串转数字方法总结
javascript·隐式转换
笔画人生38 分钟前
Cursor + 蓝耘API:用自然语言完成全栈项目开发
前端·后端
AC赳赳老秦1 小时前
外文文献精读:DeepSeek翻译并解析顶会论文核心技术要点
前端·flutter·zookeeper·自动化·rabbitmq·prometheus·deepseek
小宇的天下1 小时前
Calibre 3Dstack --每日一个命令day18【floating_trace】(3-18)
服务器·前端·数据库