跳台阶问题
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的内存结构中的方法栈部分,还是比较好理解的,这里就不细讲了)。
以上是关于跳台阶问题的主要内容,如果未能解决你的问题,请参考以下文章