zoukankan      html  css  js  c++  java
  • 剑指offer:跳台阶问题

    基础跳台阶

    题目

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

    解题思路

    这道题就是斐波那契数列的变形问法,因为跳上第N个台阶有两种方式,第一个就是从第N-1个台阶上跳一级上来,第二个就是从第N-2个台阶上跳两级上来。

    那么求到第N个台阶的方法就转变成求到第N-1台阶的办法和到第N-2个台阶的方法,将两者相加即可,所有f(n)=f(n-1)+f(n-2),唯一一点区别在于初始值,这里的初始值是

    f(1) = 1;f(2)=2

    可以用递归和非递归保存前一个结果两种方式来实现,具体可参考剑指offer系列中斐波那契那篇博文。

    变态跳台阶

    题目

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

    解题思路

    变态跳台阶相对于普通版本的跳台阶的改变在于第N个台阶不仅仅可以由第N-1和第N-2个台阶到达,它是可以从第它下面的任一个台阶到达,

    所有f(n) = f(n-1)+f(n-2)+f(n-3)+...+f(2)+f(1)+1,最后一个台阶是可以直接从第0个台阶调到第N个台阶这种情况,继续推导

    f(n) =  f(n-1)+f(n-2)+f(n-3)+...+f(2)+f(1)+1,f(n+1) = f(n)+f(n-1)+f(n-2)+f(n-3)+...+f(2)+f(1)+1 = 2*f(n)

    f(1) = 1,f(2)=2=2*f(1)

    当然还是可以用递归和非递归两种方式来解决

    代码

     递归

    1     public int JumpFloorII(int target) {
    2         if(target==1){
    3             return 1;
    4         }else{
    5             return 2*JumpFloorII(target-1);
    6         }
    7     }

    非递归

    1     public int JumpFloorII(int target) {
    2         int[] saveData = new int[target+1];
    3         saveData[1] = 1;
    4         for(int i=2;i<=target;i++){
    5             saveData[i] = 2*saveData[i-1];
    6         }
    7         return saveData[target];
    8     }
  • 相关阅读:
    wzplayer for android界面
    player stop处理
    wzplayer for android界面
    android屏幕监控上下左右滑动
    OpenGL + C++ + Java
    player stop处理
    EGLHelper
    Android NDK学习 <五> C++ 支持
    【认识之初】
    Java调用windows exe程序
  • 原文地址:https://www.cnblogs.com/huanglf714/p/11106149.html
Copyright © 2011-2022 走看看