【剑指Offer学习】【面试题9 :青蛙跳台问题】

问题描述

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

问题分析

当n=1,有一种跳法

当n=2,一次跳一个跳两次,一次跳两个跳一次,共两种跳法

当n>=2时,n个台阶,设有F(n)种跳法

      (1)若第一次选择跳1个台阶,那么剩下的n-1个台阶有F(n-1)种跳法

      (2)若第一次选中跳2个台阶,那么剩下的n-2个台阶有F(n-2)种跳法

所以当有n个台阶时 F(n) = F(n-1)+F(n-2)种跳法。

此问题可以归结为斐波那契数列问题(需要注意的是斐波那契数列的第二项是1,此问题当n=2时是2)

代码实现

递归实现

涉及到菲波那切数列的问题,首先想到的是递归实现,在递归中当n=1时,f(n)=1,当n=2时,f(n)=2,当n>=3时,f(n)==f(n-1)+f(n-2)。那么代码就很好实现了。

public static int jumpFloor(int n){
        if(n==1 || n==2){
            return n;
        }else{
            return jumpFloor(n-1) + jumpFloor(n-2);
        }

    }

代码分析:使用递归实现,时间复杂度高,运行时间较长,如果在编程中对运行时间有限定,那么使用递归并不是完美的方法。

非递归实现(迭代)

其实,如果数学好一点的同学,通过数学归纳法的话,对这个问题进行迭代处理也是一种很好的方法。从第三个数开始,一次取3个数分析,那么把第一个数设为preTwo,把第二个数设为preOne,第三个数为result。那么有如下关系result=preOne+preTwo.运算完后,那么把整体的preTwo,preOne,result向后移动一位。然后迭代地result=preOne + preTwo。直到你要求的第n个数,迭代结束,最后的result就是你要求的第n个台阶可以使用的方法数。

上代码:

public static int jumpFloor1(int n){
        int preTwo = 1;//数列的第一个数
        int preOne = 2;//数列的第二个数
        int result = 0;
        if(n==1 || n==2){
            return n;
        }
        
        for(int i=3;i<=n;i++){
            result = preTwo + preOne;
            //迭代
            preTwo = preOne;
            preOne = result;


        }
        return result;
    }

猜你喜欢

转载自blog.csdn.net/kuangsonghan/article/details/81414628
今日推荐