LeetCode每日一題:爬樓梯(No.70)

胖宅老鼠發表於2019-03-22

題目:爬樓梯


 假設你正在爬樓梯。需要 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;
}
複製程式碼

}

相關文章