题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
解题思路
数学的排列组合问题,很容易分析:
f
(
n
)
=
f
(
n
−
1
)
+
f
(
n
−
2
)
f(n)=f(n-1)+f(n-2)
f(n)=f(n−1)+f(n−2)
要想知道跳到n级台阶多少种跳法,那么:从n-1级台阶跳一下到n级,从n-2级台阶跳2级到n级台阶,递归关系就出来了
源代码
class Solution {
public:
int jumpFloor(int number) {
if(number==0)
{return 0;}
if(number==1)
{return 1;}
if(number==2)
{return 2;}
return jumpFloor(number-2)+jumpFloor(number-1);
}
};
同样的,递归并不是最佳写法,(斐波那契数列)改成循环形式:
class Solution {
public:
int jumpFloor(int number) {
if(number==0)
{return 0;}
if(number==1)
{return 1;}
if(number==2)
{return 2;}
int a = 1, b = 2, c = 0;
for (int i = 3; i <= number; i++) {
c = a + b;
a = b;
b = c;
}
return c;
}
};
题目改进
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
解题思想
现在青蛙每次可以跳任意的n级台阶,按往常那样单纯找递归关系,显然已经不可取,那么这里就需要转换思维方式。
我们知道,不管青蛙采用何种方式跳台阶,中途都会在n级台阶上有着不同的落脚点,这样有多少种落脚点就成为了我们讨论的重点。
青蛙可以随意跳,所以前面如何跳,后面的每个台阶都是可以成为落脚点的。分析每个台阶,落与不落,两种情况,n级台阶,也就相应的有
2
n
−
1
2^{n-1}
2n−1情况。
源代码
class Solution {
public:
int jumpFloorII(int number) {
if(number==0)
{return 0;}
if(number==1)
{return 1;}
int a=1,b=0;
for(int i=1;i<number;i++)
{
b=2*a;
a=b;
}
return b;
}
};