返回

LeetCode 题解:70. 爬楼梯,用递归+哈希表的 JavaScript 解决方案,附详细注释

前端

理解问题

我们首先来看看 LeetCode 题解:70. 爬楼梯的具体内容:

假设你正在爬楼梯。需要 n 阶台阶才能到达楼顶。每次你可以爬 1 个或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

示例 1:

输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。

  1. 1 阶 + 1 阶
  2. 2 阶

示例 2:

输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。

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

分解问题

现在,我们已经理解了问题,接下来我们将逐步分解它:

  1. 定义一个函数 climbStairs(n),它接受一个参数 n,表示到达楼顶所需的台阶数。
  2. 在函数内部,我们首先检查 n 是否等于 0 或 1。如果是,我们直接返回 1,因为到达楼顶只有一种方法:爬 1 个或 2 个台阶。
  3. 接下来,我们检查 n 是否在哈希表中。如果在,我们直接返回哈希表中的值,因为我们已经计算过这个值了。
  4. 如果 n 不在哈希表中,我们就需要计算它。我们使用递归调用 climbStairs(n-1)climbStairs(n-2) 来计算到达楼顶的方法数。
  5. 最后,我们将计算结果添加到哈希表中,并返回它。

JavaScript 解决方案

/**
 * 计算到达楼顶的不同方法数
 *
 * @param {number} n 到达楼顶所需的台阶数
 * @return {number} 到达楼顶的不同方法数
 */
const climbStairs = (n) => {
  // 哈希表,用于存储已经计算过的值
  const memo = {};

  // 如果 n 等于 0 或 1,直接返回 1
  if (n === 0 || n === 1) {
    return 1;
  }

  // 如果 n 在哈希表中,直接返回哈希表中的值
  if (memo[n]) {
    return memo[n];
  }

  // 计算到达楼顶的方法数
  const result = climbStairs(n - 1) + climbStairs(n - 2);

  // 将计算结果添加到哈希表中
  memo[n] = result;

  // 返回计算结果
  return result;
};

运行结果

我们运行一下这个 JavaScript 解决方案,看看结果:

console.log(climbStairs(2)); // 2
console.log(climbStairs(3)); // 3
console.log(climbStairs(4)); // 5

输出结果:

2
3
5

我们可以看到,我们的 JavaScript 解决方案可以正确地计算到达楼顶的不同方法数。