题目描述:
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
跳上n级台阶的问题可以化成从第n-1,n-2,...,1,0级台阶直接跳上来的跳法加在一起,最终所有跳法的原点一定是从第0级台阶开始跳,所以循环的终止条件为target>=0
解法一:
public class Solution {
public int JumpFloorII(int target) {
int num = 0;
if(target == 0) {
return 1;
}
while(target >= 0) {
num += JumpFloorII(--target);
}
return num;
}
}
运行时间:29ms
占用内存:9264k
进一步进行优化,因为f(x) = f(x - 1) + f(x - 2) + ... + f(0),而f(x)减去f(x - 1)剩下的那一坨刚好等于f(x - 1),所以f(x) = 2 * f(x - 1),所以有下面的解法。
解法二:
public class Solution {
public int JumpFloorII(int target) {
if(target == 1) {
return 1;
}
int num = 1;
while(--target > 0) {
num *= 2;
}
return num;
}
}
运行时间:17ms
占用内存:9336k