码迷,mamicode.com
首页 > 其他好文 > 详细

70. Climbing Stairs

时间:2021-04-06 14:16:11      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:不同   int   空间   思路   不用   code   vector   for   移动   

仅供自己学习

思路:
这种题应该用动态规划,因为上到n台阶的方案需要分成不同种方案,即上一层和上两层的多种组合。
首先考虑上到最后一层,可以有上一层台阶到达最后一层,也可以有上两层台阶到达最后一层,那么总的方法就有 dp[n]=dp[n-1]+dp[n-2]种。
因为题目给的范围不为0,所以dp[0]不需要初始化,1层只有1种方法,2层有两种就初始为dp[1]=1,dp[2]=2.
这样遍历n,建立长度为n得数组,那么时间空间消耗都为O(n)
代码:

class Solution {
public:
    int climbStairs(int n) {
        vector<int> dp(n+2);
        dp[1]=1;
        dp[2]=2;
        for(int i=3;i<=n;++i){
            dp[i]=dp[i-1]+dp[i-2];
        }
        return dp[n];
    }
};

因为我们根据公式dp[n]=dp[n-1]+dp[n-2]得到dp[n]后,求dp[n+1]时,dp[n-2]就可以不用了,那么我们只需用三个变量即可,每次获得最新的数值就把原来的向前移动即可。,那么时间复杂度不变,空间复杂度为O(1)

class Solution {
public:
    int climbStairs(int n) {
        if(n==1) return 1;
        if(n==2) return 2;
        if(n==3) return 3;
        int dp1=1;
        int dp2=2;
        int dp3=3;
        for(int i=4;i<=n;++i){
            dp1=dp2;
            dp2=dp3;
            dp3=dp1+dp2;
        }
        return dp3;
    }
};

因为n只从1开始,那么还可这样简洁的写

class Solution {
public:
    int climbStairs(int n) {
        int dp1=0;
        int dp2=0;
        int dp3=1;
        for(int i=1;i<=n;++i){
            dp1=dp2;
            dp2=dp3;
            dp3=dp1+dp2;
        }
        return dp3;
    }
};

70. Climbing Stairs

标签:不同   int   空间   思路   不用   code   vector   for   移动   

原文地址:https://www.cnblogs.com/Mrsdwang/p/14615417.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!