返回

算法入门——[力扣]70. 爬楼梯-JavaScript

前端

问题

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

解法一:递归

思路分析

递归是一种常见的算法设计方法,它通过将问题分解成更小的子问题来解决问题。在这个问题中,我们可以把爬到第 n 阶楼梯分解成爬到第 n-1 阶和爬到第 n-2 阶。然后,我们可以计算爬到第 n-1 阶和爬到第 n-2 阶的不同方法,最后相加得到爬到第 n 阶的不同方法。这种方法可以不断递归下去,直到达到边界条件。

代码实现

function climbStairs(n) {
  if (n === 1) {
    return 1;
  } else if (n === 2) {
    return 2;
  } else {
    return climbStairs(n - 1) + climbStairs(n - 2);
  }
}

解法二:动态规划

思路分析

动态规划是一种常用的算法设计方法,它通过将问题分解成更小的子问题来解决问题,并记录每个子问题的解决方案,避免重复计算。在这个问题中,我们可以把爬到第 n 阶楼梯分解成爬到第 n-1 阶和爬到第 n-2 阶。然后,我们可以使用一个数组来记录爬到每一阶楼梯的不同方法,最后直接返回爬到第 n 阶的不同方法。

代码实现

function climbStairs(n) {
  const dp = new Array(n + 1).fill(0);
  dp[1] = 1;
  dp[2] = 2;
  for (let i = 3; i <= n; i++) {
    dp[i] = dp[i - 1] + dp[i - 2];
  }
  return dp[n];
}

复杂度分析

时间复杂度

  • 递归解法的时间复杂度为 O(2^n),因为每次递归都会将问题分解成两个更小的子问题,因此时间复杂度呈指数级增长。
  • 动态规划解法的时间复杂度为 O(n),因为只需要遍历一次楼梯的每一阶,因此时间复杂度为线性增长。

空间复杂度

  • 递归解法空间复杂度为 O(n),因为在递归过程中需要使用栈来存储每次递归的中间结果。
  • 动态规划解法的空间复杂度为 O(n),因为需要使用一个数组来记录爬到每一阶楼梯的不同方法。

结语

本文详细介绍了两种解决力扣第 70 题「爬楼梯」的算法方法,包括递归和动态规划。并对每种解法进行了详细的思路分析和代码实现,希望读者能够通过本文深入理解算法思想和提高算法实现能力。