剑指offer(三) 斐波那契数列+跳台阶+变态跳台阶

记录并复习一下剑指offer的部分题型~


斐波那契数列

题目描述
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。
n<=39


斐波那契数列是指一个:1,1,2,3,5,8,13,21,34…的数列,这个数列从第三个数开始等于前两个数之和。
题目中要求从0开始,第0项是0,第1项是1,那么我们可以通过递归来计算。

public class Solution {
    
    
    public int Fibonacci(int n) {
    
    
        //当n=0的时候,返回0
        if(n == 0) return 0;
        //当n=1的时候,返回1
        if(n == 1) return 1;
        //递归返回n-1 和 n-2 得出的数值
        return Fibonacci(n-1) + Fibonacci(n-2);
    }
}

跳台阶

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


有n个台阶,青蛙一次只能跳1级或者2级,那么第一次跳了1级以后,剩下的台阶就是n-1级。同样的,如果第一次跳出2级台阶后,那么剩下的台阶就是n-2级。然后n-1级也可以选择开始跳1级或者是2级。那么就跟递归一样了,结果会发现跟上一题的斐波那契数列一模一样。这里就用非递归的方式来完成~


public class Solution {
    
    
    public int JumpFloor(int target) {
    
    
        //当只有1-2阶的时候,直接输出答案 
        if (target == 1) return 1;
        if (target == 2) return 2;
        //记录1级阶梯的高度
        int f1 = 1;
        //记录2级阶梯的高度
        int f2 = 2;
        //设置一个目标值
        int f3 = 0;
        //从第三阶梯开始循环到目标阶梯
        for (int i = 3; i <= target; i++) {
    
    
            //跳第三阶梯的跳法次数 = 第一阶梯 + 第二阶梯的次数 以此类推
            f3 = f1 + f2;
            //将第二阶梯的跳法次数 赋给第一阶梯
            f1 = f2;
            //将第三阶梯的跳法次数 赋给第二阶梯 
            f2 = f3;
        }
        return f3;
    }
}

变态跳台阶

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


问题解析
比如有一个3级的台阶,一只青蛙跳,可以一次跳1阶跳完,也可以先1阶再2阶,也可以先2阶再1阶,或者直接3阶跳完。
所以一个3级的台阶,可以分为以下四种跳法,111,12,21,3。所以我们也可以继续按照上一题的递归思路来,3级的台阶可以先跳1级,也可以先跳2级,甚至可以3级直接跳完,所以:f(3) = f(3-1) + f(3-2) + f(3-3)
f(3-3)=f(0)=1 3级的阶梯一次性跳3级,那就只有1种跳法了。f(3-2)=f(1)=1 先跳2级阶梯,剩下只有1级,所以也只有1种跳法。f(3-1)=f(2)=2 先跳1级,剩下2级,可以有两种跳法。
所以3级台阶可以得到:f(3) = f(0) + f(1) + f(2)
所以如果n级的话:f(n) = f(0)+f(1)+f(2)+…+f(n-2)+f(n-1)
然而n-1级也可以得到:f(n-1) = f(0)+f(1)+f(2)+…+f(n-2)
所以n级台阶可以得到f(n) = 2 * f(n-1)
然后就破案啦~可以直接通过递归算出结果。

public class Solution {
    
    
    public int JumpFloorII(int target) {
    
    
        //总台阶是1的时候,只有1种跳法
        if(target == 1) return 1;
        //总台阶是2的时候,有1,2 2,1两种跳法
        if(target == 2) return 2;
        //返回2* f(n-1)的结果 ,递归得到结果
        return 2*JumpFloorII(target - 1);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_41762594/article/details/106102544