第N个泰波那契数-LeetCode
1137. 第 N 个泰波那契数-LeetCode
🎯 问题描述(来源于LeetCode)
描述:泰波那契序列 Tn 定义如下:
说明:
-
答案保证在 32 位有符号整数范围内(即 )。
-
示例:
-
示例 1:
1 | 输入:n = 4 |
- 示例 2:
1 | 输入:n = 25 |
💻 解题思路
思路1:记忆化搜索 (Memoization Search)
核心思想:
泰波那契数列是斐波那契数列的变种,同样具有明显的重叠子问题性质。如果使用朴素递归(直接函数调用自己),时间复杂度将是指数级的,导致超时。
为了解决这个问题,我们采用记忆化搜索(动态规划的自顶向下实现):
- 查表:在计算前,先检查该状态是否已经计算过。
- 计算:如果未计算过,递归计算其依赖的前三个状态之和。
- 存表:计算出结果后,立即将其存入哈希表(字典)中,供后续调用复用。
算法步骤:
- 初始化一个字典
table,预存基准情况()。 - 定义递归函数
dp(i):- 如果
i在table中,直接返回table[i]。 - 否则,计算
dp(i-1) + dp(i-2) + dp(i-3)。 - 将计算结果存入
table[i]并返回。
- 如果
- 调用
dp(n)并返回结果。
思路1:代码实现
1 | class Solution: |
思路1:📊 性能分析
提交结果
- 运行时间:0ms击败100.00%
- 内存消耗:19.13MB击败40.66%
复杂度验证
- 时间复杂度: O(N)O(N)
- 解析:每个状态
i从0到n最多只会被计算一次。后续的重复访问都是通过字典 O(1)O(1) 查找完成的。
- 解析:每个状态
- 空间复杂度: O(N)O(N)
- 解析:主要由两部分组成。一是递归调用栈的深度,最深为 O(N)O(N) ;二是字典
table存储了 NN 个键值对,空间为 O(N)O(N) 。
- 解析:主要由两部分组成。一是递归调用栈的深度,最深为 O(N)O(N) ;二是字典
思考
- 为什么不能直接写
table[i-1]?- 在代码逻辑中,必须调用
dp(i-1)而不是直接访问table[i-1]。因为如果直接访问table[i-1],而i-1还没有被存入字典(即尚未计算),Python 会直接抛出KeyError。而调用dp(i-1)函数,函数内部会自动处理“查表-计算-存表”的完整逻辑,保证了安全性。
- 在代码逻辑中,必须调用
- 递归 vs 迭代:
- 这种写法是自顶向下的(Top-Down)。它更符合人类的直觉(从结果反推条件)。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 笺札!






