1. 程式人生 > 實用技巧 >LeetCode 遞迴篇(70)

LeetCode 遞迴篇(70)

70. 爬樓梯

假設你正在爬樓梯。需要 n 階你才能到達樓頂。

每次你可以爬 1 或 2 個臺階。你有多少種不同的方法可以爬到樓頂呢?

注意:給定 n 是一個正整數。

示例 1:

輸入: 2
輸出: 2
解釋: 有兩種方法可以爬到樓頂。

  1. 1 階 + 1 階
  2. 2 階
    示例 2:

輸入: 3
輸出: 3
解釋: 有三種方法可以爬到樓頂。

  1. 1 階 + 1 階 + 1 階
  2. 1 階 + 2 階
  3. 2 階 + 1 階

思路

//動態規劃 二維矩陣
//遞迴,即斐波那契數列 可以有以下四個解法
//找最近重複性???

solution1 傻遞迴

//45階時超時
class Solution {
    public int climbStairs(int n) {
        if (n<=2) return n;
        else return climbStairs(n-1) + climbStairs(n-2);
    }
}

solution2 迭代

class Solution {
    public int climbStairs(int n) {
        if (n<=2) return n;
        int a = 1,b=2;
        while(n-->2){ //執行與後面的數的差次數
            int sum= a + b;
            a = b;
            b = sum;
        } 
        return b;
    }
}

solution3 高階遞迴

//自頂向下 對計算過的進行儲存
class Solution {
    int[] cache = new int[100];
    public int climbStairs(int n) {
        if (n<=2) return n;
        else if (cache[n] != 0) return cache[n];
        else return cache[n] = climbStairs(n-1) + climbStairs(n-2);
    }
}

solution3 動態規劃

//從下到上至要抵達的臺階
class Solution {
    public int climbStairs(int n) {
        int[] cache = new int[n+1];
        cache[1] = 1;
        cache[0] = 1;
        for (int i = 2;i<=n;i++){
            cache[i] = cache[i-1]+cache[i-2];
        } 
        return cache[n];
    }
}