跳台阶

作者: 夏臻Rock | 来源:发表于2018-05-16 15:28 被阅读0次

题目描述

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

一、递归实现:

这种方法最为低级,递归会产生大量的重复计算,耗费的时间是输入规模的指数级别的,可以加入计算缓存来提高递归速度。

public class Solution {
    public int JumpFloor(int target) {
       if(target <=0 ) return 0;
       else if(target ==1 ) return 1;
       else if(target ==2 ) return 2;
       return JumpFloor(target-1)+JumpFloor(target-2);
    }
}

显然,当我们需要求jumpFloor(5)的时候,会计算jumpFloor(3)和jumpFloor(4),为了得到jumpFloor(3)我们会计算jumpFloor(2)和jumpfloor(1),同样的,为了得到jumpfloor(4),又会计算jumpFloor(3),jumpFloor(2)和jumpfloor(1),这样就会有大量的重复计算产生。

为了避免这种重复计算,最为直接的想法就是将这些中间步骤的计算结果保存下来,再下一次使用时直接进行取用。

二、动态规划:

记忆性动态规划 【递归】

根据如上思路,我们将中间步骤的结果保存下来,形成了记忆性的动态规划。
自底向上,保留每一步的运行结果,留待后续的使用。

public class Solution {
    public int JumpFloor(int target) {
       if(target <=0 ) return 0;
       if(target ==1 ) return 1;
       int[] dp = new int[target+1]; //从0到n一共长n+1
        dp[0]=0;
        dp[1]=1;
        dp[2]=2;
        for(int i=3;i<=target;i++){
            dp[i]=dp[i-1]+dp[i-2];
        }
        return dp[target];
    }
}

这样节省了时间,但也并不是完美的,因为递归的计算每一步的结果并保存,必然需要大量的空间,故而这种算法的时间复杂度是O(N),空间复杂度也是O(n),在使用大量堆栈的情况下,容易造成栈溢出。

故而我们考虑将递归转化为递推求解。从底层向上一步步递推求解,并且为了优化空间利用率,我们并不需要把中间每一步的结果都保存,只需要保存前两步的结果来计算该层的结果。

空间优化后的递推型动态规划

根据如上思路,代码为:

public class Solution {
    public int JumpFloor(int target) {
       if(target <=0 ) return 0;
       if(target ==1 ) return 1;
        if(target ==2 ) return 2;
        int pre1 =1;
        int pre2=2;
        int result = 0;
        for(int i=3;i<=target;i++){
            result = pre1+pre2;
            pre1=pre2;
            pre2 = result;
        }
        return result;
    }
}

转为为递推后,不需要保存所有的中间结果,额外空间的使用为常数个空间,故而这种方法下,时间复杂度为O(N),而空间复杂度为O(1)。

小结:

使用动态规划的时候,一定要先确定一些边界值的状态,然后再求出递归或递推公式。
另外,做一道题目一定要将它想透彻,这样才能达到做题的目的。

相关文章

  • 青蛙跳台阶--python

    一只青蛙可以一次跳 1 级台阶或者一次跳 2 级台阶,例如:跳上第 1 级台阶只有一种跳法:直接跳 1 级即可。跳...

  • 动态规划

    青蛙跳台阶问题 问题:一个青蛙,一次只能跳一级台阶,或者跳两级台阶,这个青蛙跳 n 级台阶有多少种跳法? 如果这只...

  • 跳台阶

    问题描述:?一次可以跳1级台阶,也可以跳2级台阶,问?跳上n级台阶有多少种跳法。 寻找递推关系:1.如果第一次跳1...

  • 算法---青蛙跳台阶问题

    一只青蛙可以一次跳一级台阶,也可以一次跳两级台阶,如果青蛙要跳上n级台阶,共有多少钟跳法? 问题分析 当青蛙即将跳...

  • 青蛙跳台阶问题

    青蛙跳台阶One 问题描述 一只青蛙一次可以跳1级台阶,也可以跳2级台阶。求该青蛙跳上一个级的台阶总共有多少种跳法...

  • 疯狂跳台阶

    ?一次可以选择跳1、2...n级台阶,问跳到n级台阶有多少种跳法 设F(n-i)表示第一次跳i(i

  • 面试题Fibonacci数列:一个台阶总共有n级,如果一次可以跳

    思路: 如果只有1 级台阶,只有一种跳法;如果有2 级台阶,那就有两种跳的方法了:一种是分两次跳,每次跳1 级;另...

  • 跳台阶问题

    跳台阶问题 题目描述: 一个台阶总共有 n 级,如果一次可以跳 1 级,也可以跳 2 级。求总共有多少种跳法,并分...

  • 榜样的力量

    昨晚跟小飞跳台阶。未等小飞开始,我就2级2级的往上跳。38级台阶,跳完后走下来继续。试着一次跳3级,不能连...

  • 跳台阶,生小兔(斐波那契数列)

    题目描述: 一个台阶总共有n级,如果一次可以跳1级,也可以跳2级。求总共有多少总跳法。分析:台阶数 1 2 3 4...

网友评论

      本文标题:跳台阶

      本文链接:https://www.haomeiwen.com/subject/khlddftx.html