93 爬楼梯(Climbing Stairs)

1 题目

题目:爬楼梯(Climbing Stairs)
描述:假设你正在爬楼梯,需要n步你才能到达顶部。但每次你只能爬一步或者两步,爬到顶部的方法有多少种?

lintcode题号——111,难度——easy

样例1:

输入:n = 3
输出:3
解释:
1, 1, 1
1, 2
2, 1
共3种

样例2:

输入:n = 1
输出:1
解释:只有一种方案

2 解决方案

2.1 思路

  使用动态规划的方式解,将状态定义为表示走到当前台阶的方式种数,则走到当前台阶的方式等于走到上一阶的方式加上走到上上一阶的方式之和,理清动态规划的四要素即可解出。

2.2 时间复杂度

  每个节点都需要计算一次,时间复杂度为O(n)。

2.3 空间复杂度

  使用了容量为n的数组,空间复杂度为O(n)。

3 源码

细节:

  1. 动态规划的四要素:状态、方程、初始化、答案。(四要素在之前的题目数字三角形1中有详细介绍)
  2. 状态:用dp[i]表示从开头走到第i阶的方法种数。(注意dp的容量需要定义为n + 1)
  3. 方程:dp[i] = dp[i - 1] + dp[i - 2],走到第i阶的方式种数 = 走到第i-1阶的方式 + 走到第i-2阶的方式。
  4. 初始化:dp[0] = 1, dp[1] = 1,走到第0阶只有一种方式,走到第1阶也只有一种方式。
  5. 答案:走到最后一阶的方式种数,即dp[max]

C++版本:

/**
     * @param n: An integer
     * @return: An integer
     */
    int climbStairs(int n) {
        // write your code here
        if (n == 0)
        {
            return 0;
        }

        // 状态:dp[i]表示从开头走到第i阶的方法种数
        vector<int> dp(n + 1);

        // 初始化:走到第0阶只有一种方式,走到第1阶也只有一种方式
        dp[0] = 1;
        dp[1] = 1;

        for (int i = 2; i < dp.size(); i++)
        {
            // 方程:走到第i阶的方式种数 = 走到第i-1阶的方式 + 走到第i-2阶的方式
            dp[i] = dp[i - 1] + dp[i - 2];
        }

        return dp[dp.size() - 1]; // 答案:走到最后一阶的方式种数
    }

  1. 数字三角形:https://blog.csdn.net/SeeDoubleU/article/details/124678103 ↩︎

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值