当前位置: 首页 > news >正文

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

目录

题目描述

解题思路

关键思路:排序 + 贪心

为什么排序?

代码实现

复杂度分析

示例解析

边界条件处理

总结


题目描述

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

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

解题思路

关键思路:排序 + 贪心

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

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

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

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

  3. 处理末尾:遍历结束后,最后一个合并的区间需加入结果。

为什么排序?

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

代码实现

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]

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

边界条件处理

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

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

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

总结

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

http://www.dtcms.com/a/99086.html

相关文章:

  • 创意 Python 爱心代码分享
  • el-table 动态给每行增加class属性
  • C++ vector容器总结
  • 诠视科技MR眼镜如何使用VLC 进行RTSP投屏到电脑
  • 【从零实现Json-Rpc框架】- 项目实现 - muduo网络通信类实现篇
  • 黑盒测试的测试用例构成的八点要素
  • 突破数据迁移瓶颈!AWS Snowball如何让PB级数据“瞬间”上云?
  • 12款星光闪光污迹艺术绘画效果Clip Studio Paint笔刷画笔+闪光纹理图片 Clip Studio Glitter Texture Brushes
  • INAV电流计校准
  • sqlalchemy:将mysql切换到OpenGauss
  • 使用dumpbin和depends查看dll(exe)的依赖
  • 代码随想录算法训练营第二十八天,动态规划理论基础,509.斐波那契数,70.爬楼梯,746.使用最小花费爬楼梯。
  • OpenAI API - Practice
  • 【全栈开发】—— Paddle OCR 文字识别 + deepseek接入(基于python 最新!!!)
  • 【STL】vector介绍(附部分接口模拟实现)
  • 【C#】`Task.Factory.StartNew` 和 `Task.Run` 区别
  • Ubuntu和Windows实现文件互传
  • HTML基础及进阶
  • 【C++】基础3——正则表达式,静态多态(函数重载和模板),异常处理
  • EverEdit扩展脚本:“AI翻译”插件,让EverEdit自由翻译
  • 排序--归并排序--非递归
  • RAG - 五大文档切分策略深度解析
  • Spring Boot自动配置原理解析
  • Oracle数据库数据编程SQL<3.2 PL/SQL 匿名块中的DML操作、动态SQL、实际应用场景、使用技巧>
  • matplotlib标题比x,y轴字体大,明明标题字体更大?
  • pr--打开视频后没有声音输出
  • VBA第三十三期 如何在VBA中运行Access
  • 大模型评测框架evalscope、openCompass
  • Redis 源码硬核解析系列专题 - 第一篇:Redis源码入门与整体架构
  • 5000元组装一台本地运行中、小模型主机,参考配置 (运行DeepSeek、Qwen)