前言:锻炼自己的思想,规范自己的编程思路。
问题:
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
示例:(放代码里面)
输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶
思路:
爬楼梯问题是一个经典的动态规划问题,它的描述如下:
假设你正在爬楼梯。需要 n 阶才能到达楼顶。每次你可以爬 1 或 2 阶。你有多少种不同的方法可以爬到楼顶?
函数接受一个参数n,表示楼梯的阶数。函数使用动态规划来计算解决方案。
首先,定义一个数组 dp 来存储中间结果。dp[i] 表示爬到第 i 阶楼梯的方法数。初始化 dp[0] 和 dp[1] 为 1,表示爬到第 0 阶和第 1 阶楼梯只有一种方法。
接下来,使用一个循环来计算 dp[i] 的值。对于每个 i,有两种方法可以爬到第 i 阶楼梯:从第 i-1 阶楼梯爬 1 阶,或从第 i-2 阶楼梯爬 2 阶。因此,dp[i] = dp[i-1] + dp[i-2]。
最后,返回 dp[n] 即可。
基于上述思考,代码如下:
/**
* @param {number} n
* @return {number}
*/
var climbStairs = function(n) {
const dp = [];
dp[0] = 1;
dp[1] = 1;
for(let i = 2; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
};
执行结果如下图:
学到的知识点:
动态规划是一种解决问题的方法,它将问题分解为多个子问题,并将子问题的解存储起来,以便在计算后续子问题时使用。这种方法可以避免重复计算相同的子问题,从而提高效率。
动态规划通常用于解决最优化问题,即在许多可能的解决方案中找到最优解。动态规划的关键思想是利用子问题的最优解来构造原问题的最优解。
动态规划通常包括以下步骤:
- 定义子问题:将原问题分解为多个子问题。
- 定义状态:定义一个状态来表示每个子问题的解。
- 定义状态转移方程:定义一个方程来描述如何从已知的子问题的解计算出当前子问题的解。
- 计算最优解:使用状态转移方程来计算所有子问题的解,并找到原问题的最优解。