【LeetCode刷题】合并区间

以数组 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] 可被视为重叠区间。

示例 3:

复制代码
输入:intervals = [[4,7],[1,4]]
输出:[[1,7]]
解释:区间 [1,4] 和 [4,7] 可被视为重叠区间。

提示:

  • 1 <= intervals.length <=
  • intervals[i].length == 2
  • 0 <= starti <= endi <=

解题思路

  1. 特殊情况处理:若输入区间列表为空,直接返回空列表。
  2. 排序区间 :按每个区间的起始值 升序排序(例如示例 3 的[[4,7],[1,4]]排序后变为[[1,4],[4,7]]),确保后续能按顺序检查重叠。
  3. 初始化结果:将排序后的第一个区间存入结果列表,作为合并的起始。
  4. 遍历合并
    • 取当前区间与结果中最后一个已合并的区间对比;
    • 若当前区间的起始值 ≤ 最后区间的结束值,说明两者重叠,更新最后区间的结束值为 "两者结束值的最大值";
    • 若不重叠,直接将当前区间加入结果列表。

示例验证

以示例 1 为例:

  • 输入排序后:[[1,3],[2,6],[8,10],[15,18]]
  • 结果初始化为[[1,3]]
  • 合并[2,6]2 ≤ 3,更新为[[1,6]]
  • 加入[8,10]8 > 6,结果变为[[1,6],[8,10]]
  • 加入[15,18]15 > 10,最终结果为[[1,6],[8,10],[15,18]],与示例一致。

Python代码:

python 复制代码
from typing import List


class Solution:
    def merge(self, intervals: List[List[int]]) -> List[List[int]]:
        # 处理空输入
        if not intervals:
            return []

        # 按区间的起始值升序排序(关键步骤,确保后续能顺序合并)
        intervals.sort(key=lambda x: x[0])

        # 初始化结果列表,存入第一个区间
        result = [intervals[0]]

        # 遍历剩余区间,依次合并
        for curr in intervals[1:]:
            last = result[-1]  # 取结果中最后一个已合并的区间
            # 若当前区间的起始值 <= 最后区间的结束值,说明重叠/相邻,执行合并
            if curr[0] <= last[1]:
                last[1] = max(last[1], curr[1])  # 合并后取最大结束值
            # 否则无重叠,直接加入结果
            else:
                result.append(curr)

        return result


# 测试示例(验证代码正确性)
if __name__ == "__main__":
    solution = Solution()

    # 示例1测试
    intervals1 = [[1, 3], [2, 6], [8, 10], [15, 18]]
    print("示例1输入:", intervals1)
    print("示例1输出:", solution.merge(intervals1))  # 预期: [[1,6],[8,10],[15,18]]

    # 示例2测试
    intervals2 = [[1, 4], [4, 5]]
    print("\n示例2输入:", intervals2)
    print("示例2输出:", solution.merge(intervals2))  # 预期: [[1,5]]

    # 示例3测试
    intervals3 = [[4, 7], [1, 4]]
    print("\n示例3输入:", intervals3)
    print("示例3输出:", solution.merge(intervals3))  # 预期: [[1,7]]

LeetCode提交代码:

python 复制代码
class Solution:
    def merge(self, intervals: List[List[int]]) -> List[List[int]]:
        from typing import List
        # 处理空输入
        if not intervals:
            return []
        
        # 按区间的起始值升序排序(关键步骤,确保后续能顺序合并)
        intervals.sort(key=lambda x: x[0])
        
        # 初始化结果列表,存入第一个区间
        result = [intervals[0]]
        
        # 遍历剩余区间,依次合并
        for curr in intervals[1:]:
            last = result[-1]  # 取结果中最后一个已合并的区间
            # 若当前区间的起始值 <= 最后区间的结束值,说明重叠,合并
            if curr[0] <= last[1]:
                last[1] = max(last[1], curr[1])
            # 否则无重叠,直接加入结果
            else:
                result.append(curr)
        
        return result

程序运行截图展示:

总结

该算法用于合并重叠区间。首先对区间按起始值排序,然后遍历检查相邻区间是否重叠:若当前区间起始值≤前一区间结束值,则合并为更大的区间;否则直接保留。通过排序确保相邻区间可顺序处理,时间复杂度O(nlogn)(排序主导),空间复杂度O(n)。示例验证表明算法能正确处理各种重叠情况,如完全重叠、部分重叠和相邻区间。Python实现简洁高效,适用于LeetCode等编程挑战。

相关推荐
永远都不秃头的程序员(互关)6 分钟前
C++动态数组实战:从手写到vector优化
c++·算法
小徐Chao努力11 分钟前
【Langchain4j-Java AI开发】06-工具与函数调用
java·人工智能·python
无心水13 分钟前
【神经风格迁移:全链路压测】33、全链路监控与性能优化最佳实践:Java+Python+AI系统稳定性保障的终极武器
java·python·性能优化
luoluoal41 分钟前
基于python的小区监控图像拼接系统(源码+文档)
python·mysql·django·毕业设计·源码
水力魔方1 小时前
武理排水管网模拟分析系统应用专题5:模型克隆与并行计算
数据库·c++·算法·swmm
蜂蜜黄油呀土豆1 小时前
Redis 底层实现深度解析:从 ListPack 到哈希表扩容
数据结构·redis·zset·sds·listpack·哈希表扩容
BoBoZz191 小时前
MotionBlur 演示简单运动模糊
python·vtk·图形渲染·图形处理
十八度的天空2 小时前
第01节 Python的基础语法
开发语言·python
BoBoZz192 小时前
GradientBackground 比较不同类型的背景渐变着色模式与坐标转换
python·vtk·图形渲染·图形处理
谈笑也风生2 小时前
经典算法题型之排序算法(三)
java·算法·排序算法