问题描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
思路
其实这个就是斐波那契数列的一个变种,对于n级台阶,青蛙的跳法可以有:n-1级再跳一次一阶的和n-2级再跳一次2阶。所以n级台阶的跳法就是n-1级跳法与n-2级跳法的和。
实现
class Solution {
public:
int jumpFloor(int number) {
if(number<=3){
return number;
}
int sum,last1,last2;
sum=0;
last2=1;
last1=2;
for(int i=3;i<=number;i++){
sum=last2+last1;
last2=last1;
last1=sum;
}
return sum;
}
};
升级版青蛙跳台阶
问题描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
其实还是斐波那契数列的变种
直接使用迭代实现
F(n)=F(n-1)+F(n-2)+…+F(1);
class Solution {
public:
int jumpFloorII(int number) {
if(number<=1){
return number;
}
int sum[number+1];
sum[0]=0;
for(int i=1;i<=number;i++){
sum[i]=1; //这一步考虑的是一步直接跳到第i级
}
for(int i=2;i<=number;i++){
for(int j=i-1;j>=1;j--){
sum[i]+=sum[j];
}
}
return sum[number];
}
};
优化版本
- F(n)=F(n-1)+F(n-2)+…+F(1);
- F(n-1)=F(n-2)+…+F(1);
- 两式相减得
F(n)=2*F(n-1);
class Solution {
public:
int jumpFloorII(int number) {
if(number<=1){
return number;
}
int sum,last;
last=1;
for(int i=2;i<=number;i++){
sum=2*last;
last=sum;
}
return sum;
}
};