1,leetcode網址
https://leetcode-cn.com/problems/climbing-stairs/submissions/
2,題目
假設你正在爬樓梯。需要 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 階
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/climbing-stairs
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
3,解題方法
分析,
第一級:1種,一步跨上去
第二級:2種,1)直接一步跨;2)一級一級走。
第三級:3種,總歸是 第一級和第二級的和。
即當前i處臺階,一定是從i-1或者i-2處臺階登上。
即轉換成斐波拉契數列問題。
即f(n) = f(n)+f(n-1)
思路一的代碼:
class Solution {
//其實轉換成斐波拉契數列問題,f(n) = f(n)+f(n-1)
//使用數組緩存每一步的結果。稱之爲記憶遞歸
public int climbStairs(int n) {
int[] dp = new int[n+2];
dp[0] = 0;
dp[1] = 1;
dp[2] = 2;
for(int i = 3;i<=n;i++){
dp[i] = dp[i-1]+dp[i-2];
}
return dp[n];
}
}
思路二
class Solution {
public int climbStairs(int n) {
if(n ==1){
return 1;
}
int first = 1;
int second = 2;
for(int i = 3;i<=n;i++){
int third = first +second;
first = second;
second = third;
}
return second;
}
}