[leetcode刷题之旅]70.爬楼梯

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中国站来查看详细过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值