刚开始根据题意直接使用动态规划,所写代码为:
int result;
if(n==1){
return 1;
}else if (n==2){
return 2;
} else{
result=climbStairs(n-1)+climbStairs(n-2);
}
return result;
无法通过的原因在于:在递归的过程中会重复的计算已经计算过的值。比如:n=5时,有result=climbStairs(4)+climbStairs(3);
climbStairs(4)中还需进行climbStairs(3)的操作,故重复进行了,大大加长了算法的执行时间,导致通不过。
如果我们把从0到n-1的阶梯数全部计算出放入一个数组内存储起来,那么就能很快得到最终以n为阶梯数时所有上楼梯方法的总和。代码入下:
int[] a=new int[n+1];
a[0]=1;
a[1]=1;
for(int i=2;i<=n;i++){
a[i]=a[i-1]+a[i-2]; //依次将每一种阶梯数对应的所有可能的step种数求和,都存起来
}
return a[n];
PASS!