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 关键解题步骤
- 区间排序:首先按照区间的起始点进行排序,这是后续合并操作的基础
- 初始化结果集:将第一个区间加入结果集作为初始比较基准
- 遍历比较:从第二个区间开始,逐个与结果集中最后一个区间比较:
- 如果当前区间与结果集最后一个区间重叠,则合并它们
- 如果不重叠,则将当前区间加入结果集
注意:这里的重叠判断标准是当前区间的起始点是否小于等于结果集最后一个区间的结束点
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,4]和[2,3]
- 刚好相接的区间:如[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 intervals4.2 相关变种问题
- 插入区间:在已排序的不重叠区间列表中插入新区间并合并
- 区间交集:找出两组区间的所有交集
- 会议室安排:判断一个人是否能参加所有会议(本质是检查区间是否重叠)
5. 实际应用中的注意事项
- 区间表示方式:实际问题中区间可能用对象表示而非数组,需要适当调整
- 大数据量处理:当区间数量极大时,考虑分治或并行处理
- 动态区间处理:如果区间会动态增减,需要设计更高效的数据结构
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. 常见错误与调试技巧
新手容易犯的错误包括:
- 忘记先排序直接合并
- 合并时没有取两个区间结束点的最大值
- 修改正在遍历的列表导致索引错乱
- 边界条件处理不完整
调试建议:
- 打印每次合并前后的区间状态
- 使用可视化工具绘制区间变化过程
- 从小规模测试案例开始逐步验证
8. 扩展思考
- 如果区间是开区间(1,3)而非闭区间[1,3],算法如何调整?
- 如何设计一个类来支持动态区间的插入和合并?
- 三维空间中的立方体合并问题该如何解决?
合并区间问题虽然表面简单,但深入理解后可以应用到许多实际场景中。掌握这类问题的解法思路,对培养算法思维和解决实际问题都有很大帮助。