题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
解题思路
用F(n)表示跳上n阶台阶的跳法数。
当n = 1 时, 只有一种跳法,即1阶跳:F(1) = 1;
当n = 2 时, 有两种跳的方式,一阶跳和二阶跳:F(2) = 2;
到这里为止,和普通跳台阶是一样的。
当n = 3 时,有三种跳的方式,第一次跳出一阶后,剩下的(3-1)个台阶有F(3-1)种跳法; 第一次跳出二阶后,剩下的(3-2)个台阶有对应F(3-2)种跳法;第一次跳出三阶后,只有这一种跳法。F(3) = F(2) + F(1)+ 1 = 4;
当n = 4时,有四种方式:第一次跳出一阶,剩下的(4-1)个台阶有F(4-1)种跳法;第一次跳出二阶,剩下的(4-2)个台阶有F(4-2)种跳法;第一次跳出三阶,剩下的(4-3)个台阶有F(4-3)种跳法;第一次跳出四阶,只有这一种跳法。所以,F(4) = F(4-1) + F(4-2) + F(4-3) + 1种跳法。
……
当n = n 时,共有n种跳的方式,第一次跳出一阶后,后面的(n-1)级台阶有F(n-1)中跳法; 第一次跳出二阶后,后面的(n-2)还有F(n-2)中跳法..........................第一次跳出n阶后,只有一种跳法。F(n) = F(n-1)+F(n-2)+F(n-3)+..........+F(1)+1 = 。
通过上述分析,我们就得到了通项公式:
F(n) = 1+F(1)+F(2)+.......+ F(n-2) + F(n-1)
根据以上分析,代码如下:
class Solution {
public:
int jumpFloorII(int number) {
if( number < 3 )
return number;
vector<int> res(number+1, 0);
res[1] = 1;
res[2] = 2;
for( int i=3;i<=number;i++ )
{
res[i] = 1;
for( int j=0;j<i;j++ )
res[i] += res[j];
}
return res[number];
}
};
进一步改进:
根据
通项公式:
F(n) = 1+F(1)+F(2)+.......+ F(n-2) + F(n-1)
可以得到:F(n-1)=1+F(1)+F(2)+.......+F(n-2)两项相减可以得到 F(n) -F(n-1)=F(n-1),即可以得到F(n)=F(n-1)*2
则代码如下:
class Solution {
public:
int jumpFloorII(int number) {
if(number==0)
return number;
int total=1;
for(int i=1;i<number;i++)
total*=2;
return total;
}
};
也可以如下:
class Solution {
public:
int jumpFloorII(int number) {
if(!number) return 0;
else return int(pow(2,number-1));
}
};
或者
class Solution {
public:
int jumpFloorII(int number) {
return 1<<--number;
}
};