LeetCode 1137[第N個泰波那契數]

EricsT發表於2024-11-07

題目

連結

LeetCode 1137[第N個泰波那契數]

詳情

LeetCode 1137[第N個泰波那契數]

例項

例項1

LeetCode 1137[第N個泰波那契數]

例項2

LeetCode 1137[第N個泰波那契數]

提示

LeetCode 1137[第N個泰波那契數]

題解

思路一[遞迴]

當 n 為 0, 1, 2 時,直接返回對應的值

當 n 大於 2 時,開始用 f(n+3) = f(n) + f(n+1) + f(n+2) 來遞迴求值

程式碼一[此程式碼在力扣會超出時間限制]

class Solution {
public:
    int tribonacci(int n) {
        
        if (0 == n)
            return 0;
        
        if ((1 == n) || (2 == n))
            return 1;

        return tribonacci(n - 3) + tribonacci(n - 2) + tribonacci(n - 1);
    }
};

思路二[迴圈代替遞迴]

當 n 為 0, 1, 2 時,直接返回對應的值

當 n 大於 2 時,開始用 f(n+3) = f(n) + f(n+1) + f(n+2) 來遞迴求值

由於遞迴是不停的複製貼上,在執行時需要大量的時間,當 n 數值過大時,就會超過力扣官方限制的時間

因此此處採用迴圈代替遞迴的方法

此處的迴圈體為: f(n+3) = f(n) + f(n+1) + f(n+2)

迴圈由 3 開始,由 n 結束,依次進入迴圈體求值,直到求出最後的 f(n) 的值並返回

程式碼二[此為成功程式碼]

class Solution {
public:
    int tribonacci(int n) {
        
        if (0 == n)
            return 0;
        
        if ((1 == n) || (2 == n))
            return 1;

        int a0 = 0, a1 = 1, a2 = 1;

        int iRet = 0;

        for (int i = 3; i < n + 1; i++)
        {
            iRet = a0 + a1 + a2;

            a0 = a1;
            a1 = a2;
            a2 = iRet;
        }

        return iRet;
    }
};

相關文章