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

相关文章
相关标签/搜索