class Solution {
public:
int climbStairs(int n) {
if (n <= 1) return n; // 异常处理
vector<int> dp(n+1); // 定义一个由int组成的可变的变量 的意思
// 之所以定义为n+1 主要是为了下面让dp[1]表示第一个台阶 方便理解
dp[1] = 1;
dp[2] = 2;
for (int i = 3;i <= n; i++){
dp[i] = dp[i - 1] + dp[i-2];
}
return dp[n]; // 这里忘记写分号了
}
};
还可以再通过把 dp[i - 1] dp[i - 2]两个变量值都存到 dp[1] dp[2]中存起来的方法,节约空间复杂度。一刷先这样~ 这样最有动归的感觉。
代码随想录的 动归模板:
1. 先看懂dp table 和 下标的含义:只需要知道并自己定义清楚dp[i]的意思 和 i的意思
2. 确定递推公式:dp[i] = dp[i-1] + dp[i-2]
3. dp数组初始化:
4. 确定遍历顺序:感觉和2有点像
5. 举例推导dp 数组:和1不一样的地方在于,这里需要用实例推几个出来。可以用于出错时检查输出是否和dp一致。
这里不知道刷到后面能不能把这个步骤再抽象一下,或者改改顺序。感觉目前刷动归都要先做第5步才能写出2。
PS:
1. 之前都是用的python,借着刷题的机会学一下C++,让自己更有刷题的动力一些。
2. 力扣这些知识真的很无聊啊,但是为啥面试一定要看GPT随便就能取代的东西啊
3. 说是要从简单题抽象出复杂概念来是不行的啊 没办法验证自己抽出来的是不是适用的。
4. 或许还是得二刷,第一遍就不要追求完全能搞懂,能AC明白逻辑就可以。话说回来,这条也有待验证。。