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

(14)LeetCode 56. 合并区间

LeetCode 56. 合并区间

📝 题目描述

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

示例 1:

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

示例 2:

输入:intervals = [[1,4],[4,5]] 输出:[[1,5]] 解释:区间 [1,4] 和 [4,5] 被视为重叠区间(闭区间)。

💡 解题思路

核心思想

  1. 排序:按照每个区间的左端点升序排序,这样所有区间按起始位置有序排列。
  2. 一次遍历合并
    • 用两个变量lr记录当前合并区间的左右端点。
    • 依次检查后续区间:
      • 若当前区间的左端点> r,说明与当前合并区间没有重叠,将当前合并区间存入结果,并更新lr为新区间的端点。
      • 否则,说明有重叠,更新r = max(r, current_end),合并区间。
  3. 收尾:遍历结束后,将最后一个合并区间加入结果。

为什么排序是关键?

排序后,我们只需从左到右扫描一次,因为左端点递增,任何重叠只可能发生在相邻区间之间,无需回头检查。

重叠判断条件

  • 区间[a, b][c, d](已排序,a ≤ c)重叠当且仅当c ≤ b(闭区间,等于也算重叠)。
  • 在代码中,我们判断intervals[i][0] > r则为不重叠,否则为重叠。

🧑‍💻 C++ 代码实现

classSolution{public:vector<vector<int>>merge(vector<vector<int>>&intervals){vector<vector<int>>res;// 存储合并后的结果if(intervals.empty())returnres;// 处理空输入// 1. 按区间左端点排序sort(intervals.begin(),intervals.end());// 2. 初始化当前合并区间intl=intervals[0][0],r=intervals[0][1];// 3. 遍历后续区间for(inti=1;i<intervals.size();++i){if(intervals[i][0]>r){// 无重叠res.push_back({l,r});// 保存当前合并区间l=intervals[i][0];// 开始新区间r=intervals[i][1];}else{// 有重叠r=max(r,intervals[i][1]);// 合并,更新右端点}}// 4. 加入最后一个区间res.push_back({l,r});returnres;}};

🔍 代码细节解析

步骤说明
sort(intervals.begin(), intervals.end())按左端点升序排序,左端点相同则按右端点升序(不影响合并逻辑)
if (intervals[i][0] > r)判断无重叠的条件:当前左端点严格大于当前右端点(闭区间,等于则重叠)
res.push_back({l, r})将合并好的区间存入结果,注意用{}初始化vector<int>
r = max(r, intervals[i][1])有重叠时,取两个右端点的较大值,扩大合并区间
最后res.push_back({l, r})循环结束后,最后一个合并区间尚未加入,需补加

⏱ 复杂度分析

  • 时间复杂度:O(n log n),其中 n 是区间个数。主要耗费在排序上,遍历部分为 O(n)。
  • 空间复杂度:O(n)(用于存储结果)。若不计结果数组,排序的栈空间为 O(log n)(快速排序)。

🧪 示例模拟

输入:intervals = [[1,3],[2,6],[8,10],[15,18]]

步骤当前区间当前合并区间[l, r]操作
初始化-[1, 3]从第一个区间开始
i=1[2,6][1, 3][1, 6]重叠,扩展r=6
i=2[8,10][1, 6]无重叠,保存[1,6],新合并区间[8,10]
i=3[15,18][8,10]无重叠,保存[8,10],新合并区间[15,18]
结束-[15,18]保存最后一个区间

最终结果:[[1,6],[8,10],[15,18]]


⚠️ 注意事项

  • 输入区间是闭区间,因此[1,2][2,3]视为重叠,合并为[1,3]
  • 排序是必须的,否则无法通过一次遍历判断所有重叠。
  • 处理空输入时,直接返回空数组,避免访问越界。

http://www.jsqmd.com/news/1164721/

相关文章:

  • LVM概述和管理
  • 直流电机控制:TLE 6208-6 G与PIC18F66K40的硬件设计与PID算法
  • 【单片机毕业设计】基于 STM32 或 51 单片机的智能光感定时窗帘控制系统设计与实现,基于 STM32 或 51 单片机的光线检测自动遮阳设备控制系统开发(025601)
  • 【MicroPython编程-ESP32篇:设备驱动】-TEMT6000环境光传感器驱动
  • C#解析DirectX .x文件:从二进制格式到GPU渲染的完整实践
  • day-024-pip与第三方库
  • Solar Energy (IF 7.188) 2024年热点解读:从光伏材料到电网整合的3大技术趋势
  • 深入理解C语言:数据在内存中的存储(整数、大小端、浮点数)
  • MHMarkets迈汇:“丙烷需求韧性持续显现”
  • 2026年7月最新东莞伯爵官方售后联系电话与客户服务中心网点地址 - 亨得利钟表维修中心
  • 推荐题目:洛谷 P17003 [NWERC 2019] 极速魔方 / Expeditious Cubing
  • 广州积家回收价格查询及各大平台实测排行(2026年7月最新数据) - 积家官方售后服务中心
  • 嵌入式音频处理:dsPIC33与CMT-8540S-SMT方案详解
  • 2026年7月最新大连泰格豪雅官方售后服务热线与网点地址查询 - 亨得利官方服务中心
  • DeepSeek-R1国产芯片深度优化:从适配到共生设计
  • STM32F103C8T6 + ESP-01S 物联网售货柜:3路步进电机出货与MQTT远程运维实战
  • Unity SpriteShape Profile 配置全解析:从原理到实战,打造高效2D地形
  • 3步让经典暗黑破坏神2在现代PC上焕发新生:D2DX优化方案完全指南
  • P1周:Minist手写识别
  • MCP 工具调用机制详解
  • 2026MP4转MP3,免费方法合集,电脑手机在线、离线本地工具完整指南
  • 2026 年新消息:吴桥口碑好的注塑高分散彩色母粒工厂怎么联系,明明加了色母,塑料件为什么还是泛白?这3个细节90%的人搞错 - 行业甄选官
  • 串口波特率精度优化:分数波特率发生器(FDR)原理与C语言实现(附误差<0.2%代码)
  • 2026年7月最新佛山宇舶官方售后联系电话与客户服务中心网点地址 - 亨得利官方服务中心
  • AI绘画Prompt心法:从翻车到精通的四层结构实战指南
  • 5分钟快速上手:XXMI Launcher跨平台游戏模组管理完整指南
  • PixVerse本地AI广告生成:文生图、视频创作与API集成实战
  • STM32F103C8T6 PWM调速实战:L298N驱动双电机,8档位平滑切换代码解析
  • 大数据毕设项目: 基于 Python 的广东乡村旅游数据可视化系统的设计与实现 基于 Python 的广东滨海旅游资源分析系统(源码+文档,讲解、调试运行,定制等)
  • SolidWorks_工程图设计6_断裂视图与剪裁视图