LeetCode70-爬樓梯

 

非商業,LeetCode連接附上:java

https://leetcode-cn.com/problems/climbing-stairs/數組

進入正題。優化

 

題目:.net

假設你正在爬樓梯。須要 n 階你才能到達樓頂。code

每次你能夠爬 1 或 2 個臺階。你有多少種不一樣的方法能夠爬到樓頂呢?blog

注意:給定 n 是一個正整數。leetcode

 

示例:get

示例 1:同步

輸入: 2
輸出: 2
解釋: 有兩種方法能夠爬到樓頂。
1. 1 階 + 1 階
2. 2 階博客


示例 2:

輸入: 3
輸出: 3
解釋: 有三種方法能夠爬到樓頂。
1. 1 階 + 1 階 + 1 階
2. 1 階 + 2 階
3. 2 階 + 1 階

 

代碼實現:

//方法一 動態規劃-數組
public int climbStairs(int n) {

        if(n <= 2) {
            return n;
        }

        int[] dp = new int[n + 1];
        dp[1] = 1;
        dp[2] = 2;
        for(int i = 3; i <= n; i++) {
            dp[i] = dp[i - 1] + dp[i - 2];
        } 

        return dp[n];
}
//時間複雜度O(n),空間複雜度O(n)

//方法二 動態規劃-滾動數組
public int climbStairs(int n) {

        int p = 0, q = 0, r = 1;
        for(int i = 1; i <= n; i++) {
            p = q;
            q = r;
            r = p + q;
        }

        return r;        
}
//時間複雜度O(n),空間複雜度O(1)

 

分析:

本題採用動態規劃的方法解決時,常規思考是能夠利用一個一位數組進行數據的記錄;

根據動態規劃的狀態轉移方程,能夠優化爲滾動數組的形式,節省空間。

 

--End

 

本文同步分享在 博客「黑冰臺」(CNBlog)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索