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; } }