算法:爬楼梯问题中的递归

背景

最近在刷 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;
    }
}

优化方案的思想与递归方案的思想类似,都有点斐波那契函数的味道。优化方案中只是利用了一个临时变量做中转,进行值得替换。不管是从执行时间还是内存消耗层面来看,都比递归方案好上不少。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。