leetcode hot100 56.合并区间 medium

python 复制代码
class Solution:
    def merge(self, intervals: List[List[int]]) -> List[List[int]]:

        if not intervals:
            return []

        # 先按起始位置,排序区间
        intervals.sort(key=lambda x: x[0])      

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

        # 比较res的最后一个区间,和intervals的下一个区间
        for i in range(1, len(intervals)):

            if res[-1][1] >= intervals[i][0]:   # end(i)>=start(i+1) 相交

                #  # 合并区间,更新 res 中最后一个区间的结束位置
                res[-1][1] =  max(res[-1][1], intervals[i][1]) 

            else:
                res.append(intervals[i])

        return res
        

易错点总结:

  1. 未按起始位置排序区间

错误:如果区间没有排序,直接进行合并可能会导致错误的结果。排序是合并区间的第一步。

原因:排序后,我们可以按顺序遍历区间,确保每次只需要比较当前区间与前一个合并后的区间。

正确做法:使用 intervals.sort(key=lambda x: x[0]) 按区间的起始位置排序。

  1. 合并区间时更新错误的区间

错误:在合并时直接更新 res[i][1],而不是 res[-1][1]。

原因:合并后的区间应更新最后一个已合并的区间,而不是当前正在遍历的区间。

正确做法:合并时应始终更新 res[-1][1],即 res 中最后一个区间的结束位置。

  1. 错误地重复添加区间到结果列表

错误:合并时,不小心在合并后再次添加区间,导致区间重复。

原因:如果两个区间合并,应该只更新 res[-1][1],而不是重复添加 intervals[i]。

正确做法:只有在无法合并时,才将当前区间加入结果列表。

  1. 索引越界或遗漏区间

错误:有时在遍历时错误地使用 i 或 i+1,导致遗漏某些区间或发生越界错误。

原因:要确保遍历区间时使用正确的索引。

正确做法:使用从 i = 1 开始的遍历,且要确保每次操作的是 res[-1]。

  1. 初始化 res 时错误地选择了区间

错误:如果初始化时错误地选择了 res = [] 而不是 res = [intervals[0]],将导致 res 列表为空,无法进行合并操作。

原因:初始化结果列表时,应该先将第一个区间加入 res,然后再处理后续区间。

正确做法:res = [intervals[0]]。

  1. 漏掉区间合并后的逻辑

错误:有时会在判断是否合并后直接跳过该区间的处理,未正确更新合并后的区间。

原因:合并后应立即更新结束位置,并继续处理下一个区间。

正确做法:合并区间时,更新 res[-1][1] 后继续检查下一个区间。

为什么要先排序

两个区间 [a, b] 和 [c, d] 重叠的完整数学条件是:

a ≤ d(第一个区间的起点 ≤ 第二个区间的终点)

c ≤ b(第二个区间的起点 ≤ 第一个区间的终点)

排序的核心作用就是通过调整区间顺序,消除对 a ≤ d 的显式判断,使得我们只需关注 c ≤ b 这一个条件

python 复制代码
class Solution:
    def merge(self, intervals: List[List[int]]) -> List[List[int]]:
        if not intervals:
            return []

        intervals.sort(key=lambda x:x[0])  #排序依据是子列表中的第一个数字

        res = [intervals[0]]  # 初始化时直接将第一个区间添加到结果列表


        for i in range(1, len(intervals)):
            lastend = res[-1][1]

            if lastend >= intervals[i][0]:  # 上一个区间的结束点,大于等于当前区间的开始点,
                # 当前区间合并到上一个区间
                res[-1][1] =  max(lastend, intervals[i][1])
            else:
                res.append(intervals[i])

        return res
相关推荐
我是咸鱼不闲呀21 分钟前
力扣Hot100系列22(Java)——[图论]总结(岛屿数量,腐烂的橘子,课程表,实现Trie(前缀树))
java·leetcode·图论
阿Y加油吧1 小时前
力扣打卡——搜索二维矩阵、相交链表
线性代数·leetcode·矩阵
普贤莲花1 小时前
【2026年第11周---写于20260322】
程序人生·算法·leetcode
小白自救计划1 小时前
力扣知识点杂集
算法·leetcode·哈希算法
承渊政道2 小时前
【优选算法】(实战体验滑动窗口的奇妙之旅)
c语言·c++·笔记·学习·算法·leetcode·visual studio
承渊政道3 小时前
【优选算法】(实战感悟二分查找算法的思想原理)
c++·笔记·学习·算法·leetcode·visual studio code
重生之我是Java开发战士3 小时前
【递归、搜索与回溯】记忆化搜索:斐波那契数列,不同路径,最长递增子序列,猜数字游戏II,矩阵中最长递增路径
算法·leetcode·深度优先
爱吃涮毛肚的肥肥(暂时吃不了版)3 小时前
Leetcode——181.超过经理收入的员工
算法·leetcode·职场和发展
Charlie_lll3 小时前
力扣解题-接雨水
算法·leetcode
We་ct3 小时前
LeetCode 74. 搜索二维矩阵:两种高效解题思路
前端·算法·leetcode·矩阵·typescript·二分查找