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

相关推荐
哈哈不让取名字18 小时前
基于C++的爬虫框架
开发语言·c++·算法
幻云201018 小时前
Python深度学习:从筑基到登仙
前端·javascript·vue.js·人工智能·python
仰望星空@脚踏实地19 小时前
本地Python脚本是否存在命令注入风险
python·datakit·命令注入
LOnghas121120 小时前
果园环境中道路与树木结构检测的YOLO11-Faster语义分割方法
python
Lips61120 小时前
2026.1.20力扣刷题笔记
笔记·算法·leetcode
2501_9413297221 小时前
YOLOv8-LADH马匹检测识别算法详解与实现
算法·yolo·目标跟踪
洛生&21 小时前
Planets Queries II(倍增,基环内向森林)
算法
小郭团队21 小时前
1_6_五段式SVPWM (传统算法反正切+DPWM2)算法理论与 MATLAB 实现详解
嵌入式硬件·算法·matlab·dsp开发
小郭团队21 小时前
1_7_五段式SVPWM (传统算法反正切+DPWM3)算法理论与 MATLAB 实现详解
开发语言·嵌入式硬件·算法·matlab·dsp开发
鱼跃鹰飞21 小时前
Leetcode347:前K个高频元素
数据结构·算法·leetcode·面试