跳台阶问题

Posted bax-life

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了跳台阶问题相关的知识,希望对你有一定的参考价值。

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

 

代码格式要求:

public class Solution {
    public int JumpFloor(int target) {

    }
}

 

解题思路:

这是一道动态规划的问题,至于这道动态规划的思路问题,解释起来还是有点抽象,在知乎上面找到一篇文章以漫画的形式讲解了动态规划,就是以这道题讲解的,下面把链接贴出来(文章中还讲了另外一道难一点的动态规划题,大家可以看看):

漫画:什么是动态规划

总的来说就是最后可以将这道题简化成一个斐波那契数列的求解。

这里就贴一下代码。

 

递归的方法注意这里的边界条件和我们常见的斐波那契数列不太一样,边界条件是要根据场景自己修改的):

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

牛客AC的时间是586ms。

 

迭代的方法:

public class Solution {
    public int JumpFloor(int target) {
        if(target == 0) return 0;
        if(target == 1) return 1;
        if(target == 2) return 2;
        
        int fir = 1;
        int sec = 2;
        int sum = 0;
        for(int i = 3; i <= target; i++ ) {
            sum = fir + sec;
            fir = sec;
            sec = sum;
        }
        return sum;
    }
}

牛客AC的时间是14ms ~ 19 ms

 

后来看了一下这道题的讨论,发现上面的sum有点多余了~,修改一下代码:

public class Solution {
    public int JumpFloor(int target) {
        if(target == 0) return 0;
        if(target == 1) return 1;
        if(target == 2) return 2;
        
        int fir = 1;
        int sec = 2;
        for(int i = 3; i <= target; i++ ) {
            sec += fir;
            fir = sec - fir;
        }
        return sec;
    }
}

牛客AC时间:10ms~12ms

 

可以看出来比递归的时间还是要少很多的,毕竟递归时在方法栈中建立相应的栈帧,每个栈帧之中又要建立局部变量表,操作数栈,帧数据区等,每一层的函数完成之后还需要弹栈,返回到上一层函数调用,这一系列的操作都需要时间啊(这里涉及到了一点jvm的知识,读者可以去搜索一下jvm的内存结构中的方法栈部分,还是比较好理解的,这里就不细讲了)。

 

以上是关于跳台阶问题的主要内容,如果未能解决你的问题,请参考以下文章

青蛙跳台阶问题

最强解析面试题:跳台阶 & 超级跳台阶「建议收藏!」

最强解析面试题:跳台阶 & 超级跳台阶「建议收藏!」

剑指offer跳台阶

跳台阶问题

剑指Offer变态跳台阶