返回
算法入门——[力扣]70. 爬楼梯-JavaScript
前端
2023-09-24 21:22:04
问题
假设你正在爬楼梯。需要 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 题「爬楼梯」的算法方法,包括递归和动态规划。并对每种解法进行了详细的思路分析和代码实现,希望读者能够通过本文深入理解算法思想和提高算法实现能力。