题目描述
思路解析动画文字版
记住这套「按右端点排序,左端点能越过 end 就接、否则跳」,下面每一帧都在套它。
先看原始 8 个数对,右端点是乱的:[1,2]、[7,8]、[4,5]、[2,3]、[5,6]、[3,4]、[6,7]、[1,9]。贪心的前提是把它们按右端点排好。
按右端点从小到大排好:[1,2]、[2,3]、[3,4]、[4,5]、[5,6]、[6,7]、[7,8]、[1,9]。这条轴上每个数字就是对应数对的右端点,左端点写在讲解里。现在从左往右贪心扫。
开局:还没接任何数对,把 end 设成极小(这样第一个数对一定能接进来),链长 ans=0。从最左边那个数对开始看。
轮到数对 [1,2](紫色,右端点 2)。它能不能接到链尾,只看它的左端点 1 是否严格大于当前 end = 负无穷。绿色是已接入的,灰色是已跳过的。
1 严格大于 end,能接!把 [1,2] 接进链(变绿),链长涨到 1,并把 end 更新成它的右端点 2(下一个数对要越过的就是这个新门槛)。
轮到数对 [2,3](紫色,右端点 3)。它能不能接到链尾,只看它的左端点 2 是否严格大于当前 end = 2。绿色是已接入的,灰色是已跳过的。
2 没有严格大于 end = 2,接上去会和链尾重叠(红色),跳过 [2,3]。注意:它的右端点不比当前 end 小,留着它只会更挤,丢掉不亏。end 保持 2。
轮到数对 [3,4](紫色,右端点 4)。它能不能接到链尾,只看它的左端点 3 是否严格大于当前 end = 2。绿色是已接入的,灰色是已跳过的。
3 严格大于 end,能接!把 [3,4] 接进链(变绿),链长涨到 2,并把 end 更新成它的右端点 4(下一个数对要越过的就是这个新门槛)。
轮到数对 [4,5](紫色,右端点 5)。它能不能接到链尾,只看它的左端点 4 是否严格大于当前 end = 4。绿色是已接入的,灰色是已跳过的。
4 没有严格大于 end = 4,接上去会和链尾重叠(红色),跳过 [4,5]。注意:它的右端点不比当前 end 小,留着它只会更挤,丢掉不亏。end 保持 4。
轮到数对 [5,6](紫色,右端点 6)。它能不能接到链尾,只看它的左端点 5 是否严格大于当前 end = 4。绿色是已接入的,灰色是已跳过的。
5 严格大于 end,能接!把 [5,6] 接进链(变绿),链长涨到 3,并把 end 更新成它的右端点 6(下一个数对要越过的就是这个新门槛)。
轮到数对 [6,7](紫色,右端点 7)。它能不能接到链尾,只看它的左端点 6 是否严格大于当前 end = 6。绿色是已接入的,灰色是已跳过的。
6 没有严格大于 end = 6,接上去会和链尾重叠(红色),跳过 [6,7]。注意:它的右端点不比当前 end 小,留着它只会更挤,丢掉不亏。end 保持 6。
轮到数对 [7,8](紫色,右端点 8)。它能不能接到链尾,只看它的左端点 7 是否严格大于当前 end = 6。绿色是已接入的,灰色是已跳过的。
7 严格大于 end,能接!把 [7,8] 接进链(变绿),链长涨到 4,并把 end 更新成它的右端点 8(下一个数对要越过的就是这个新门槛)。
轮到数对 [1,9](紫色,右端点 9)。它能不能接到链尾,只看它的左端点 1 是否严格大于当前 end = 8。绿色是已接入的,灰色是已跳过的。
1 没有严格大于 end = 8,接上去会和链尾重叠(红色),跳过 [1,9]。注意:它的右端点不比当前 end 小,留着它只会更挤,丢掉不亏。end 保持 8。
扫完全部 8 个数对,绿色这 4 个就是接成的最长链:[1,2] → [3,4] → [5,6] → [7,8]。灰掉的都是接不进来的。答案 4。
边界要点:单数对返回 1、相邻边界相等接不上、负数同样适用。
两个高频追问:与 DP 的取舍、与区间贪心家族的关系。
参考代码
from typing import Listclass Solution: def findLongestChain(self, pairs: List[List[int]]) -> int: pairs.sort(key=lambda x: x[1]) ans = 0 end = -10**18 for a, b in pairs: if a > end: ans += 1 end = b return ans复杂度
- 时间:O(n log n),排序占主导,之后扫描只 O(n)
- 空间:O(1),只用 ans、end 两个变量(排序原地)
易错点
面试追问把动画讲成自己的话
追问这题也能用动态规划,和贪心比怎么选?
追问它和「无重叠区间 LC435」是同一类吗?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
只有两个键的键盘
LeetCode 650 · 中等 · 沿着 动态规划套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题