题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
青蛙跳台阶的普通版本解析
问题分析
我们先规定f(n)为剩下n阶台阶数对应的跳法种数,例如f(0)=f(target-target)代表有target级台阶,并且一次性跳了target级,这时只有一种跳法。f(1)=f(target-(target-1))代表有target级台阶,已经跳过了target-1级台阶,现在还剩一级,则跳上这一级台阶只有一种跳法。
f(2)=f(2-1)+f(2-2)表示一次跳一级或一次跳两级,共2种跳法。f(3)=f(3-1)+f(3-2)+f(3-3)表示先跳1级,则还有3-1=2级台阶的跳法和先跳2级还有一级台阶的跳法加上一次性跳三级的跳法就是跳上3级台阶的所有跳法。
经过了上述分析,我们可以得出结论:
f(n-1)=f((n-1)-1)+f((n-1)-2)+…+f((n-1)-(n-2))+f((n-1)-(n-1));
f(n)=f(n-1)+f(n-2)+f(n-3)+…+f(n-(n-1))+f(n-n)
=f(n-1)+f((n-1)-1)+f((n-1)-2)+…+f((n-1)-(n-2))+f((n-1)-(n-1))=f(n-1)+f(n-1);
代码级解释
由上述的问题分析,我们可以得到f(n)=2*f(n-1),那么这个问题就很好求解了。
public class Solution {
public int JumpFloorII(int target) {
if(target<=0)return 0;
int[] arr=new int[target+1];
arr[0]=0;
arr[1]=1;
if(target>1){
int count=2;
while(count<target+1){
arr[count]=2*arr[count-1];
count++;
}
}
return arr[target];
}
}
我在贴一份牛客网上的递归解法,写的很简洁,而且他问题分析写的也挺不错的,可以看看:
解答的地址
来源:牛客网
public class Solution {
public int JumpFloorII(int target) {
if (target <= 0) {
return -1;
} else if (target == 1) {
return 1;
} else {
return 2 * JumpFloorII(target - 1);
}
}
}