泰波那契序列 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
提示:
链接:https://leetcode-cn.com/problems/n-th-tribonacci-number
状态转移方程都给了,没啥好说的,直接上代码:
class Solution {
public int tribonacci(int n) {
if (n == 0) {
return 0;
}
if (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 - 1] + dp[i - 2] + dp[i - 3];
}
return dp[n];
}
}
运行结果:
image-20210808123148697
我们可以看到,第i位的结果只与其前面三个位置的值有关,所以,可以使用三个变量代替整个DP数组,三个变量进行滚动,将空间复杂度降到O(1),代码如下:
class Solution {
public int tribonacci(int n) {
if (n == 0) {
return 0;
}
if (n <= 2) {
return 1;
}
int a = 0, b = 1, c = 1;
for (int i = 3; i <= n; i++) {
int s = a + b + c;
a = b;
b = c;
c = s;
}
return c;
}
}
运行结果:
image-20210808123756570
其实,这道题我们除了使用迭代以外,还可以使用递归,不过递归的过程中要注意保存之前计算过的值,防止重复计算,比如f(4)=f(3)+f(2)+f(1)
和f(5)=f(4)+f(3)+f(2)
,计算f(4)的时候f(3)和f(2)已经计算过了,所以,计算f(5)的时候直接拿过来用就可以了,代码如下:
class Solution {
public int tribonacci(int n) {
if (n == 0) {
return 0;
}
if (n <= 2) {
return 1;
}
int[] memo = new int[n + 1];
memo[1] = memo[2] = 1;
return dfs(n, memo);
}
private int dfs(int i, int[] memo) {
if (i == 0 || memo[i] != 0) {
return memo[i];
}
memo[i] = dfs(i - 1, memo) + dfs(i - 2, memo) + dfs(i - 3, memo);
return memo[i];
}
}
运行结果如下:
image-20210808124944727