【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等编程挑战。

相关推荐
ranchor6662 小时前
df赋值和.copy的区别(SettingWithCopyWarning)
大数据·人工智能·python
编织幻境的妖2 小时前
Python读写CSV与JSON文件方法
开发语言·python·json
九年义务漏网鲨鱼2 小时前
【大模型微调】QLoRA微调原理及实战
深度学习·算法·大模型·智能体
Q_Q5110082852 小时前
python+springboot+django/flask基于数据挖掘的高考志愿推荐系统
spring boot·python·django·flask·node.js·php
爱笑的眼睛112 小时前
神经网络的骨架:深入解析前向传播的数学本质与工程实现
java·人工智能·python·ai
木头左2 小时前
层次化注意力分配策略在量化交易中的实现与应用
python
Q_Q5110082852 小时前
python+springboot+django/flask基于用户评论主题挖掘的旅游景点推荐系统
spring boot·python·django·flask·node.js
就叫飞六吧2 小时前
pdf转国产ofd格式代码案例-Java
java·python·pdf
xu_yule2 小时前
数据结构(14)二叉树的模拟实现和便利代码
数据结构·算法