1137. 第 N 个泰波那契数
大约 3 分钟
1137. 第 N 个泰波那契数
- 标签:记忆化搜索、数学、动态规划
- 难度:简单
题目链接
题目大意
描述:给定一个整数 。
要求:返回第 个泰波那契数。
说明:
- 泰波那契数:,且在 的条件下,。
- 。
- 答案保证是一个 32 位整数,即 。
示例:
- 示例 1:
输入:n = 4
输出:4
解释:
T_3 = 0 + 1 + 1 = 2
T_4 = 1 + 1 + 2 = 4
- 示例 2:
输入:n = 25
输出:1389537
解题思路
思路 1:记忆化搜索
- 问题的状态定义为:第 个泰波那契数。其状态转移方程为:,且在 的条件下,。
- 定义一个长度为 数组
memo
用于保存一斤个计算过的泰波那契数。 - 定义递归函数
my_tribonacci(n, memo)
。- 当 或者 ,或者 时直接返回结果。
- 当 时,首先检查是否计算过 ,即判断 是否等于 。
- 如果 ,说明已经计算过 ,直接返回 。
- 如果 ,说明没有计算过 ,则递归调用
my_tribonacci(n - 3, memo)
、my_tribonacci(n - 2, memo)
、my_tribonacci(n - 1, memo)
,并将计算结果存入 中,并返回 。
思路 1:代码
class Solution:
def tribonacci(self, n: int) -> int:
# 使用数组保存已经求解过的 T(k) 的结果
memo = [0 for _ in range(n + 1)]
return self.my_tribonacci(n, memo)
def my_tribonacci(self, n: int, memo: List[int]) -> int:
if n == 0:
return 0
if n == 1 or n == 2:
return 1
if memo[n] != 0:
return memo[n]
memo[n] = self.my_tribonacci(n - 3, memo) + self.my_tribonacci(n - 2, memo) + self.my_tribonacci(n - 1, memo)
return memo[n]
思路 1:复杂度分析
- 时间复杂度:。
- 空间复杂度:。
思路 2:动态规划
1. 划分阶段
我们可以按照整数顺序进行阶段划分,将其划分为整数 。
2. 定义状态
定义状态 dp[i]
为:第 i
个泰波那契数。
3. 状态转移方程
根据题目中所给的泰波那契数的定义:,且在 的条件下,。,则直接得出状态转移方程为 (当 时)。
4. 初始条件
根据题目中所给的初始条件 确定动态规划的初始条件,即 dp[0] = 0, dp[1] = 1, dp[2] = 1
。
5. 最终结果
根据状态定义,最终结果为 dp[n]
,即第 n
个泰波那契数为 dp[n]
。
思路 2:代码
class Solution:
def tribonacci(self, n: int) -> int:
if n == 0:
return 0
if n == 1 or n == 2:
return 1
dp = [0 for _ in range(n + 1)]
dp[1] = dp[2] = 1
for i in range(3, n + 1):
dp[i] = dp[i - 3] + dp[i - 2] + dp[i - 1]
return dp[n]
思路 2:复杂度分析
- 时间复杂度:。
- 空间复杂度:。