【9】变态跳台阶
- 时间限制:1秒
- 空间限制:32768K
牛客网题目链接:点击进入题目链接
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。
求该青蛙跳上一个n级的台阶总共有多少种跳法。
思路:
跳n阶 等于 跳1阶的方法 和 跳两阶的方法 和……。将问题递归缩小。和普通跳台阶问题相似。f(n)=f(n-1)+f(n-2)+……+f(1)+1;
描述为:最后一次跳1阶+最后一次跳2阶+……最后一次跳n-1阶,最后一次跳n阶 ,所有方法和。
vs2010代码:
#include<stdio.h>
#include<time.h>
class Solution {
public:
int jumpFloorII(int number) {
if(number==0) return 0;
if(number==1) return 1;
int sum=1;
for(int i=2; i<=number; i++)
{
/* sum=sum+jumpFloorII(i-1);*/ //法1
sum=2*sum; //法2
}
return sum;
}
};
int main()
{
Solution s1;
time_t start,end;
int n=0;
while(1)
{
printf("输入台阶数:");
scanf("%d", &n);
start=clock();
printf("方法:%d\n", s1.jumpFloorII(n) );
end=clock();
printf("耗时:%f\n", double(end-start));
}
}
class Solution {
public:
int jumpFloorII(int number) {
int a=1; return a<<(number-1);
}
};
2^(n-1)可以用位移操作进行,更快。
f(1)=1;
f(2)=f(1)+f(0)=1+1=2
f(3)=f(2)+f(1)+f(0)=2f(2)=4
f(4)=2f(3)=8
说明:
- 法1,是从数学逻辑去考虑.
- 法2,是从法1的描述去改进。时间效率更高
- 目测牛客网的变态台阶数不超过30.
- 因此两种方法都通过测试。