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

作者: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题 (优质好文持续更新中……)

おすすめ

転載: blog.csdn.net/u011074149/article/details/118594980