題目描述: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)