题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
变态跳台阶:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
分析思路
先来看跳台阶:
青蛙最后一次跳到第n级台阶有几种情况?只有两种可能:
1.从第n-1级台阶一次跳1级跳到第n级台阶
2.从第n-2级台阶一次跳2级跳到第n级台阶
正是由于只有这两种可能,则
假设该青蛙跳上n-1级台阶有X种跳法,跳上n-2级台阶有Y种跳法
那么青蛙跳上第n级台阶只可能会有X+Y种跳法
设青蛙跳上一个n级的台阶总共有f(n)种跳法,由上述分析易得
f(n) = f(n-2) + f(n-1)
考虑边界:
f(1) = 1
f(2) = 2 可以一次跳1级,跳两次;也可以一次跳2级,跳一次
跳台阶AC Code:
class Solution {
public:
int jumpFloor(int number) {
if(number == 1) return 1;
if(number == 2) return 2;
int *f = new int[number + 1];
f[1] = 1;
f[2] = 2;
for(int i = 3;i<=number;++i)
f[i] = f[i-2] + f[i-1];
int res = f[number];
delete[] f;
return res;
}
};
再来看变态跳台阶:
(一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。)
理解了跳台阶的话,变态跳台阶其实是一样的:
青蛙最后一次跳到第n级台阶有几种情况?有n种可能:
1.从第n-1级台阶一次跳1级跳到第n级台阶
2.从第n-2级台阶一次跳2级跳到第n级台阶
...
n-1.从第1级台阶一次跳n-1级跳到第n级台阶
n.从第0级台阶一次跳n级跳到第n级台阶
设青蛙跳上一个n级的台阶总共有f(n)种跳法,由上述分析易得
f(n) = 1 + f(n-1) + f(n-2) + ··· + f(1)
变态跳台阶AC Code:
class Solution {
public:
int jumpFloorII(int number) {
int *f = new int[number+1];
f[1] = 1;
for(int i = 2;i<=number;++i){
f[i] = 1;
for(int j = i-1;j>=1;--j){
f[i]+=f[j];
}
}
int res = f[number];
delete[] f;
return res;
}
};