• 【剑指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 }

    执行结果                                   

  • 相关阅读:
    计算机专业,刚刚大一,该如何学好程序设计?
    打王者要有装备,学编程要有设备,学习编程必备大礼包
    Java学习笔记:数据库中的范式和反范式的区别
    linux云计算主要就业岗位有哪些
    字典
    python统计字符串里每个字符的次数
    cf509B Painting Pebbles
    cf509A Maximum in Table
    bzoj1996 [Hnoi2010]chorus 合唱队
    bzoj3173 [Tjoi2013]最长上升子序列
  • 原文地址:https://www.cnblogs.com/sunlinan/p/14207558.html
Copyright © 2020-2023  润新知