[LeetCode] 137. 第 N 個泰波那契數

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];
    }
}
發佈了242 篇原創文章 · 獲贊 3 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章