LeetCode集錦(十八) - 第70題 Climbing Stairs

問題

You are climbing a stair case. It takes n steps to reach to the top. 

 Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top? 

 Note: Given n will be a positive integer. 

 Example 1: 


Input: 2
Output: 2
Explanation: There are two ways to climb to the top.
1. 1 step + 1 step
2. 2 steps


 Example 2: 


Input: 3
Output: 3
Explanation: There are three ways to climb to the top.
1. 1 step + 1 step + 1 step
2. 1 step + 2 steps
3. 2 steps + 1 step
複製代碼

翻譯:

你正在爬樓梯。到達山頂須要n步。 每次你能夠爬1或2級臺階。你能夠用幾種不一樣的方式爬到山頂? 注意:給定n是一個正整數。 示例1: 輸入:2 輸出:2 說明:爬到山頂有兩種方法。bash

  1. 1步+ 1步
  2. 2步 示例2: 輸入:3 輸出:3 說明:爬到山頂有三種方法。
  3. 1步+ 1步+ 1步
  4. 1步+ 2步
  5. 2步+ 1步

解題思路

本題要求很明確,就是根據目標階梯,預測一下須要多少中1,2組合方式走完整個階梯,粗看貌似很麻煩,用循環來弄不知道有多少狀況,各類if,可是換個角度來看,若是咱們倒着推理,好比最後一級只多是1步上來或者是2步上來,這樣子逆退,就找出來一種遞歸的方式,可是這種方法比較耗時間,沒有經過,不知道對不對,因此換一種方式,咱們試試正向思惟,3級是2步和一步跨上去的,那是否是2+1?一樣4級,也是由兩步和一步跨上去的,也就是n(4)=n(2)+n(3),哎呦,好像斐波那契數列哦。相似的推理,其實咱們能夠猜想出規律n(n)=n(n-1)+n(n-1).因此本題就解決了ui

解題方法

  1. 按照咱們的思路來編輯,代碼以下spa

    if (n < 0) {
            return 0;
        }
        if (n <= 2) {
            return n;
        }
        int a = 1;
        int b = 2;
        int result = 0;
        for (int i = 3; i <= n; i++) {
            result = a + b;
            a = b;
            b = result;
        }
    
        return result;
    複製代碼

    時間複雜度: 該方案用了循環m因此f(n)=(n)=n;因此O(f(n))=O(n),即T(n)=O(n)翻譯

    空間複雜度: 該方案使用了沒有使用額外空間,因此空間複雜度是O(n)=O(1);code

總結

本題的大體解法如上所訴, 能夠經過逆推來發現特定的規律,直接想多是個很大的問題,因此能夠考慮換個思惟。遞歸

相關文章
相關標籤/搜索