509. 斐波那契数
题目链接
(1)文字讲解:https://programmercarl.com/0509.%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0.html
(2)视频讲解:https://www.bilibili.com/video/BV13Q4y197Wg
(3)题目链接:https://leetcode.cn/problems/fibonacci-number/
看到代码随想录之前的想法
其实没有想过是动态规划,因为题目的意思描述的非常明确,只要开一个数组然后按照他的规律就可以计算了。
看到代码随想录之后的想法
视频最后还提到其实不需要维护一整个数组,只维护三个数也可以。
本题难点
无。
代码
class Solution {
public:
int fib(int n) {
if(n <= 1){
return n;
}
vector<int> dp(n+1);
dp[0] = 0;
dp[1] = 1;
for(int i = 2; i <= n; i++){
dp[i] = dp[i-1] + dp[i-2];
}
return dp[n];
}
};
维护三个数的:
class Solution {
public:
int fib(int n) {
if(n <= 1){
return n;
}
// vector<int> dp(n+1);
// dp[0] = 0;
// dp[1] = 1;
int num1 = 0;
int num2 = 1;
int sum = 0;
for(int i = 2; i <= n; i++){
// dp[i] = dp[i-1] + dp[i-2];
sum = num1 + num2;
num1 = num2;
num2 = sum;
}
// return dp[n];
return sum;
}
};
70. 爬楼梯
题目链接
(1)文字讲解:https://programmercarl.com/0070.%E7%88%AC%E6%A5%BC%E6%A2%AF.html#%E6%80%9D%E8%B7%AF
(2)视频讲解:https://www.bilibili.com/video/BV17h411h7UH
(3)题目链接:https://leetcode.cn/problems/climbing-stairs/
看到代码随想录之前的想法
这个题之前做过,所以知道递推公式是dp[i-1]+dp[i-2]。不过也很好理解,dp[i]的含义是第i节楼梯总共的走法,那么能到这一节楼梯的位置一定是前一节(跨一步),或者是前两节(跨两步)。
看到代码随想录之后的想法
同上。
本题难点
在文字讲解里面比较需要注意的是初始化dp数组这一段,我觉得讲的很好。dp[2] = 2, 如果dp[0] = 0、dp[1] = 1,那么按照定义其实dp[2] = 1了,这就不对了!不用钻牛角尖想,也不用去为了适配dp[2] = 2强行说服自己dp[0] = 1,题目中说了n是一个正整数,题目根本就没说n有为0的情况。所以本题其实就不应该讨论dp[0]的初始化。
代码
class Solution {
public:
int climbStairs(int n) {
if(n == 1) return n;
vector<int> dp(n+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];
}
};
746. 使用最小花费爬楼梯
题目链接
(1)文字讲解:https://programmercarl.com/0746.%E4%BD%BF%E7%94%A8%E6%9C%80%E5%B0%8F%E8%8A%B1%E8%B4%B9%E7%88%AC%E6%A5%BC%E6%A2%AF.html
(2)视频讲解:https://www.bilibili.com/video/BV16G411c7yZ
(3)题目链接:https://leetcode.cn/problems/min-cost-climbing-stairs/
看到代码随想录之前的想法
这个像是上一道题的加强版,只不过现在走每一步需要有花费,所以dp[i]的含义变成了走到i花费了多少,其他的走两步和走一步和上一题是一样的,很容易想到递推公式是:dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2]) 。
看到代码随想录之后的想法
本题的初始化需要注意一下,题目刻意强调了你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯,所以其实dp[0] = 0、dp[1] = 0。
本题难点
初始化需要注意赋值。
代码
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
vector<int> dp(cost.size()+1);
dp[0] = 0;
dp[1] = 0;
for(int i = 2; i <= cost.size(); i++){
dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2]);
}
return dp[cost.size()];
}
};