1. 程式人生 > >Java&LeetCode 初入門——070. 爬樓梯

Java&LeetCode 初入門——070. 爬樓梯

Java&LeetCode 初入門——070. 爬樓梯


文內程式碼全部採用JAVA語言。

題目

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

測試用例

示例 1:

輸入: 2
輸出: 2
解釋: 有兩種方法可以爬到樓頂。
1.  1+ 12.  2

示例 2:

輸入: 3
輸出: 3
解釋: 有三種方法可以爬到樓頂。
1.
1+ 1+ 12. 1+ 23. 2+ 1

個人解法

看答案之前,我覺得我的答案應該還湊合。看完答案之後,我只想呵呵自己,為什麼不看提示。提示裡都寫的明明白白啊!
心路歷程:首先看到的時候,覺得是個排列組合問題,完全沒有往動態規劃那方面考慮。於是自己手動寫了一個求組合數的程式,int不夠長用long,long也不夠長用BigInteger。最後只打敗了1%,我就傻眼了。我的破答案就不上傳了,簡直丟人。
哎,其實我這個求組合數的程式,寫的應該還可以。

直接學習一下大佬們的遞迴求解。

大神解法

方法

動態規劃

思路

假設10級臺階,最後一步如果走一級,那前面就是9級臺階的走法;最後一步走兩級,前面就是8級臺階的走法。所以10級臺階就是9級臺階的走法+8級臺階的走法。

能理解這個程式碼就好寫多了。

演算法

簡單的遞迴,不過多解釋。
執行用時: 3 ms, 在Climbing Stairs的Java提交中擊敗了79.10% 的使用者

class Solution {
    public int climbStairs(int n) {
        if (n <= 1)
            return 1;
        else if (n == 2)
            return 2;
        else {
            int res = 0;
            int i = 1, j =
2; int k = 3; while (k <= n) { res = i + j; i = j; j = res; k++; } return res; } } }

哎,數學還是差啊!