§1
题目描述
给一组区间,移除最少数量的区间,使剩余区间互不重叠。
intervals = [[1,2],[2,3],[3,4],[1,3]]
输出 = 1
§2
思路解析动画文字版
结束越早,给后面留下的空间越大,这是区间调度的经典贪心。
① 按区间「右端 end」从小到大排序:按右端排——这是区间调度贪心的关键,不是按左端。
② 第一个 [1,2] 一定保留,end = 2:右端最小的先留下,后面都和它比。
③ [2,3]:start 2 ≥ end 2 → 不重叠,保留,end = 3:start ≥ end 就不重叠,可以接着留。
④ [1,3]:start 1 < end 3 → 重叠 → 删除(count=1):重叠就删被处理的这个(它右端更大或相等,留它更亏)。
⑤ [3,4]:start 3 ≥ end 3 → 保留,end = 4:继续贪心:能不删就不删。
⑥ 答案:保留 3 个,删除 4 − 3 = 1:最少删除数 = 总数 − 最多能保留的不重叠区间数。
⑦ 为什么按右端排?(贪心正确性):按右端贪心=区间调度最优,可用交换论证证明。
右端点越小,越不会挡住后面的区间。
边界三连:本题真边界:单个、相接、全重叠。
面试官常追问:三个高频追问,区间调度必备。
§3
参考代码
class Solution: def eraseOverlapIntervals(self, intervals): intervals.sort(key=lambda x: x[1]) # 按右端 end 排序 end = float("-inf") keep = 0 for s, e in intervals: if s >= end: # 不重叠 → 保留 keep += 1 end = e return len(intervals) - keep # 总数 − 保留 = 删除数看懂代码不等于写得出。盖住上面,自己默写一遍试试。卡在哪一行说不清,就点右下角问小欧。
§4
复杂度
- 时间复杂度:O(n log n),排序区间
- 空间复杂度:O(1),只用 keep 和 end
§5
可套用的代码模板
记牢:按右端排序 → 不重叠(start ≥ end)就 keep++ 并更新 end → 删除数 = 总数 − keep。
Python
# 区间调度贪心 骨架intervals.sort(key=lambda x: x[1]) # 按右端 end 排序end = float("-inf")keep = 0for s, e in intervals: if s >= end: # 与上一个保留区间不重叠 keep += 1 end = ereturn len(intervals) - keep # 删除数 = 总数 − 保留数§6
易错点
✗ 错误写法:按左端点排序后贪心
✓ 正确写法:按右端点排序
结束早才给后续留下更多空间
✗ 错误写法:把 start == end 当重叠
✓ 正确写法:条件是 start >= end 可保留
区间端点相接不算重叠
§
面试追问把动画讲成自己的话
追问核心思路是什么?
按区间右端 end 升序排序,贪心地从左到右保留与「上一个保留区间」不重叠(start ≥ end)的区间、更新 end;最少删除数 = 总数 − 保留数。
追问为什么按右端排序是最优的?
交换论证:在任意最优解里,把第一个保留区间换成「右端最小」的那个不会变差(它结束更早、不会挡住更多后续区间)。逐步替换即得按右端贪心的最优性。这就是经典的区间调度问题。
追问复杂度多少?
排序 O(n log n) 主导,扫描 O(n),额外空间 O(1)。
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
下一题 · 区间 4/6
→会议室
LeetCode 252 · 简单 · 沿着 区间 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
299道动画图解
37节语音讲解
28课数据结构
¥0.27折合 / 天
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
¥99 开通年卡 →
想成体系刷透这类套路?去图解算法专题