news 2026/10/18 15:56:41

【普通数组】LC 56.合并区间

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【普通数组】LC 56.合并区间

文章目录

  • 前言
  • 一、题目
    • 1、原题链接
    • 2、题目描述
  • 二、个人思路整理
    • 1、思路分析
    • 2、解题代码
  • 三、知识风暴

前言

本专栏文章为《LeetCode 热题 100》的刷题题解,相关内容如有侵权,立即删除。

一、题目

1、原题链接

56.合并区间

2、题目描述


二、个人思路整理

1、思路分析

核心思路:排序+贪心合并。

  1. 按左端点排序:将所有区间按照起始位置intervals[i][0]升序排序。排序后,所有可能重叠的区间都会紧挨在一起。
  2. 线性扫描合并:
    • 初始化答案数组merged,先放入第一个区间。
    • 遍历后续的每个区间[start, end]:
      • 重叠:若start <= merged.back()[1],说明当前区间与前一个区间重合,更新前一个区间的右端点为max(merged.back()[1], end)。
      • 不重叠:若start > merged.back()[1],说明是独立的新区间,直接加入merged。

2、解题代码

classSolution{public:vector<vector<int>>merge(vector<vector<int>>&intervals){// 特判:如果区间数组为空,直接返回空结果if(intervals.empty()){return{};}// 1. 按照区间的左端点进行升序排序// 默认按 vector 的字典序排序,即先比较 intervals[i][0],若相同再比较 intervals[i][1]sort(intervals.begin(),intervals.end());vector<vector<int>>merged;// 将排序后的第一个区间直接作为初始合并基准merged.push_back(intervals[0]);// 2. 依次遍历后续区间尝试合并for(inti=1;i<intervals.size();i++){intL=intervals[i][0],R=intervals[i][1];// 当前区间的左端点 <= 上一个合并区间的右端点,说明存在重叠if(L<=merged.back()[1]){// 贪心合并:右端点更新为两者的最大值(覆盖更广的范围)merged.back()[1]=max(merged.back()[1],R);}else{// 无重叠:当前区间无法与前一个区间合并,作为独立的新区间加入结果集merged.push_back(intervals[i]);}}returnmerged;}};

2026.10.17重做后补充
在C++的vector中,end()和back()的核心区别在于返回类型和指向的位置完全不同:

  • end()返回的是一个迭代器,指向容器最后一个元素之后的虚拟位置,不存储实际有效元素。
  • back()返回的是一个直接引用,直接代表容器中的最后一个实际元素的值。

复杂度分析

  • 时间复杂度:O ( n log ⁡ n ) O(n \log n)O(nlogn),主要开销在于排序,后续单次扫描为O ( n ) O(n)O(n)。
  • 空间复杂度:O ( log ⁡ n ) O(\log n)O(logn)或O ( n ) O(n)O(n),取决于排序算法所占用的栈空间。

三、知识风暴

区间合并是解决区间类问题的核心技巧,常与排序配合使用。其基本思想是:先将所有区间按左端点排序,再依次遍历,判断当前区间能否与上一个已合并区间合并,从而将重叠区间合并为一个更大的区间。

算法核心思想:

  • 排序预处理:按区间左端点升序排序,保证后续只需线性扫描即可完成合并。
  • 贪心合并:维护一个结果集merged,依次遍历每个区间:
    1. 若当前区间左端点L <= merged.back()[1],说明与上一个合并区间重叠,更新右端点为max(merged.back()[1], R);
    2. 否则无重叠,将当前区间作为独立新区间加入结果集。
  • 状态转移:merged.back()[1] = max(merged.back()[1], R)

算法变体与扩展:

  1. 返回合并后的区间列表:本题即要求返回合并后的完整区间集合。
  2. 插入区间:给定一个已排序且不重叠的区间列表,插入一个新区间并合并(LeetCode 57)。
  3. 区间交集:求两个区间列表的交集(LeetCode 986)。
  4. 会议室问题:判断能否参加所有会议,本质是判断区间是否重叠(LeetCode 252/253)。

与其他算法的对比:

  • 暴力法:O(n²)时间复杂度,两两比较所有区间对。
  • 排序+贪心:O(n log n)时间复杂度,排序后单次线性扫描即可完成合并,是最优解。
  • 差分数组:适用于区间频繁增减的场景,但本题只需一次合并,排序+贪心更直接。

相关 LeetCode 例题:

  • 56. 合并区间(本题)
  • 57. 插入区间(在已排序区间中插入新区间并合并)
  • 986. 区间列表的交集(求两个区间列表的交集)
  • 252. 会议室(判断区间是否重叠)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/18 15:49:52

纯JavaScript工作流引擎:从审批流到自定义节点

简介&#xff1a;这是一份面向前端与全栈开发者的 JavaScript 工作流与审批流实现资源&#xff0c;适合需要理解流程引擎原理、搭建审批类业务系统的初中级开发者参考。资源围绕工作流概念、状态机驱动、任务分配与调度、审批界面交互、数据持久化及异常回退等核心环节展开&…

作者头像 李华
网站建设 2026/10/18 15:49:09

信息化教学设计高端模板:从框架到视觉的实战指南

简介&#xff1a;信息化教学设计高端模板是一份面向教师、教研员及师范生的演示文稿&#xff0c;围绕教学分析、教学设计、教学过程、教学反思四个环节搭建完整备课框架。模板将课程结构、教学内容、教学目标、教学重点、学情分析与教学难点系统梳理&#xff0c;帮助使用者在课…

作者头像 李华
网站建设 2026/10/18 15:47:49

话费充值系统源码拆解:直充、快充、慢充三条链路与订单状态机设计

简介&#xff1a;这是一套面向Java后端开发者与支付系统学习者的手机话费充值系统源码&#xff0c;覆盖直充、快充、慢充等常见充值业务模式&#xff0c;可用于搭建充值平台原型、研究订单与支付链路&#xff0c;或作为毕业设计与二次开发的基础工程。压缩包共约2000个文件&…

作者头像 李华
网站建设 2026/10/18 15:47:43

如何写好CTF Writeup:从解题思路到结构化输出的完整指南

很多人在赛后看完题目&#xff0c;第一反应就是“我这题会做&#xff0c;写个 Writeup 就完事”&#xff1a;贴一段代码&#xff0c;放一张 flag 截图&#xff0c;再甩两行“学到了”。这种写法看着完整&#xff0c;实际上你三个月后回头翻&#xff0c;大概率想不起来当时卡在哪…

作者头像 李华