Leetcode題目70.爬樓梯(動態規劃+遞歸-簡單)

題目描述:java

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

每次你能夠爬 1 或 2 個臺階。你有多少種不一樣的方法能夠爬到樓頂呢?blog

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

示例 1:

輸入: 2
輸出: 2
解釋: 有兩種方法能夠爬到樓頂。
1.  1 階 + 1 階
2.  2 階
示例 2:

輸入: 3
輸出: 3
解釋: 有三種方法能夠爬到樓頂。
1.  1 階 + 1 階 + 1 階
2.  1 階 + 2 階
3.  2 階 + 1 階

代碼實現:io

遞歸實現斐波那契數列(報超時,可是一種思路class

class Solution {
    
   public static int climbStairs(int n) {

        if (n == 1 || n == 0) {
            return 1;
        }
        return climbStairs(n - 1) + climbStairs(n - 2);
    }
}

AC解法:記憶中間計算結果,避免重複計算(動態規劃)cli

本問題其實常規解法能夠分紅多個子問題,爬第n階樓梯的方法數量,等於 2 部分之和方法

爬上 n-1階樓梯的方法數量。由於再爬1階就能到第n階
爬上 n-2 階樓梯的方法數量,由於再爬2階就能到第n階
因此咱們獲得公式 dp[n] = dp[n-1] + dp[n-2
同時須要初始化 dp[0]=1 和 dp[1]=1im

class Solution {
    
  public int climbStairs(int n) {

        int[] fac = new int[n + 1];
        fac[0] = 1;
        fac[1] = 1;
        if (n == 1 || n == 0) {
            return fac[n];
        }

        for (int i = 2; i <= n; i++) {
            fac[i] = fac[i - 1] + fac[i - 2];
        }
        return fac[n];
    }
}

時間複雜度:O(N)static

空間複雜度:O(N)

相關文章
相關標籤/搜索