【剑指offer】09 变态跳台阶

题目地址:变态跳台阶

题目描述                                   

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 64M,其他语言128M

题目示例                                   

输入:
3
返回值:
4

解法分析                                   

跳台阶进阶版,与跳台阶类似,当有n节台阶时,如果青蛙最后一步跳一节,那么它跳n-1节台阶时有多少种跳法,跳n节台阶时就有多少种跳法;如果青蛙最后一步跳两节,那么它跳n-2节台阶时有多少种跳法,跳n节台阶时就有多少种跳法……如果青蛙最后一步跳n节,那么它跳0节台阶时有多少种跳法,跳n节台阶时就有多少种跳法。可以看出,跳n节台阶的跳法种类,相当于跳n-1节台阶和跳n-2节台阶和……和跳0节台阶跳法的和。

即f[n]=f[n-1]+f[n-2]+...+f[0],代码可见算法1。

然而我们可以看出,f[n-1]=f[n-2]+f[n-3]+...+f[0],f[n]-f[n-1]=f[n-1],即f[n]=2*f[n-1],这样我们就可以得到更简便的算法,详见算法2。

代码                                         

算法1:

 1 function jumpFloorII(number)
 2 {
 3     // write code here
 4     if(number<=1){
 5         return 1;
 6     }else{
 7         var fib = new Array();
 8         fib[0] = 1;
 9         fib[1] = 1;
10         for(var len=2;len<=number;len++){
11             fib[len] = 0;
12         }
13         for(var i=2;i<=number;i++){
14             for(var j=0;j<i;j++){
15                 fib[i]+=fib[j];
16             }
17         }
18         return fib[number];
19     }
20 }

算法2:

1 function jumpFloorII(number)
2 {
3     // write code here
4     var res = 1;
5     while(--number){
6         res*=2;
7     }
8     return res;
9 }

执行结果                                   

原文地址:https://www.cnblogs.com/sunlinan/p/14207558.html