爬楼梯——不能连续走两步

这篇博客总结了字节跳动笔试中的一道题目,关于如何在不能连续走两步的情况下爬上楼梯的问题。通过解析和递归算法,阐述了计算不同阶楼梯走法的思路和代码实现,降低了空间复杂度。
部署运行你感兴趣的模型镜像

9月6日字节跳动笔试总结

题目描述:
有个楼梯比较高,我们有多种方式可以走上去,但是在走楼梯的时候有几个限制:一是每次只可以走一步或者两步,而且不能连续的走两步,那么我们需要计算多少种走法。

输入:楼梯的层数
输出:总共有多少种走法

解析:可以将一个n阶楼梯的走法分为两种,一种是最开始先走一步的,记为n1n_1n1,一种是最开始先走两步的n2n_2n2。那么一个n阶楼梯的走法就是这两种走法的和ntotal=n1+n2n_{total} = n_1 + n_2ntotal=n1+n2。对于一个n+1阶楼梯的走法,也分为先走一步,那么先走一步的方法(n+1)1{(n+1)}_1(n+1)1就等于ntotaln_{total}ntotal,先走两步的方法(n+1)2{(n+1)}_2(n+1)2就等于(n+1−2)1{(n+1-2)}_1(n+12)1(n+1)total=(n+1)1+(n+1)2{(n+1)}_{total} = {(n+1)}_1 + {(n+1)}_2(n+1)total=(n+1)1+(n+1)2

代码

#include <iostream>
#include <vector>
using namespace std;
struct VN{
    int one_begin_ = 0;
    int two_begin_ = 0;
    VN(int x = 0, int y = 0){
        one_begin_ = x;
        two_begin_ = y;
    }
};

int getWaysN(int n){
    vector<struct VN> f;
    f.push_back(VN(0,0));
    f.push_back(VN(1,0));
    f.push_back(VN(1,1));
    for (int i = 3; i <= n; ++i) {
        VN c = VN();
        c.one_begin_ = f[i-1].one_begin_ + f[i-1].two_begin_;
        c.two_begin_ = f[i-2].one_begin_;
        f.push_back(c);
    }
    return f[n].two_begin_ + f[n].one_begin_;
}
int main(){
    int n = 6;
    int a = getWaysN(n);
    cout << a;
    return 0;
}

此处我是用了一个结构用来保存n阶楼梯的方法,one_begin_表示最开始走一步的走法,two_begin_表示最开始走两步的走法。
上述方法也可以使用常数个变量来降低空间复杂度。

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

爬楼梯问题是一个经典的动态规划问题,通常它描述的是一个有n级台阶的楼梯,每次可以爬1级或者2级,问有多少种同的方法可以爬到顶部。如果增加了不能连续爬三节台阶的限制条件,问题就变得更加复杂。 在这种情况下,我们可以定义状态转移方程来解决这个问题。设`dp[i]`表示到达第`i`级台阶的同方法数。由于不能连续爬三节台阶,所以当我们到达第`i`级台阶时,我们是从第`i-1`级台阶爬1级或者从第`i-2`级台阶爬2级到达的,但是由于不能连续爬三节,所以还需要考虑前一个台阶的爬法,不能是从第`i-3`级台阶直接爬3级到达的。 因此,状态转移方程可以写为: `dp[i] = dp[i-1] + dp[i-2] - dp[i-3]`,其中`dp[i-3]`表示的是因为不能连续爬三节而需要减去的情况。 初始条件是: `dp[0] = 1`(没有台阶时默认有一种方法,即爬), `dp[1] = 1`(只有1级台阶,只有一种方法爬到顶部), `dp[2] = 2`(有2级台阶,可以爬2次1级,或者一次2级)。 然后我们可以从第三级台阶开始计算,一直计算到第n级台阶的`dp[n]`值。 以下是代码实现的一个例子: ```python def climbStairs(n): if n < 3: return n dp = [0] * (n + 1) dp[0], dp[1], dp[2] = 1, 1, 2 for i in range(3, n + 1): dp[i] = dp[i-1] + dp[i-2] if i > 3: dp[i] -= dp[i-3] return dp[n] # 例如,计算爬到第5级台阶的同方法数 print(climbStairs(5)) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值