LeetCode 56. 合并区间(Merge Intervals)

56. 合并区间

题目描述

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

解题思路:排序 + 扫描合并

核心思想

  1. 首先按每个区间的起始位置进行排序。

  2. 用一个结果数组 ans 维护合并后的区间:

    • 如果 ans 为空或当前区间 i 和上一个区间 ans[-1] 不重叠,直接加入结果。

    • 否则说明存在重叠,更新 ans[-1] 的右边界为两者右边界的较大值。

✅Python 代码 

class Solution:
    def merge(self, intervals: List[List[int]]) -> List[List[int]]:
        intervals.sort(key=lambda x: x[0])  # 按起始位置升序排序
        ans = []  

        for i in intervals:
            # 如果结果为空,或当前区间与前一个不重叠,直接添加
            if not ans or ans[-1][1] < i[0]:
                ans.append(i)
            else:
                # 否则更新右边界为最大值,进行合并
                ans[-1][1] = max(ans[-1][1], i[1])
        return ans

⏱️复杂度分析 

类型 复杂度 说明
时间复杂度 O(n log n) 排序耗时为主,其余遍历是 O(n)
空间复杂度 O(log n)~O(n) 取决于排序实现方式或输出规模

图示讲解 

以输入 [[1,3],[2,6],[8,10],[15,18]] 为例: 

排序后:      [1,3]  [2,6]  [8,10]  [15,18]

步骤一:合并 [1,3] 和 [2,6] ⇒ [1,6]
步骤二:当前区间 [8,10] 与 [1,6] 不重叠 ⇒ 加入
步骤三:当前区间 [15,18] 与 [8,10] 不重叠 ⇒ 加入

最终结果: [[1,6], [8,10], [15,18]]

常见错误 

错误点 说明
忽略排序步骤 未排序会导致合并逻辑出错
判断条件写错 <=< 混淆 应判断 ans[-1][1] < i[0]
直接覆盖区间而不是取最大值 合并时必须保留最大右边界值

✅总结 

  • 本题是「区间合并类」的经典题型,先排序后合并是固定模板。

  • 适用于处理时间段合并、会议安排等实际场景问题。

如果你觉得本题有帮助,欢迎点赞 + 收藏!持续刷题总结,共同提升算法功力。 

你可能感兴趣的:(leetcode,算法,职场和发展)