70. 爬樓梯

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

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

 

示例 1:

輸入:n = 2
輸出:2
解釋:有兩種方法可以爬到樓頂。
1. 1 階 + 1 階
2. 2 階

示例 2:

輸入:n = 3
輸出:3
解釋:有三種方法可以爬到樓頂。
1. 1 階 + 1 階 + 1 階
2. 1 階 + 2 階
3. 2 階 + 1 階

 

提示:

  • 1 <= n <= 45
class Solution {
    public int climbStairs(int n) {
        int[] dp = new int[n];//dp[i]表示在到第i層有dp[i]種方法
        if (n <= 2)
            return n;
        dp[0] = 1;
        dp[1] = 2;
        
        for (int i = 2; i < n; i++) {
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        return dp[n - 1];
    }
}
/**
動態規劃題目:
1. 確定dp數組
2. dp數組初始化
3. 確定遍歷順序
4. 模擬遍歷*/
class Solution {
    public int climbStairs(int n) {
        if(n==1){
            return 1;
        }
        else if(n==2){
            return 2;
        }
        else {
            int r=0;
            int p=1;
            int q=2;
            for(int i=3;i<=n;i++){
                r=p+q;
                p=q;
                q=r;
            }
            return r;
        }

       
    }
}
class Solution {
    public int climbStairs(int n) {
        // 方法一:動態規劃
        // 定義dp數組
        int[] dp = new int[n + 1]; // 要走到第n階樓梯所以要定義 n + 1, dp[i]表示要走到第i個階梯對應的方法數
        // dp數組初始化
        dp[0] = 1;
        dp[1] = 1; // 走到第一個階梯有1種方法
        // 遍歷遞歸
        for(int i = 2; i <= n; i++) {
            // 狀態轉移方程
            dp[i] = dp[i - 1] + dp[i - 2]; // 可以從第一階樓梯走到也可以從第二階樓梯走到
        }
        // 這是一個狀態轉移問題,狀態為在不同樓梯上的狀態
        return dp[n];
    }
}