当前位置 博文首页 > Linux猿:LeetCode 面试必备100题:Climbing Stairs 爬楼梯的方

    Linux猿:LeetCode 面试必备100题:Climbing Stairs 爬楼梯的方

    作者:[db:作者] 时间:2021-09-17 09:03

    作者:Linux猿

    简介:CSDN博客专家,C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

    关注专栏:LeetCode面试必备100题 (优质好文持续更新中……)

    一、题意

    爬一个楼梯,爬 n 步才能到达顶部。每次只能爬 1 步或 2 步,计算有多少种不同的方式到达顶部(1 <= n <= 45)。

    二、测试样例

    1. 样例一

    输入: n = 2

    输出: 2

    有两种方法到达顶部:

    (1)1 步?+ 1?步;

    (2)直接两步;

    2. 样例二

    输入:n = 3

    输出:3

    有三种方法到达顶部:

    (1)1 步?+ 1 步?+ 1 步

    (2)1 步?+ 2 步

    (3)2 步?+ 1 步

    三、解题思路

    本题可以使用动态规划的思想,假设爬 n?阶楼梯需要 f[n] 种方法,那么,就有如下公式:

    为什么是这样呢?

    因为到达第 n?个阶必须从第 n-1 阶走一步或从第 n?- 2 阶走两步到达,前面我们已经假设爬 n?阶楼梯需要 f[n] 种方法,那么爬 n-1 阶 和 爬 n-2 阶的方法数分别就是 f[n-1] 和 f[n-2],故上述公式成立。

    代码实现有两个方式:递归和递推。

    递归求解容易超时,因为不断递归容易栈溢出。递推的方式明显的节省了空间。

    本题还可以延伸一下,改成可以取模的形式,比如:

    求到达第 n 阶有多少种方法? n < 10^7(比如:结果对10^5 + 7 取余)。

    这样难度就更大了,单纯使用 for 循环就不行了。当然打表的话应该还是可以的。最佳的方法是使用矩阵快速幂的方法,大家可以自行了解下,这里就不延伸了。

    四、代码实现

    class Solution {
    public:
        int climbStairs(int n) {
            if(n <= 2) return n;
            int first = 1, second = 2;
            for(int i = 3; i <= n; ++i){
                int tmp = first + second;
                first = second;
                second = tmp;
            }
            return second;
        }
    };

    上述代码并没有使用 f[] 数组的形式,而是使用了两个变量 first 和 second 来模拟实现,因为有用的永远是前两个元素。?

    五、题目链接

    Climbing Stairs

    关注专栏:LeetCode面试必备100题 (优质好文持续更新中……)

    cs