题目描述:
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
解:
这道题显然使用搜索树进行查询,所以我们考虑递归的效率问题。这道题目中可以从每次跳一阶递增至直接跳完开始查找,也可以从直接跳完然后递减至跳一阶查找,看自己习惯。全局搜索显然太浪费时间,因为这里只有阶数限制,并没有其它要求,所以我们每算出一个答案就可以保存下来,提供给往后相同阶数搜索时直接得出结果。选择从简单(递减序)开始算起,因为算出了1阶的跳法,到时2阶就能直接用,然后3阶就能直接调用1和2阶。如果是以先跳一阶,那么进入递归的就是jump(n-1),还是得再开新内存来计算。所以有时候贪心算法(也就是尽可能结束操作,所以先考虑跳最多)有其优势。
public class Solution {
private int[] sum;
public int jump(int n){
if(sum[n]!=0)
return sum[n];
for(int i=n;i>=1;i--){
sum[n]+=jump(n-i);
}
return sum[n];
}
public int JumpFloorII(int target) {
sum=new int[target+1];
//简化代码,省去if(n==0)的判断
sum[0]=1;
for(int i=1;i<=target;i++){
sum[i]=0;
}
return jump(target);
}
}
--end--