LeetCode 1137简单DP 入门
泰波那契数 图解题解
这道题到底在问什么
T0=0, T1=1, T2=1,之后 Tn = Tn−1 + Tn−2 + Tn−3,求第 n 个。
- n
- 6
- 输出
- 13
- 过程
- 0,1,1,2,4,7,13
最优解:一步一步想明白
- 3最直接的写法是递归 T(n)=T(n−1)+T(n−2)+T(n−3)。但算 T6 要算 T5、T4、T3,算 T5 又要算 T4、T3……同一个 T3 被反复展开,调用次数指数级膨胀,n 稍大就卡死。慢就慢在重复子问题。
- 4既然小项被重复算,那就用一排 dp 把每一项的答案记下来,从左往右只算一次。状态 dp[i] = 第 i 个泰波那契数;转移就是把前三项加起来。为什么能这么记?因为 dp[i] 只依赖固定的前三格,前面算好了,后面直接查表,不必重算——这就是重叠子问题变递推。
- 5T0,T1,T2 = 0,1,1先把题目给的种子项填进表:T0=0、T1=1、T2=1。后面四格还空着,等会儿一格一格往右推。表固定 1 行 7 列,全程只覆盖数值、不增删格子。
- 6下一个要算 T3从最左边第一个空格 T3 开始填。它的三个依赖格(T0、T1、T2,蓝色)都已经算好在左边了,所以能直接相加得到它——这就是「从左往右填表」的核心节奏。
- 7T3 = 0+1+1 = 2第一格要算的是 T3。它依赖左边三格 T0、T1、T2(蓝色),直接读表相加 = 0+1+1 = 2。注意:这里不再递归展开,三个依赖都是查表得来的,这就是省下重复计算的转折点。
- 8T4 = 1+1+2 = 4窗口往右滑一格:T4 依赖 T1、T2、T3 = 1+1+2 = 4。其中 T3 是上一步刚算好记下来的,现在直接拿来用,不重算。
- 9T5 = 1+2+4 = 7继续:T5 依赖 T2、T3、T4 = 1+2+4 = 7。每往右一格,依赖的三格也整体右移一位。
- 10T6 = 2+4+7 = 13最后一格 T6 依赖 T3、T4、T5 = 2+4+7 = 13。整张表从左推到右,每格只算一次。
- 11漏 T3 → T6 算成 11负例提醒:泰波那契是前三项相加。如果手滑写成像斐波那契那样只加前两项(T4+T5=11),就会漏掉被框住的 T3=2,答案直接错。三个依赖格一个都不能少。
- 12dp[6] = 13表格最右一格 dp[6] = 13 就是答案:第 6 个泰波那契数。
- 15只依赖前几项的线性递推,都能用「填表 → 一格一格往右推」解决:斐波那契、爬楼梯、泰波那契一脉相承。把大问题拆成「前几项已知的小问题」,正是 DP 的起点。
⚠️ 容易写错的地方
✗ 错:dp[i] = dp[i-1] + dp[i-2](漏第三项)
✓ 对:dp[i] = dp[i-1] + dp[i-2] + dp[i-3]
泰波那契是前三项之和,少加 dp[i-3] 会算出错值(如 T6 错成 11)
✗ 错:没填种子 dp[0]=0,dp[1]=1,dp[2]=1 就开循环
✓ 对:先把前三项种子填好再从 i=3 推
递推从第 3 项才开始,种子没设会让后面全部错位
完整代码(Python)
Python
class Solution:
def tribonacci(self, n):
if n == 0:
return 0
if n <= 2:
return 1
a, b, c = 0, 1, 1
for _ in range(3, n + 1):
a, b, c = b, c, a + b + c
return c套路模板 · 线性递推填表(背下来)
dp = [0] * (n + 1)
dp[前 k 项] = 初始种子 # 递推的起点
for i in range(k, n + 1):
dp[i] = f(dp[i-1], ..., dp[i-k]) # 用前 k 项递推
return dp[n]复杂度
时间复杂度
O(n)
从左到右填表,每格做一次三数相加
空间复杂度
O(n)
dp 数组存 n+1 项;只保留前三项可降到 O(1)
看不够?换成动画再走一遍
上面的推演每一步都对应一帧动画。点开交互动画版,能一步步看着 泰波那契数 的数据怎么变、指针怎么走,还能切 Python / Java / C++ 跟着练。
面试官可能追问
这道题为什么用「入门」,换最直接的暴力解会差在哪?+
入门抓住了本题的结构特征,把暴力解里重复的工作省掉;暴力解通常要多嵌套一层枚举,数据一大就超时。具体对比见上文「暴力解及其卡点」与「最优解逐步推演」两节。
时间复杂度为什么是 undefined?怎么推出来的?+
按上文复杂度小节的推导,时间复杂度为 undefined。
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。