题解 | #跳台阶#

跳台阶

https://www.nowcoder.com/practice/8c82a5b80378478f9484d87d1c5f12a4

跳台阶:最直观的想法是,经典斐波拉契数列变形,递推公式为f(n)=f(n-1)+f(n-2)。接下来分别使用四种方法实现:递归、记忆化搜索、动态规划、滚动数组。其整体思路为:跳一级台阶一种跳法,跳两级台阶两种跳法,跳n级台阶可以是n-1级台阶再跳一级或者是n-2级台阶再跳两级。

    int jumpFloor(int number) {
        // 跳一级台阶一种跳法
        if(number==1)
            return 1;
        // 跳两级台阶两种跳法
        if(number==2)
            return 2;
        // 跳n级台阶 可以是n-1级台阶再跳一级 也可以是n-2级台阶再跳两级
        return jumpFloor(number-1)+jumpFloor(number-2);
    }

    // 1<=n<=40
    int memo[45]={0};
    int jumpFloor(int number) {
        // 跳一级台阶一种跳法
        if(number==1)
            return 1;
        // 跳两级台阶两种跳法
        if(number==2)
            return 2;
        // 避免重复计算 以空间换时间
        if(memo[number]!=0)
            return memo[number];
        // 跳n级台阶 可以是n-1级台阶再跳一级 也可以是n-2级台阶再跳两级
        return memo[number]=jumpFloor(number-1)+jumpFloor(number-2);
    }

    int jumpFloor(int number) {
        vector<int> dp(number+1,0);
        // 跳一级台阶一种跳法
        dp[1]=1;
        // 跳两级台阶两种跳法
        dp[2]=2;
        // 递推公式dp[i]=dp[i-1]+dp[i-2]
        for(int i=3;i<=number;i++)
            // 跳n级台阶 可以是n-1级台阶再跳一级 也可以是n-2级台阶再跳两级
            dp[i]=dp[i-1]+dp[i-2];
        return dp[number];
    }

    int jumpFloor(int number) {
        if(number==1)
            return 1;
        if(number==2)
            return 2;
        // 跳一级台阶一种跳法
        int a=1;
        // 跳两级台阶两种跳法
        int b=2;
        // 递推公式dp[i]=dp[i-1]+dp[i-2]
        int c;
        for(int i=3;i<=number;i++)
        {
            // 跳n级台阶 可以是n-1级台阶再跳一级 也可以是n-2级台阶再跳两级
            c=a+b;
            a=b;
            b=c;
        } 
        return c;
    }

#跳台阶#
剑指offer 文章被收录于专栏

剑指offer专栏主要分享剑指offer题解。

全部评论

相关推荐

12-19 22:04
武汉大学 Java
点赞 评论 收藏
分享
牛客78682892...:直接点还好,总比要了简历也不回的强
点赞 评论 收藏
分享
11-23 15:33
已编辑
门头沟学院 Java
CUTMR:换账号试试重启推荐算法,我换账号之后回复率还不错,约莫有个20%左右的消息回复率,前几页、主动招呼的HR也开始符合我期望薪资,此前的大号从招呼、回复、前几页的岗位薪资在涨幅30%+以上 用着用着聊着聊着就变成-20%,而且我开通会员之后直接0面试
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务