剑指Offer第八和第九题:跳台阶和变态跳台阶以及拓展

由于题目类似,这里总和一下,并进行拓展

目录

1.跳台阶

2.变态跳台阶

3.拓展篇——疯魔版跳台阶

题目一:

题目二:


1.跳台阶

题目描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

题目分析:

一共n级,跳两级当n>2时,假设函数 f(n) 表示总共跳法数,那么此时下一级跳 1 级,剩下的跳法数就是 f(n-1),如果跳两级那么剩下就是 f(n-2);此时出现等式 f(n) = f(n-1) + f(n-2);问题就变成了斐波那契数列问题。

如不懂斐波那契数列问题,可看 https://blog.csdn.net/weixin_42513339/article/details/88927290,实际本质就是动态规划算法。

程序如下:

class Solution {
public:
    int jumpFloor(int number) {
        if(number == 0)
            return 0;
        else if(number == 1)
            return 1;
        else if(number == 2)
            return 2;
        else{
            int a1 = 1, a2 = 2,count = 2;
            while(count != number)
            {
                int m = a2;
                a2 = a1+a2;
                a1 = m;
                count++;
            }
            return a2;
        }
    }
};

递归版

class Solution {
public:
    int jumpFloor(int number) {
        if (number == 0) return 0;
        else if (number == 1) return 1;
        else if (number == 2) return 2;
        else
            return jumpFloor(number-2)+jumpFloor(number-1);			
    }  
};

 

2.变态跳台阶

题目描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

思路:

因为n级台阶,第一步有n种跳法:跳1级、跳2级、到跳n级

跳1级,剩下n-1级,则剩下跳法是f(n-1)

跳2级,剩下n-2级,则剩下跳法是f(n-2)

所以f(n)=f(n-1)+f(n-2)+...+f(1)

因为f(n-1)=f(n-2)+f(n-3)+...+f(1)

所以f(n)=2*f(n-1)

代码如下:

class Solution {
public:
    int jumpFloorII(int number) {
        if (number == 0) return 0;
		else if (number == 1) return 1;
		else{
			return 2 * jumpFloorII(number - 1);
		}
    }
};

 

3.拓展篇——疯魔版跳台阶

题目一:

有了前两个跳台阶的思想 ,我们可以再换个想法,假设题目如下:

一只青蛙一次可以跳上2级台阶,也可以跳上3级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

思路:跟第一个思路很类似,只是不能跳1级,那么我们应该可以得到一个类似的公式,即:f(n) = f(n-2)+f(n-3),我们可以举例:

那么如果两级台阶,只有一种跳法。

如果三级台阶,只有一种跳法,如果四级台阶,那么也是只有一种跳法,如果是五级台阶,到了五级,我们终于用到上面的公式了,即 f(5) = f(3)+f(2); 我们再举例,如果六级,那么就是f(6) = f(4)+f(3),七级 f(7) = f(5) = f(4)等等,我们都可以用这个公式表示,所以代码就好写了。如下:

int jumpFloor3(int n) {
    if(n<=1) return 0;
    if(n==2 || n==3 || n==4)
        return 1;
    return jumpFloor3(n-2)+jumpFloor3(n-3);
}

题目二:

一只青蛙一次可以跳上1级台阶,也可以跳上2级,也可以跳上3级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

思路:还是改版题目,我们只需要写出 f(1) = 1, f(2) = 2, f(3) = 4,即可创建等式,即:f(n) = f(n-1)+f(n-2)+f(n-3)。

int jumpFloor4(int n) {
    if(n <= 0) return 0;
    if(n == 1) return 1;
    if(n == 2) return 2;
    if(n == 3) return 4;
    return  jumpFloor4(n-1)+jumpFloor4(n-2)+jumpFloor4(n-3);
}

类似题目有很多,主要还是需要熟悉这种递归方法,当然动态规划来做个人感觉好一点,青蛙跳台阶和斐波那契数列都是动态规划入门的题目,需要好好掌握,所以我这里多写了点。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值