【剑指offer】跳台阶 ★★★★

题目描述:

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

思路:

我原本的思路是把它看成一个含有重复数字的全排列组合问题,:

先单独考虑台阶为0、1、2的情况:

if (target == 0) return 0;
else if (target == 1) return 1;
else if (target == 2) return 2;

求出每次跳2级,n级台阶需要跳的次数two;

int two = target/2;//跳2级需要跳two次
int ways = 2; //本来就有全跳2级或全跳1级两种方法
int times = 0;//需要跳的总次数
int rest = target%2;//台阶是单数的情况

//先单独考虑只跳1次1级,其余情况都为2级的方法

if (rest == 1){
    ways = ways + two;
    }

然后在每个循环体中从two次中挑出i次来变成每次跳1级的方式:

//从two次中挑出i次来变成每次跳1级的方式
        for (int i=1;i<two;i++){
            times = two + i + rest;
现在情况是一共有times个2和1,则跳台阶的情况ways_now就相当于把这times个2和1全排列,然后再排除掉(i*2+rest)个重复的1排列的情况和(two-i)个重复的2排列的情况
            ways += ways_now    }

我觉得思路应该是可以的吧,但问题是我不会求这个全排列!!

于是乎……放弃了……

百度了之后才知道,原来答案跟我完全不是一个思路?!!感觉这个想法还是挺巧妙的,转了一个思路问题变得简单很多~

所以!值得我Markdown!

***************************************************这是一条正确答案的分割线(以下)****************************************************

该问题实质是斐波那契数列求和,递推公式为 f(n)=f(n-1)+f(n-2);

斐波那契数列指的是这样一个数列: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368。

可以考虑,小青蛙每一步跳跃只有两种选择:一是再跳一级阶梯到达第 i 级阶梯,此时小青蛙处于第 i-1 级阶梯;或者再跳两级阶梯到达第 i 级阶梯,此时小青蛙处于第 i-2 级阶梯。

前面可以选择跳1级,也就是f(i-1)种跳法;选择跳2级,也就是f(i-2)种跳法;所以当前总共的跳法有f(i)=f(i-1)+f(i-2);

依次类推,可以递归求出n级阶梯跳法之和。

【值得注意】在跳台阶的问题中,斐波那契数列的初始值是1.

public class Solution {
    public int Fibonacci(int pre,int ppre){
        int f = 0;
        f = pre + ppre;
        return f;
    }
    public int JumpFloor(int target) {
        if (target == 0) return 0;
        else if (target == 1) return 1;
        else if (target == 2) return 2;
        int pre = 2;
        int ppre = 1; 
        int now = 0;
        for(int i=0;i<target-2;i++){
            now = Fibonacci(pre,ppre);
            ppre = pre;
            pre = now;
        }
        return now;
    }
}

猜你喜欢

转载自blog.csdn.net/yingzoe/article/details/85005932