✨刷题笔记——青蛙跳台阶问题汇总
作者介绍:
🎓作者:偷偷敲代码的青花瓷🐱🚀
👀作者的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);
}
}
}
总结
“种一颗树最好的是十年前,其次就是现在”
所以,
“让我们一起努力吧,去奔赴更高更远的山海”
如果有错误❌,欢迎指正哟😋
🎉如果觉得收获满满,可以动动小手,点点赞👍,支持一下哟🎉