假設你正在爬樓梯。需要 n 階你才能到達樓頂。每次你可以爬 1 或 2 個臺階。你有多少種不同的方法可以爬到樓頂呢?
注意:給定 n 是一個正整數。
-
示例 1:
輸入: 2
輸出: 2
解釋: 有兩種方法可以爬到樓頂。- 1 階 + 1 階
- 2 階
-
示例 2:
輸入: 3
輸出: 3
解釋: 有三種方法可以爬到樓頂。- 1 階 + 1 階 + 1 階
- 1 階 + 2 階
- 2 階 + 1 階
/*
class Solution {
public int climbStairs(int n) {
方式1 先寫暴力遞歸 (超出時間限制)
分析: 若是1開頭,則剩餘的臺階數爲n-1,計算n-1階的多少種走法 N1
若是2開頭,則剩餘的臺階數爲n-2,計算n-2階的多少種走法 N2
求和sum = N1 + N2;
返回sum
int sum = 0;
if(n == 1 || n == 0)
return 1;
int N1 = climbStairs(n-1);
int N2 = climbStairs(n-2);
sum = N1 + N2;
return sum;
}
}
*/
class Solution {
public int climbStairs(int n) {
if (n == 1) {
return 1;
}
//方式2 改成動態規劃
/*
分析: dp[i] = dp[i-1] + dp[i-2];
*/
int[] dp = new int[n+1]; //索引從dp[1]開始,dp[1]存儲的是臺階數爲1的多少種走法
dp[0] = 1;
dp[1] = 1;
for(int i = 2; i < dp.length; i++){
dp[i] = dp[i-1] + dp[i-2];
}
return dp[n];
}
}
執行用時 : 1 ms, 在Climbing Stairs的Java提交中擊敗了61.14% 的用戶
內存消耗 : 33.2 MB, 在Climbing Stairs的Java提交中擊敗了69.02% 的用戶