非商業,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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。