题目描述:
一只青蛙一次可以跳上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;
}
}