非商业,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源创计划”,欢迎正在阅读的你也加入,一块儿分享。