背景
最近在刷 leetCode 的时候发现一个问题,解决的思路其实完全可以用递归去实现,用递归的话代码又简洁,三四行代码轻松搞定,但在提交运行后却提示运行超时。不禁对递归思想产生得系统消耗有了更深得认识。
题目
LeetCode 70、爬楼梯
递归方案
class Solution {
public int climbStairs(int n) {
if (n<= 2){
return n;
}
return climbStairs(n- 1)+ climbStairs(n- 2);
}
}
代码虽然简洁,但是但是,运行的时候提示超出时间限制。后来自己随便输入了好几个值,发现返回的方法数都是正确的,就只是执行时间过长。后来,看了下其他的解决方案,找到一个思想与递归类似,但却能顺利通过的方案。
优化方案
class Solution {
public int climbStairs(int n) {
if (n<= 2){
return n;
}
int firstStep = 1;
int secondStep = 2;
for(int i =3; i<= n; i++){
int temp = firstStep+ secondStep;
firstStep = secondStep;
secondStep = temp;
}
return secondStep;
}
}
优化方案的思想与递归方案的思想类似,都有点斐波那契函数的味道。优化方案中只是利用了一个临时变量做中转,进行值得替换。不管是从执行时间还是内存消耗层面来看,都比递归方案好上不少。