面試題10- I. 斐波那契數列【LeetCode劍指offer】

問題:

面試題10- I. 斐波那契數列
在這裏插入圖片描述

思路:

  1. 在這裏我的第一想法是使用遞歸,兩行代碼提交,直接超時,無法通過,仔細一想,確實遞歸的性能並不是很好的。
  2. 非遞歸解法:
    • for循環,遞歸的逆過程,
    • 數組規律:1 1 2 3 5 8 13 ... 下一個數字等於前面兩個數字的和
    • 定義一個式子: sum = a + b ; (a = 0,b=1 )
    • 循環賦值:a = b, b = sum ;
    • 注意取模;
  3. 動態規劃解法:
    • dp[i] = dp[i-1] + dp[i-2] ; 動態遞歸表達式

實現:

class Solution {
    /**
     * 遞歸方法
     * 可以通過,但是超時
     * @param n
     * @return
     */
    /*public int fib(int n) {
        if (n == 0) return 0;
        if (n == 1) return 1;
        return fib(n - 1) + fib(n - 2) %1000000007;
    }*/

    /**
     * 類似動態規劃
     * @param n
     * @return
     */
/*    public int fib(int n) {
        int a = 0, b = 1, sum;
        for (int i = 0; i < n; i++) {
            sum = (a + b) % 1000000007;
            a = b;
            b = sum;
        }
        return a;
    }*/
    
    /**
     * 動態規劃
     * @param n
     * @return
     */
    public int fib(int n) {
        if (n == 0) return 0;
        int dp[] = new int[n];
        dp[0] = 0;
        dp[1] = 1;
        for (int i = 2; i <= n; i++) {
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        return dp[n];
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章