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

2、思路:拿到这道题,很容易把自己的思路钻到细节当中,想着假如有n个台阶,然后自己开始乱写乱画了,很显然,如果自己一点点的考虑到所有的情况是不可能的。所以要把思路抽离到宏观上。

  那么假如有n个台阶,我们要求所有的跳法 f(n);假如 第一次青蛙只跳 1 个台阶,那么青蛙还剩 n-1 个台阶要跳,也就是 f(n-1)种可能性;第一次青蛙直跳 2 个台阶,那么青蛙还剩 n-2 个台阶要跳,也就是还要 f(n-2)中跳法。到此可以分析,青蛙跳台阶是一个斐波那契数列。因此还要考虑特殊情况。

        n=1 时,f(1)=1;

        n=2 时,f(2)=2;

        n>2时,f(n)=f(n-1)+f(n-2);

3、代码:斐波那契数列用迭代来解不是最佳方法,因此要用从下往上算的方法,避免重复计算中间结果。

public class Solution {
    public int JumpFloor(int target) {
        //这是斐波那契数列,
        //利用递归的思想,我只需给出最原始的两个初始量的次序就可以,但是中间有重复计算,随着台阶数增加,计算量指数增长
        if(target==1){
            //只有一级台阶,就一种跳法
            return 1;
        }
        if(target==2){
            return 2;
        }
        //青蛙跳到最后看剩1个台阶还是俩台阶,剩1个,那就最后一次有一种情况
        //return JumpFloor(target-1)+JumpFloor(target-2);
        int pre=2;
        int prepre=1;
        int result=0;
        for(int i=3;i<=target;i++){
            result=pre+prepre;
            prepre=pre;
            pre=result;
        }
        return result;
    }
}
12-19 15:00