题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
题目分析
n=1时,有一种跳法;n=2时,有两种跳法。
把n级台阶时的跳法看成n的函数,记为f(n)。n>2,第一次跳的时候就有两种不同的选择:
第一次跳1级,此时跳法等于后面的n-1级台阶的跳法,即f(n-1);
第一次跳2级,此时跳法等于后面的n-2级台阶的跳法,即f(n-2)。
因此,n级台阶的不同跳法总数f(n)=f(n-1)+f(n-2),即为菲波那切数列。
//递归做法
class Solution {
public:
int fbi(int i){
if(i <= 2)
return i==1 ? 1 : 2;
return fbi(i-1)+fbi(i-2);
}
int jumpFloor(int number) {
int m;
return m=fbi(number);
}
};
另一种做法:
class Solution {
public:
//从n中取m个进行排列组合
int combination(int m, int n){
long long C;
long long C_up = n, C_down = m;
if(m == 0)
return C=1;
else{
for(int i=n-1; i>=n-m+1; i--)
C_up = C_up * i;
for(int j=m-1; j>=1; j--)
C_down = C_down * j;
C = C_up / C_down;
return C;
}
}
int jumpFloor(int number) {
int oneNum, twoNum;
long long numSum;
long long result = 0;
for(oneNum=number; oneNum>=0; oneNum=oneNum-2){
twoNum = (number - oneNum) / 2;
numSum = oneNum + twoNum;
result = result + combination(twoNum, numSum);
}
return result;
}
};