刷题笔记——青蛙跳台阶问题汇总

刷题笔记——青蛙跳台阶问题汇总


作者介绍:

🎓作者:偷偷敲代码的青花瓷🐱‍🚀
👀作者的Gitee:代码仓库
📌系列文章推荐:
1.【第一章】JAVA之牛客网刷题笔记【点进来花两把游戏的时间学习晚上睡觉都踏实了】
2.数据结构与算法—算法篇之动态规划(一)
✨✨我和大家一样都是热爱编程✨,很高兴能在此和大家分享知识,希望在分享知识的同时,能和大家一起共同进步,取得好成绩,拿到好offer🐱‍🚀JAVA刷题特辑将持续更新🐱‍🚀,如果有错误❌,欢迎指正呀✔,如果觉得收货满满,可以点点赞👍,支持一下哟~~😁

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

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

思路分析:
当n = 1, 只有1中跳法;当n = 2时,有两种跳法;当n = 3 时,有3种跳法;当n = 4时,有5种跳法;当n = 5时,有8种跳法;…

这道题的规律:类似于 Fibonacci数列:
指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)

在这里插入图片描述

代码如下:

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

    }
}

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

一只青蛙一次可以跳上1级台阶,也可以跳上2 级……它也可以跳上n 级,此时该青蛙跳上一个n级的台阶总共有多少种跳法?
思路分析:
用Fib(n)表示青蛙跳上n阶台阶的跳法数,青蛙一次性跳上n阶台阶的跳法数1(n阶跳),设定Fib(0) = 1

   当n = 1 时, 只有一种跳法,即1阶跳:Fib(1) = 1;

   当n = 2 时, 有两种跳的方式,一阶跳和二阶跳:Fib(2) = Fib(1) + Fib(0) = 2;

   当n = 3 时,有三种跳的方式,第一次跳出一阶后,后面还有Fib(3-1)中跳法; 
   第一次跳出二阶后,后面还有Fib(3-2)中跳法;第一次跳出三阶后,后面还有Fib(3-3)中跳法

    Fib(3) = Fib(2) + Fib(1)+Fib(0)=4;

   当n = n 时,共有n种跳的方式,第一次跳出一阶后,后面还有Fib(n-1)中跳法;
   第一次跳出二阶后,后面还有Fib(n-2)中跳法...第一次跳出n阶后, 后面还有  Fib(n-n)中跳法.

   Fib(n) = Fib(n-1)+Fib(n-2)+Fib(n-3)+...+Fib(n-n)=Fib(0)+Fib(1)+Fib(2)+...+Fib(n-1)

  又因为Fib(n-1)=Fib(0)+Fib(1)+Fib(2)+...+Fib(n-2)

  两式相减得:Fib(n)-Fib(n-1)=Fib(n-1)  -->  Fib(n) = 2*Fib(n-1)     (n >= 2)

  递归等式如下:

在这里插入图片描述

代码如下:

public class Solution {
 public int jumpFloorII(int target) {
     if(target <= 1) {
         return 1;
     }
     return 2*jumpFloorII(target-1);
 }
}

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

思路:
这道题结合上一道题的思路,我们先列多项式

   f(n) =  f(n-1) + f(n-2) + f(n-3) + ... + f(n-m)
   f(n-1) =   f(n-2) + f(n-3) + ... + f(n-m) + f(n-m-1)
 化简得:f(n) = 2f(n-1) - f(n-m-1)

分两种情况去讨论:
1.当n = m 的时候,如上一题
2.当n > m 的时候

代码如下:

 public static int jumpFloorII(int n,int m ) {
         //当大于m的时候是上面的公式
         if(n > m){
             return 2*jumpFloorII(n-1, m)-jumpFloorII(n-1-m, m);
         }
         //当小于等于m的时候就是和n级的相同了
         if (n <= 1) {
             return 1;
         } else {
             return 2 * jumpFloorII(n - 1,n);
         }
     }
  }   



总结

“种一颗树最好的是十年前,其次就是现在”
所以,
“让我们一起努力吧,去奔赴更高更远的山海”

如果有错误❌,欢迎指正哟😋

🎉如果觉得收获满满,可以动动小手,点点赞👍,支持一下哟🎉
在这里插入图片描述

  • 41
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 37
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

偷偷敲代码的青花瓷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值