题目描述
思路解析动画文字版
核心口诀:能接尾就接尾,不能接就起一条新三连,都不行就 false。为什么优先接尾?因为接尾不浪费、还能让已有短序列变长,更容易达标。下面每一帧都在套这套规则。
第一步:数一遍每个数有几个,填进 cnt(剩余可用次数)。need 现在全是 0,因为还没有任何子序列在等着被接。
先把 need 读懂:need[x] 大于 0,就表示前面有现成的子序列结尾在 x-1,正张着嘴等一个 x。接下来从第 0 个开始扫。
扫到第 0 个 1。它还有剩(cnt[1]=1)。先查 need[1]=0:有没有序列正等着接 1?
没人等 1,那就用 1、2、3 现起一条长度 3 的新序列(绿色)。把 2、3 各扣 1 表示被领走,这条新序列结尾是 3,改成等 4:need[4] 加 1。
扫到第 1 个 2,但 cnt[2] 已经是 0,说明这个 2 早就被前面某条序列取走了,跳过它。
2 没库存了,跳过。两张表都不动,继续看下一个。
扫到第 2 个 3。它还有剩(cnt[3]=1)。先查 need[3]=0:有没有序列正等着接 3?
没人等 3,那就用 3、4、5 现起一条长度 3 的新序列(绿色)。把 4、5 各扣 1 表示被领走,这条新序列结尾是 5,改成等 6:need[6] 加 1。
扫到第 3 个 3,但 cnt[3] 已经是 0,说明这个 3 早就被前面某条序列取走了,跳过它。
3 没库存了,跳过。两张表都不动,继续看下一个。
扫到第 4 个 4。它还有剩(cnt[4]=1)。先查 need[4]=1:有没有序列正等着接 4?
有序列在等 4!把 4 接上去(绿色)。这条序列结尾从 3 变成 4,于是它改成等 5:need[4] 减 1、need[5] 加 1。优先接尾,不浪费。
扫到第 5 个 4,但 cnt[4] 已经是 0,说明这个 4 早就被前面某条序列取走了,跳过它。
4 没库存了,跳过。两张表都不动,继续看下一个。
扫到第 6 个 5。它还有剩(cnt[5]=1)。先查 need[5]=1:有没有序列正等着接 5?
有序列在等 5!把 5 接上去(绿色)。这条序列结尾从 4 变成 5,于是它改成等 6:need[5] 减 1、need[6] 加 1。优先接尾,不浪费。
扫到第 7 个 5,但 cnt[5] 已经是 0,说明这个 5 早就被前面某条序列取走了,跳过它。
5 没库存了,跳过。两张表都不动,继续看下一个。
扫完回放一下分配结果。绿色这 5 个是第一条 [1,2,3,4,5],剩下灰色的 3、4、5 正好是第二条 [3,4,5],两条都长度 ≥ 3。
全部扫完,一路都没卡住。8 个数正好拆成两条:[1,2,3,4,5] 和 [3,4,5],两条都达标,返回 true。need 里残留的几个 6 只是「曾经等过」的记号,没有未完成的短序列。
边界先想清:刚好一条 3 可以,多出 1 个落单就 false。
两个高频追问:贪心为何正确、与 LC128 的区别。
参考代码
from __future__ import annotationsfrom typing import *from collections import *from functools import *from itertools import *from math import *from heapq import *from bisect import *class Solution: def isPossible(self, nums: List[int]) -> bool: d = defaultdict(list) for v in nums: if h := d[v - 1]: heappush(d[v], heappop(h) + 1) else: heappush(d[v], 1) return all(not v or v and v[0] > 2 for v in d.values())复杂度
- 时间:O(n log n),参考代码每个结尾值挂最小堆,每次接尾做一次堆操作带 log;动画演示的 cnt/need 哈希贪心版均摊 O(1),可做到 O(n)
- 空间:O(n),每个结尾值一个堆(或两张哈希表)最多记 O(n) 个元素
易错点
面试追问把动画讲成自己的话
追问为什么「优先接尾」一定是对的,不会错过更优解?
追问这题和「最长连续序列(LC128)」有何不同?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
前K个高频单词
LeetCode 692 · 中等 · 沿着 堆套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题