描述:
假設你正在爬樓梯。需要 n 階你才能到達樓頂。
每次你可以爬 1 或 2 個臺階。你有多少種不同的方法可以爬到樓頂呢?
注意:給定 n 是一個正整數。
示例 1:
輸入: 2
輸出: 2
解釋: 有兩種方法可以爬到樓頂。
1. 1 階 + 1 階
2. 2 階複製程式碼
示例 2:
輸入: 3
輸出: 3
解釋: 有三種方法可以爬到樓頂。
1. 1 階 + 1 階 + 1 階
2. 1 階 + 2 階
3. 2 階 + 1 階
複製程式碼
思路:
這裡提供兩種思路:1 回溯,即 f(n) = f(n - 1)+ f(n - 2),直接回溯的話,leetcode上會超時,所以可以自定義一個快取,用陣列來儲存結果。
2 動態規劃,可以當做斐波那契數列來接,用遞推的方式做,迴圈,從 f(1),f(0)開始加和到f(n)
程式碼1:
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];
}
}
複製程式碼
結果1:
程式碼2:
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;
}
}複製程式碼
結果2:
複製程式碼