1 題目描述
泰波那契序列 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。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/n-th-tribonacci-number
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
2 解題思路
- 解法1 遞歸+dp求解
題目給出了遞推式,很容易想到用自頂向下的遞歸寫法,把遞歸式改爲:Tn = Tn-3 + Tn-2 + Tn-1
但是一提交發現超時,原因是這個遞推式用到了前三項的和,而每次求前三項的時候都是從頭開始遞歸求,顯然做了很多重複操作。
所以用到了dp數組存取之前求過的結果,當下次要的時候直接取。
- 解法2 遞歸+數組 求解
用函數遞歸好像不行,改用數組,簡單又好理解,但是速度慢了點…
3 解決代碼
- 解法1
class Solution {
//數組要定義在外面,不然會超出時間限制
int dp[] = new int[38];
public int tribonacci(int n) {
//之前的計算結果保存在數組中,防止重複計算
if(dp[n] != 0){
return dp[n];
}
//第一步,尋找終止條件,這個在題目中是有提示的
if(n==0){
return 0;
}
else if(n ==1 || n==2){
return 1;
}
else{
//第二步,搞清本層遞歸到底應該做什麼
int res = tribonacci(n-1) + tribonacci(n-2)+tribonacci(n-3);
//第三步,確定返回值,這個返回的就應該是第n個數
//這一步,將結果保存在數組中,後面用到可以直接取出來
dp[n] = res;
return res;
}
}
}
- 解法2
class Solution {
public int tribonacci(int n) {
//第一步,確定遞歸終止條件
if(n == 0){
return 0;
}
if(n==1|| n==2){
return 1;
}
//第二步,搞清楚本層遞歸要做什麼
int[] arr = new int[n + 1];
arr[0] = 0;
arr[1] = 1;
arr[2] = 1;
for(int i = 3; i<= n; i++){
arr[i] = arr[i-1] + arr[i-2] + arr[i-3];
}
//第三步,確定返回值
return arr[n];
}
}