1. 程式人生 > >【LeetCode】70 爬樓梯

【LeetCode】70 爬樓梯

假設你正在爬樓梯。需要 n 階你才能到達樓頂。
每次你可以爬 1 或 2 個臺階。你有多少種不同的方法可以爬到樓頂呢?
注意:給定 n 是一個正整數。
示例 1:
輸入: 2
輸出: 2
解釋: 有兩種方法可以爬到樓頂。
1 階 + 1 階
2 階
示例 2:
輸入: 3
輸出: 3
解釋: 有三種方法可以爬到樓頂。
1 階 + 1 階 + 1 階
1 階 + 2 階
2 階 + 1 階


解題思路:
1 拿到這道題第一反應是:這怎麼做?遍歷不過來啊…… 於是…就開始像做高中數學題一樣拿出大殺器:歸納法,嘗試了幾個資料之後,發現就是一個斐波那契數列。
2 做是做出來了,可是為什麼呢… 斐波那契數列是S(n) = S(n-1) + S(n - 2),也就是說n級臺階的走法是n-1級臺階和n-2級臺階走法之和!
3 事情變得清晰了起來,關鍵在於最後一步,如果我最後一步走的是一階,那麼我之前有S(n-1)種走法;如果我最後一步走的是兩階,那麼我之前有S(n-2)種走法。後查閱資料才知這是一道簡單的動態規劃問題。

程式碼:

class Solution {
    public int climbStairs(int n) {
        if (n <= 0)
            return 1;
        
        int[] fibo = new int[n];
        int sum = 0;
        
        for(int i = 0;i < n; i++){
            if (i == 0)
                fibo[i] = 1;
            else if (i == 1)
                fibo[i] = 2;
            else fibo[i] = fibo[i-1] + fibo[i-2];
        }
        return fibo[n-1];
    }
}