0
点赞
收藏
分享

微信扫一扫

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


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

作者介绍:


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






文章目录

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






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)

递归等式如下:

刷题笔记——青蛙跳台阶问题汇总_递归_02

代码如下:

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);
}
}
}

总结

“种一颗树最好的是十年前,其次就是现在”

所以,

“让我们一起努力吧,去奔赴更高更远的山海”

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

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



举报

相关推荐

0 条评论