刷题笔记——青蛙跳台阶问题汇总
✨刷题笔记——青蛙跳台阶问题汇总
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); } } }
总结
“种一颗树最好的是十年前,其次就是现在” 所以, “让我们一起努力吧,去奔赴更高更远的山海”
如果有错误❌,欢迎指正哟😋
上一篇:
IDEA上Java项目控制台中文乱码