(1)一只青蛙一次可以跳上 1 级台阶,也可以跳上2 级。求该青蛙跳上一个n 级的台阶总共有多少种跳法。
(2)一只青蛙一次可以跳上1级台阶,也可以跳上2 级……它也可以跳上n 级,此时该青蛙跳上一个n级的台阶总共有多少种跳法?
问题一
分析:当n=1,有一种跳法
当n=2,一次跳一个跳两次,一次跳两个跳一次,共两种跳法
当n>=2时,n个台阶,设有F(n)种跳法
(1)若第一次选择跳1个台阶,那么剩下的n-1个台阶有F(n-1)种跳法
(2)若第一次选中跳2个台阶,那么剩下的n-2个台阶有F(n-2)种跳法
所以当有n个台阶时 F(n) = F(n-1)+F(n-2)种跳法。
此问题可以归结为斐波那契数列问题(需要注意的是斐波那契数列的第二项是1,此问题当n=2时是2)
实现方式有两种
(1)迭代 建议使用该方法 牛客网运行时间显示为32ms
public int JumpFloor(int target)
{
int first = 1;
int second = 2;
int result = 0;
if(target==1 || target== 2)
{
return target;
}
else
{
for(int i = 3; i <= target; i++)
{
result = first + second;
first = second;
second = result;
}
return result;
}
(2)递归 但是时间复杂度高 该方法牛客网运行显示是635mspublic int JumpFloor2(int target)
{
if(target==1 || target == 2)
{
return target;
}
else
{
return JumpFloor(target-1)+JumpFloor(target-2);
}
}
}
问题二
分析:当n=1,有1种跳法
当n=2,一次跳一个跳两次,一次跳两个跳一次,共两种跳法
当n>=2时,n个台阶,设有F(n)种跳法
第一次选择跳1个,则剩下的n-1个有F(n-1)种跳法
第一次选择跳2个,则剩下的n-2个有F(n-2)种跳法
....
第一次选择跳n个,剩下n-n个台阶有F(n-n)
F(0)=1;
F(n)=F(n-1)+F(n-2)+....+F(0)
F(n-1)=F(n-2)+F(n-3)+F(0)
两式相减得 F(n)=2*F(n-1)
两种方法运行时间差不多
方法一:递归法
public int JumpFloorII(int target) {
if (target == 1 || target == 0)
{
return 1;
}
else
{
return 2 * JumpFloorII(target - 1);
}
}
方法二:迭代法 public int JumpFloorII(int target)
{
int result = 0;
int first = 1;
if(target ==1 || target==0)
{
return 1;
}
else
{
for (int i = 2; i <= target; i++)
{
result = 2*first;
first = result;
}
return result;
}
}
来源:CSDN
作者:snow_7
链接:https://blog.csdn.net/snow_7/article/details/51669925