按照题目的正常思路,可以写出以下的递归代码。
class Solution {
public int rec(int n)
{
if(n-1==0)
return 1;
else if(n-2==0) return 1+rec(n-1);
else return rec(n-1)+rec(n-2);
}
public int climbStairs(int n) {
int sum = rec(n);
return sum;
}
}
但是,使用递归一般复杂度比较高。
通过找规律,发现这个题有一个数学式,第三个台阶数的走法为前两个之和。
例如一级台阶走法为1种(1),二级台阶走法为2两种(1,1;2),三级台阶走法为三种(1,1,1 ; 1,2 ; 2,1),四级台阶为五种(1,1,1,1 ; 2,2 ; 1,1,2 ; 1,2,1 ; 2,1,1)
我们可以看到 三级(3)=二级(2)+一级(1) 四级(5)=三级(3)+二级(2)
所以可以写出以下代码,大大减低复杂度。
class Solution {
public int climbStairs(int n) {
if(n==1) return 1;
if(n==2) return 2;
int []way=new int[n];
way[0]=1;
way[1]=2;
for(int i=2;i<=n-1;i++){
way[i]=way[i-1]+way[i-2];
}
return way[n-1];
}
}
本文探讨了经典的爬楼梯问题,通过分析递归算法的高复杂度,提出了一个基于数学规律的优化方案。通过观察发现,第n级台阶的走法等于前两级之和,从而设计了一个线性复杂度的动态规划算法,显著提高了效率。
483

被折叠的 条评论
为什么被折叠?



