1.题目解析
这题其实是典型的Fibonacci问题,每次爬楼梯都只能爬一层或爬两层,那么我们要是想上第n层就只能从第n-1层上一层,或者从第n-2层上两层,同样的要上第n-1层和第n-2都有两种解法。那么我们就可以得到通项:f(n) = f(n-1) + f(n-2),n代表层数且n要大于3。
同时题目约定了给出的n是大等于1的所以可以不用考虑非正数的情况。
2.实现代码
2.1 递归
public int climbStairs(int n) {
return recursion(n);
}
public int recursion(int n){
if (n < 2) return n;
return recursion(n) + recursion(n-1);
}
这个是很简单的递归,就不解释了。
2.2 缓存递归
public int climbStairs(int n) {
int f2 = 2,f3 = 3;
if(n < 4) return n;
for(int i =3; i< n; i++){
f3 = f3 + f2;
f2 = f3 - f2;
}
return f3;
}
其实在计算机底层中递归和循环的代码段都是类似的,都是对同一代码段的复用。但递归每次执行的时候会产生新的局部变量,占用内存空间。而且有的代码会进行数次递归大大增加了程序执行时间。
因此我们可以得到一种新的递归,核心思想和递归是一致的,但是他只保存两个个变量:当前台阶的步数和上一个台阶的步数。
要推断也很简单:f(n + 1) = f(n) + f(n-1) f(n) = f(n + 1) - f(n-1)
2.3 其他解法
leetcode官方还提供了另外两种解法,一种是矩阵解法,另外一种是通项公式解法。这两种解法更偏向于数学求解,大家有兴趣可以到leetcode中国站来查看详细过程。