目录
力扣链接如下:
https://leetcode.cn/problems/n-th-tribonacci-number/
泰波那契序列 Tn 定义如下:
T0 = 0, T1 = 1, T2 = 1, 且在 n >= 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2
给你整数 n
,请返回第 n 个泰波那契数 Tn 的值。
示例 1:
输入:n = 4 输出:4 解释: T_3 = 0 + 1 + 1 = 2 T_4 = 1 + 1 + 2 = 4
示例 2:
输入:n = 25 输出:1389537
提示:
0 <= n <= 37
- 答案保证是一个 32 位整数,即
answer <= 2^31 - 1
。
动态规划五部曲:
一. 状态表示
使用一个一维数组来表示状态,在这个题目中创建一个一维数组,用dp[i]表示第i个状态的值。
二. 状态转移方程
从题目中T0 = 0, T1 = 1, T2 = 1, 且在 n >= 0 的条件下Tn+3 = Tn + Tn+1 + Tn+2我们可以得出,dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3],比如说,第3个数就是dp[3] = dp[3 - 1] + dp[3 - 2] + dp[3 - 3]就是1+1+0=2。
三. 初始化
保证数组不越界,从0开始,前面三个数已经告诉我们了,所以可以写一个if语句判断直接return就行,我我们从第三个数开始,因为如果求的是第1个数带入dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3]方程,就会发现dp[1-2]为负数,此时数组越界。
四. 填表顺序
因为我们要保证求的数前三位已经被计算出,所以从左往右开始计算。
五. 返回值
在这道题中,最后应该返回dp[n]的值。
代码如下
class Solution {
public int tribonacci(int n) {
if(n==0){
return 0;
}
if(n==1||n==2){
return 1;
}
int[] dp=new int[n+1];
dp[0]=0;dp[1]=dp[2]=1;
for(int i=3;i<=n;i++){
dp[i]=dp[i-3]+dp[i-2]+dp[i-1];
}
return dp[n];
}
}
空间优化
这道题可以有一个空间优化
我们可以用一些变量来代替,众所周知,D是由前三个数加起来得出的,我们可以把B赋值给A,C赋值给B,D赋值给C,最后return D即可。
class Solution {
public int tribonacci(int n) {
if(n==0){
return 0;
}
if(n==1||n==2){
return 1;
}
int a = 0, b = 1, c = 1, d = 0;
for(int i = 3; i <= n; i++){
d = a + b + c;
a = b; b = c; c = d;
}
return d;
}
}