LeetCode 遞迴篇(70)
阿新 • • 發佈:2020-07-02
70. 爬樓梯
假設你正在爬樓梯。需要 n 階你才能到達樓頂。
每次你可以爬 1 或 2 個臺階。你有多少種不同的方法可以爬到樓頂呢?
注意:給定 n 是一個正整數。
示例 1:
輸入: 2
輸出: 2
解釋: 有兩種方法可以爬到樓頂。
- 1 階 + 1 階
- 2 階
示例 2:
輸入: 3
輸出: 3
解釋: 有三種方法可以爬到樓頂。
- 1 階 + 1 階 + 1 階
- 1 階 + 2 階
- 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];
}
}