題目:爬樓梯
假設你正在爬樓梯。需要 n 階你才能到達樓頂。
每次你可以爬 1 或 2 個臺階。你有多少種不同的方法可以爬到樓頂呢?
注意:給定 n 是一個正整數。
複製程式碼
示例:
輸入: 2
輸出: 2
解釋: 有兩種方法可以爬到樓頂。
1. 1 階 + 1 階
2. 2 階
輸入: 3
輸出: 3
解釋: 有三種方法可以爬到樓頂。
1. 1 階 + 1 階 + 1 階
2. 1 階 + 2 階
3. 2 階 + 1 階
複製程式碼
思考:
一下想到的是這道題可以用遞迴來做。第n階可以從n-1階走一步到達,也可以從n-2階走2步到達。
同理n-1階可以從n-2階走一步或者從n-3階走兩步到達。
但是提交後發現時間和空間消耗太大。
複製程式碼
實現:
class Solution {
public int climbStairs(int n) {
if(n == 1){
return 1;
}
if(n == 2){
return 2;
}
return climbStairs(n-1)+climbStairs(n-2);
}
}
複製程式碼
再思考:
先列舉下幾種情況:
n: 1 2 3 4 5
result: 1 2 3 5 8
從結果來看尋找規律發現:爬到n階的方法總數等於爬到n-1階的方法數加上爬到n-2階的方法數,是一個斐波那契數列。
從3開始迴圈一直到n,n為3時result就等於1+2,2賦給pre(即n-2),3賦給pos(即n-1),如此迴圈到n即可得到n對應的result。
複製程式碼
實現:
class Solution {
public int climbStairs(int n) {
if(n == 1){
return 1;
}
if(n == 2){
return 2;
}
int pre = 1;
int pos = 2;
int result = 0;
for(int i=3;i<= n;i++){
result = pre + pos;
pre = pos;
pos = result;
}
return result;
}
複製程式碼
}