leetcode 70 Climbing Stairs

leetcode 70 Climbing Stairs

假设爬到楼顶需要走n步,n为正整数。你每次只能爬一步或者两步,请问有多少种爬法。

算法

利用动态规划解题,找出状态n和状态n-1之间的关系,即状态转移方程,然后从前往后遍历一遍,求得结果。

  • 状态n和n-1的关系

    n比n-1总步数多了一步,n的爬法种数可以从n-1的爬法种数得到:

    1. 在n-1的所有爬法后再加1步
    2. 把n-1的所有以1步结尾的爬法,把最后的1步变为2步

  • 状态转移方程:

    dp(n) = dp(n-1) + ew(n-1, 1) (n>=3)

    ​ 2 (n=2)

    ​ 1 (n=1)

    其中ew(n-1, 1)表示总步数为n-1步时所有爬法中以1步结尾的爬法种数,

    dp(n-1)表示总步数为n-1步时所有的爬法种数。

  • 因此在从3到n遍历的过程中,我们只需要记住每个状态下的爬法种数,以及以1步结尾的爬法种数。

Code

class Solution {
public:
    int climbStairs(int n) {
        if(n==1) return 1;
        if(n==2) return 2;
        int lastways=2;
        int lastone=1;
        for(int i=3; i<=n; i++){
            int nowone = lastways, nowways = lastways + lastone;
            lastways = nowways;
            lastone = nowone;
        }
        return lastways;
    }
};

算法时间复杂度:O(n)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值