题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
思路
假设一只青蛙跳上n级台阶共有跳法f(n)
则按最后一跳跳多少级,可以分为
先跳n-1级,最后一跳跳1级,跳法为f(n-1)
先跳n-2级,最后一跳跳2级,跳法为f(n-2)
先跳n-3级,最后一跳跳3级,跳法为f(n-3)
……
先跳1级,最后一跳跳n-1级,跳法为f(1)=1
直接一跳跳上n级,跳法为1,即令f(n-n)=f(0)=1
故有
f(n)=f(n-1)+f(n-2)+f(n-3)+....+f(1)+f(0)
方法一
为避免重复计算,使用map保存计算结果
import java.util.HashMap;
public class Solution {
HashMap<Integer,Integer> map=new HashMap<>();
public int JumpFloorII(int target) {
if(target==0) return 1;
else if(target==1) return 1;
else if(target==2) return 2;
else{
Integer t=map.get(target);
if(t==null){
t=0;
for(int i=0;i<target;i++){
t+=JumpFloorII(i);
}
map.put(target,t);
}
return t;
}
}
}
方法二
由
f(n)=f(n-1)+f(n-2)+f(n-3)+....+f(1)+f(0)
可知
f(n-1)=f(n-2)+f(n-3)+....+f(1)+f(0)
则有
f(n)=f(n-1)+f(n-1)=2*f(n-1)
public class Solution {
public int JumpFloorII(int target) {
if(target<=0) return 0;
else if(target==1) return 1;
else if(target==2) return 2;
else{
return 2*JumpFloorII(target-1);
}
}
}
或者使用非递归方法
public class Solution {
public int JumpFloorII(int target) {
if(target<=0) return 0;
else if(target==1) return 1;
else if(target==2) return 2;
else{
int ret=1;
while(--target>0) ret*=2;
return ret;
}
}
}