假設你正在爬樓梯。須要 n 階你才能到達樓頂。數組
每次你能夠爬 1 或 2 個臺階。你有多少種不一樣的方法能夠爬到樓頂呢?緩存
注意:給定 n 是一個正整數。bash
輸入: 2
輸出: 2
解釋: 有兩種方法能夠爬到樓頂。
1. 1 階 + 1 階
2. 2 階複製代碼
輸入: 3
輸出: 3
解釋: 有三種方法能夠爬到樓頂。
1. 1 階 + 1 階 + 1 階
2. 1 階 + 2 階
3. 2 階 + 1 階
複製代碼
1 回溯,即 f(n) = f(n - 1)+ f(n - 2),直接回溯的話,leetcode上會超時,因此能夠自定義一個緩存,用數組來保存結果。ui
2 動態規劃,能夠當作斐波那契數列來接,用遞推的方式作,循環,從 f(1),f(0)開始加和到f(n)spa
class Solution {
public int climbStairs(int n) {
int[] memory = new int[n + 1];
return helper(n, memory);
}
private int helper(int n, int[] memory) {
if (n <= 2) {
return n;
} else if (memory[n] == 0) {
memory[n] = helper(n - 1, memory) + helper(n - 2, memory);
}
return memory[n];
}
}
複製代碼
class Solution {
public int climbStairs(int n) {
int a = 0;
int b = 1;
for(int i = 1;i<=n;i++){
int c = a;
a = b;
b = c+b;
}
return b;
}
}複製代碼
複製代碼