435. 无重叠区间

难度:中等 | 主题:贪心——按右端点排序

题目

给定区间集合 intervals,求最少移除多少个区间可以使剩余区间互不重叠。

示例:

 
[[1,2],[2,3],[3,4],[1,3]] → 1
 
移除 [1,3] 即可
 

思路

先讲个故事:会议室的预定

你要安排尽可能多的会议,每个会议有起止时间。怎么做?

参考答案是:选结束最早的会议。因为结束早,留给后面的时间就多。

本题换个问法:最少移除几个 = 总数 - 最多能保留几个。找最多不重叠区间就是经典的”活动选择”贪心。


引导式推导:从区间调度到最少移除

等价转换:最少移除 = 总数 - 最多不重叠区间数。

贪心策略

  1. 按区间右端点升序排序

  2. 维护上一个保留区间的 end

  3. 如果新区间左端点 ≥ end,保留(更新 end);否则移除


graph LR

    subgraph 按右端点排序

        A["排序后区间"] --> B{"左端点 ≥ end?"}

        B -->|是| C["保留<br/>更新 end"]

        B -->|否| D["移除<br/>(因为它结束更晚)"]

    end

为什么按右端点排序最优? 右端点越小,留给后面的空间越大。选结束最早的,留给后面的最多。


代码

 
def eraseOverlapIntervals(self, intervals):
 
    if not intervals:
 
        return 0
 
    intervals.sort(key=lambda x: x[1])
 
    count = 1
 
    end = intervals[0][1]
 
    for i in range(1, len(intervals)):
 
        if intervals[i][0] >= end:
 
            count += 1
 
            end = intervals[i][1]
 
    return len(intervals) - count
 

复杂度

指标解释
时间O(n log n)排序
空间O(1)原地排序

实战考量

频率分析

区间贪心经典题,常见。约 30% 常会从区间问题切入贪心。

延伸思考

Q:为什么按右端点排序而不是左端点?

A:按右端点保证每次选结束最早的,留给后面最大空间。按左端点会优先选长的区间(左端点早结束晚),不一定最优。

Q:如果要求移除的区间总长度最小呢?

A:变成不同问题,可能需要 DP(类似加权区间调度)。

Q:如果区间是环形的呢?

A:环形区间调度,考虑首尾相连的特殊情况,枚举断开点。

Q:和 452用最少数量的箭引爆气球 什么关系?

A:452 是找最少覆盖点(相交区间用一箭射穿),本题是找最多不重叠区间。思路相反但方法相同。

易错点

  • 排序 key 是 x[1](右端点),不是 x[0]

  • 不重叠条件是 >=(闭区间端点相等不算重叠)

  • 返回的是移除数,不是保留数


生活类比

会议室预订 → 选结束最早的

你想在一天里排最多的会议。直觉会选”开始最早”的,

但正确做法是选”结束最早”的——早结束早散场,给后面的会议腾时间。

就像约会安排:先约那个走得早的人,晚上还能再约一场。

结束得越早,选择空间越大。


相关题目

题目关系
452用最少数量的箭引爆气球区间覆盖问题,思路类似
56合并区间区间合并
763划分字母区间分段贪心

→ 返回题单:LeetCode学习路线图 > 十一、贪心

速记卡(面试闪卡)

Q1:一句话讲清「435. 无重叠区间」到底是什么?

A:最少移除几个区间让剩余互不重叠 = 总数 − 最多不重叠区间数,按右端点贪心选最早结束的。

Q2:题目本质 —— 怎么理解?

A:像安排会议:每个会议有起止时间,想排最多场。直觉选「开始最早」会错——正确是选「结束最早」的,早散场给后面腾时间。结束得越早,选择空间越大。英语叫 Interval Scheduling(区间调度)。

Q3:思路:按右端点排序 —— 怎么理解?

A:等价转换:最少移除 = 总数 − 最多不重叠数。贪心策略:区间按右端点升序排,维护上一个保留区间的 end,新区间左端点 ≥ end 就保留(更新 end),否则移除。右端点越小留给后面空间越大。

Q4:代码要点 —— 怎么理解?

A:sort(key=lambda x: x[1]) 按右端点排;count 从 1 起,遍历时满足 intervals[i][0] >= end 就 count++、更新 end;返回 len − count。不重叠条件是 >=(闭区间端点相等不算重叠)。

Q5:复杂度与变体 —— 怎么理解?

A:时间 O(n log n)(排序),空间 O(1)(原地)。变体:求移除总长度最小变成加权区间调度需 DP;环形区间要枚举断开点;452 引爆气球是「最少覆盖点」,思路相反方法相同。

Q6:核心速记主线有哪些?

  • 最少移除数 = 总数 − 最多不重叠区间数

  • 按右端点升序排序,贪心选最早结束

  • 不重叠判断用 >=,返回移除数非保留数

  • 时间 O(n log n)、空间 O(1);452 气球题思路相反

口诀

A:无重叠区间

右端排序最早收

结束越早空间大

贪心移除不用愁

相关链接