题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
AC代码
方法一
public class Solution {
public int JumpFloorII(int target) {
int ans=0;
if(target==1||target==0)
return 1;
if(target==2)
return 2;
for(int i=0;i<target;i++){
ans+=JumpFloorII(i);
}
return ans;
}
}
方法二
用Fib(n)表示跳上n阶台阶的跳法数。
Fib(1)=1,从第0层直接一步到第1层;
Fib(2)=2,从第0层先走一步到第1层,然后再走一步到第2层;(1)
从第0层直接迈两步走到第2层;(2)
Fib(3)=4,从第0层开始,每次只上一个台阶,最终到第3层;(1)
从第0层开始,先到第2层,然后再走一步到第3层,由于从第0层开始到第二层Fib(2)有两种方式,所以,先到第二层再到第三层的方案有2种;(3)
从第0层直接走到第3层(4);
能发现Fib(n)=Fib(n-1)+Fib(n-2)+…+Fib(1)+1,这里为了好理解,可以将Fib(0)看作是从第0层直接到第n层的跳法,Fib(0)=1。所以Fib(n)=Fib(n-1)+Fib(n-2)+…+Fib(1)+Fib(0)。
因此,有 Fib(n-1)=Fib(0)+Fib(1)+Fib(2)+…+Fib(n-2)
两式相减得:Fib(n)-Fib(n-1) = Fib(n-1) ->>> Fib(n) = 2*Fib(n-1) 【n>=3】,然后根据这个公式写代码。
public class Solution {
public int JumpFloorII(int target) {
//保证不会出现边界溢出
int cnt[]=new int[target+5];
cnt[0]=1;cnt[1]=1;cnt[2]=2;
if(target<3)
return cnt[target];
for(int i=3;i<=target;i++){
cnt[i]=2*cnt[i-1];
}
return cnt[target];
}
}