LeetCode 👉 HOT 100 👉 爬楼梯 - 简单题

236 阅读2分钟

「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战」。

题目

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

注意:给定 n 是一个正整数。

示例1

输入: 2

输出: 2

解释: 有两种方法可以爬到楼顶。

1.  1 阶 + 1 阶
2.  2 阶

示例2

输入: 3

输出: 3

解释: 有三种方法可以爬到楼顶。

1.  1 阶 + 1 阶 + 1 阶
2.  1 阶 + 2 阶
3.  2 阶 + 1 阶

思路

这道题是很经典的 动态规划 类型题目(为啥?做的多了,题感就来了)。

而这类型题目都是有固定套路的,那么回顾一下动态规划的几个基本步骤:

  • 定义 dp 数组元素的含义

  • 确定数组元素间的关系式

  • 确定边界、初始条件

对于本道算法题,dp 数组元素的含义,可以定义为 dp[i] 为走到第 i 个台阶,共有 dp[i] 种方法;而想要确定元素间的关系式,可以做如下思考,想要到达第 i 个台阶,因为题目规定一次只能爬 1 | 2 个台阶,那么对于第 i 个台阶,只能从第 i - 1 个台阶爬 1 个楼梯到达第 i 个台阶,或者从第 i - 2 个台阶开始,爬 2 个台阶到达第 i 个台阶。因为题目所求为并集,所以可以得出元素间的关系式为 dp[i] = dp[i - 1] + dp[i - 2];上述关系式中,很明显 i 需满足 i >= 2,那么动态规划的 初始条件就有 dp[0] = 1只有1个台阶,只能有一个方法到达),dp[1] = 2两个台阶,可以选择一个一个走,或者一次爬两个,所以两种方法到达);边界条件自然就是 i < n;

代码如下

    /**
     * @param {number} n
     * @return {number}
     */
    var climbStairs = function (n) {
        // 初始化dp
        const dp = new Array(n).fill(0);

        // 初始条件
        dp[0] = 1;
        dp[1] = 2;

        for (let i = 2; i < n; i++) {
            // 元素间关系式
            dp[i] = dp[i - 1] + dp[i - 2];
        }

        // dp[n - 1] 为所求
        return dp[n - 1];
    };

小结

动态规划是一个具有固定套路的解法,如果能够判断出题目可以使用动态规划去解决,那么只要寻找几个要素,基本可以解决问题。

关于如何看出题目适用何种解法,多做题就好了,题感自然就会来~

LeetCode 👉 HOT 100 👉 爬楼梯 - 简单题

合集:LeetCode 👉 HOT 100,有空就会更新,大家多多支持,点个赞👍

如果大家有好的解法,或者发现本文理解不对的地方,欢迎留言评论 😄