news 2026/10/31 4:25:18

LeetCode合并区间问题解析与Python实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode合并区间问题解析与Python实现

1. 合并区间问题概述

合并区间是LeetCode上经典的数组处理问题(编号56),属于中级难度题目。给定一个区间的集合,要求合并所有重叠的区间,返回一个不重叠的区间数组,且这些区间需要恰好覆盖原始输入的所有区间。

这个问题在实际开发中有广泛的应用场景:

  • 日历应用中合并重复的时间段
  • 日志分析时合并相邻的时间窗口
  • 资源调度时合并重叠的分配区间
  • 金融系统中处理交易时间段的重叠

2. 问题分析与解法思路

2.1 输入输出示例

典型输入输出形式如下:

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

2.2 关键解题步骤

  1. 区间排序:首先按照区间的起始点进行排序,这是后续合并操作的基础
  2. 初始化结果集:将第一个区间加入结果集作为初始比较基准
  3. 遍历比较:从第二个区间开始,逐个与结果集中最后一个区间比较:
    • 如果当前区间与结果集最后一个区间重叠,则合并它们
    • 如果不重叠,则将当前区间加入结果集

注意:这里的重叠判断标准是当前区间的起始点是否小于等于结果集最后一个区间的结束点

3. 代码实现与优化

3.1 Python标准解法

def merge(intervals): if not intervals: return [] # 按区间起始点排序 intervals.sort(key=lambda x: x[0]) merged = [intervals[0]] for current in intervals[1:]: last = merged[-1] if current[0] <= last[1]: # 有重叠 last[1] = max(last[1], current[1]) # 合并区间 else: merged.append(current) return merged

时间复杂度分析:

  • 排序操作:O(nlogn)
  • 线性扫描:O(n)
  • 总体复杂度:O(nlogn)

空间复杂度:

  • 最坏情况下需要存储所有区间:O(n)

3.2 边界情况处理

实际编码时需要特别注意以下边界情况:

  1. 空输入:直接返回空数组
  2. 单区间输入:无需合并直接返回
  3. 完全包含的区间:如[1,4]和[2,3]
  4. 刚好相接的区间:如[1,2]和[2,3]是否合并取决于题目要求

4. 算法优化与变种

4.1 空间优化方案

如果允许修改输入数组,可以原地合并节省空间:

def merge(intervals): intervals.sort(key=lambda x: x[0]) i = 0 while i < len(intervals)-1: if intervals[i][1] >= intervals[i+1][0]: intervals[i][1] = max(intervals[i][1], intervals[i+1][1]) intervals.pop(i+1) else: i += 1 return intervals

4.2 相关变种问题

  1. 插入区间:在已排序的不重叠区间列表中插入新区间并合并
  2. 区间交集:找出两组区间的所有交集
  3. 会议室安排:判断一个人是否能参加所有会议(本质是检查区间是否重叠)

5. 实际应用中的注意事项

  1. 区间表示方式:实际问题中区间可能用对象表示而非数组,需要适当调整
  2. 大数据量处理:当区间数量极大时,考虑分治或并行处理
  3. 动态区间处理:如果区间会动态增减,需要设计更高效的数据结构

6. 测试用例设计

完整的测试应包含以下情况:

test_cases = [ ([], []), # 空输入 ([[1,3]], [[1,3]]), # 单区间 ([[1,4],[4,5]], [[1,5]]), # 相接区间 ([[1,3],[2,6],[8,10],[15,18]], [[1,6],[8,10],[15,18]]), # 标准案例 ([[1,4],[2,3]], [[1,4]]), # 完全包含 ([[1,4],[0,4]], [[0,4]]), # 起始点更小的重叠 ([[1,4],[0,5]], [[0,5]]), # 完全覆盖 ]

7. 常见错误与调试技巧

新手容易犯的错误包括:

  1. 忘记先排序直接合并
  2. 合并时没有取两个区间结束点的最大值
  3. 修改正在遍历的列表导致索引错乱
  4. 边界条件处理不完整

调试建议:

  • 打印每次合并前后的区间状态
  • 使用可视化工具绘制区间变化过程
  • 从小规模测试案例开始逐步验证

8. 扩展思考

  1. 如果区间是开区间(1,3)而非闭区间[1,3],算法如何调整?
  2. 如何设计一个类来支持动态区间的插入和合并?
  3. 三维空间中的立方体合并问题该如何解决?

合并区间问题虽然表面简单,但深入理解后可以应用到许多实际场景中。掌握这类问题的解法思路,对培养算法思维和解决实际问题都有很大帮助。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/31 4:24:46

FX2N-4AD模拟量输入模块实战调试与排障指南

1. 这块“黑盒子”到底在PLC系统里干啥——从产线停机故障说起上周在某食品包装厂调试新灌装线&#xff0c;凌晨三点突然报警&#xff1a;主控柜里的FX2N-4AD模块指示灯全灭&#xff0c;触摸屏上温度、压力、流量三个模拟量通道数值集体归零。产线立刻停摆&#xff0c;现场工程…

作者头像 李华
网站建设 2026/10/31 4:24:43

Java图书管理系统开发全流程指南

1. 项目概述&#xff1a;为什么选择图书管理系统作为Java入门项目&#xff1f;图书管理系统作为经典的Java练手项目&#xff0c;几乎出现在所有编程初学者的学习路线中。这个看似简单的系统实际上涵盖了Java核心语法、面向对象思想、基础数据结构和简单数据库操作等关键知识点。…

作者头像 李华
网站建设 2026/10/31 4:23:29

拆解六款开源RAG后,我这样设计自研RAG架构

1. 为什么要对开源RAG下手&#xff1a;自研前最值回票价的一步如果手头要搭一套正经的RAG系统&#xff0c;第一反应大概率不是自己从零写&#xff0c;而是先去翻开源项目。但拿开源项目直接部署和把开源项目拆开看门道&#xff0c;是完全两码事。我团队当初做自研RAG选型时&…

作者头像 李华
网站建设 2026/10/31 4:23:28

AI语音交互重塑智能家居:从原理到STM32落地实践

智能家居圈子里这几年一直有个怪现象&#xff1a;产品越来越多&#xff0c;但真正让人觉得“这东西没白买”的体验并不多。直到AI语音助手开始大规模下沉&#xff0c;情况才有了明显的改观——你对着空气说一句“我回来了”&#xff0c;玄关灯亮起、空调调到26度、窗帘缓缓合上…

作者头像 李华
网站建设 2026/10/31 4:23:11

Cognos实战排错指南:从模型建模到报表调度的12个生产级故障解析

1. 项目概述&#xff1a;这不是一份“速成指南”&#xff0c;而是一份踩过坑、调过参、改过报错的实战手记 “cognos学习笔记”这六个字&#xff0c;看起来平平无奇&#xff0c;像是某位刚接手报表系统的同事随手记在Notepad里的标题。但如果你真去翻过IBM官方文档&#xff0c…

作者头像 李华
网站建设 2026/10/31 4:22:38

格志AK890打印机驱动安装全攻略:从识别到批量部署

1. 先搞清楚"格志AK890"到底是个什么设备很多人第一次看到"格志AK890"这个型号&#xff0c;第一反应是去搜驱动下载页&#xff0c;结果搜出来一堆不相关的型号&#xff0c;越搜越乱。我先把这件事说清楚&#xff1a;格志AK890是一台热敏票据打印机&#xf…

作者头像 李华