Skip to content

Commit cb02071

Browse files
committed
1
1 parent f363c70 commit cb02071

File tree

18 files changed

+431
-0
lines changed

18 files changed

+431
-0
lines changed

notes/src/SUMMARY.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,4 +151,22 @@
151151
- [322. 零钱兑换](./day45/lc322.md)
152152
- [279.完全平方数](./day45/lc279.md)
153153
- [day 46](./day46.md)
154+
- [139.单词拆分](./day46/lc139.md)
155+
- [day 48](./day48.md)
156+
- [198.打家劫舍](./day48/lc198.md)
157+
- [213.打家劫舍II](./day48/lc213.md)
158+
- [337.打家劫舍III](./day48/lc337.md)
159+
- [day 49](./day49.md)
160+
- [121. 买卖股票的最佳时机](./day49/lc121.md)
161+
- [122.买卖股票的最佳时机II](./day49/lc122.md)
162+
- [day 50](./day50.md)
163+
- [123.买卖股票的最佳时机III](./day50/lc123.md)
164+
- [188.买卖股票的最佳时机IV](./day50/lc188.md)
165+
- [day 51](./day51.md)
166+
- [309.最佳买卖股票时机含冷冻期](./day51/lc309.md)
167+
- [714.买卖股票的最佳时机含手续费](./day51/lc714.md)
168+
- [day 52](./day52.md)
169+
- [300.最长递增子序列](./day52/lc300.md)
170+
- [674. 最长连续递增序列](./day52/lc674.md)
171+
- [718. 最长重复子数组](./day52/lc718.md)
154172
- [remains](./remains.md)

notes/src/day48.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# 第九章 动态规划part09
2+
● 198.打家劫舍
3+
● 213.打家劫舍II
4+
● 337.打家劫舍III
5+
6+
详细布置
7+
8+
今天就是打家劫舍的一天,这个系列不算难,大家可以一口气拿下。
9+
10+
## 198.打家劫舍
11+
视频讲解:https://www.bilibili.com/video/BV1Te411N7SX
12+
https://programmercarl.com/0198.%E6%89%93%E5%AE%B6%E5%8A%AB%E8%88%8D.html
13+
14+
## 213.打家劫舍II
15+
视频讲解:https://www.bilibili.com/video/BV1oM411B7xq
16+
https://programmercarl.com/0213.%E6%89%93%E5%AE%B6%E5%8A%AB%E8%88%8DII.html
17+
18+
## 337.打家劫舍III
19+
视频讲解:https://www.bilibili.com/video/BV1H24y1Q7sY
20+
https://programmercarl.com/0337.%E6%89%93%E5%AE%B6%E5%8A%AB%E8%88%8DIII.html

notes/src/day48/lc198.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# 198. 打家劫舍
2+
3+
这个是抄随想录的
4+
5+
6+
```cpp
7+
class Solution {
8+
public:
9+
int rob(vector<int>& nums) {
10+
if (nums.size() == 0) return 0;
11+
if (nums.size() == 1) return nums[0];
12+
// dp[i]:考虑下标i(包括i)以内的房屋,最多可以偷窃的金额为dp[i]
13+
// dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);
14+
vector<int> dp(nums.size());
15+
dp[0] = nums[0];
16+
dp[1] = max(nums[0], nums[1]);
17+
for (int i = 2; i < nums.size(); i++) {
18+
dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);
19+
}
20+
return dp[nums.size() - 1];
21+
}
22+
};
23+
```

notes/src/day48/lc213.md

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
## 213. 打家劫舍 II
2+
3+
这个是自己写的
4+
5+
```cpp
6+
class Solution {
7+
public:
8+
int rob(vector<int>& nums) {
9+
if (nums.size() == 0) return 0;
10+
if (nums.size() == 1) return nums[0];
11+
// dp[i]:考虑下标i(包括i)以内的房屋,最多可以偷窃的金额为dp[i]
12+
// dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);
13+
vector<int> dp(nums.size());
14+
// skip index 0 first
15+
int res = 0;
16+
dp[0] = 0;
17+
dp[1] = nums[1];
18+
for (int i = 2; i < nums.size(); i++) {
19+
dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);
20+
}
21+
res = dp[nums.size()-1];
22+
dp[0] = nums[0];
23+
dp[1] = max(nums[0], nums[1]);
24+
25+
for (int i = 2; i < nums.size() - 1; i++) {
26+
dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);
27+
}
28+
29+
res = max(res,dp[nums.size()-2]);
30+
return res;
31+
}
32+
};
33+
```

notes/src/day48/lc337.md

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
# 337.打家劫舍III
2+
3+
自己做的
4+
5+
```cpp
6+
/**
7+
* Definition for a binary tree node.
8+
* struct TreeNode {
9+
* int val;
10+
* TreeNode *left;
11+
* TreeNode *right;
12+
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
13+
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
14+
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
15+
* };
16+
*/
17+
class Solution {
18+
public:
19+
// <r1,r2> r1 如果偷当前节点,得到的最大值 ; r2 不偷当前节点的最大值
20+
pair<int,int> f(TreeNode*root) {
21+
if(!root){return make_pair(0,0);}
22+
auto leftr = f(root->left);
23+
auto rightr = f(root->right);
24+
int takeleft = leftr.first;
25+
int notakeleft = leftr.second;
26+
int takeright = rightr.first;
27+
int notakeright = rightr.second;
28+
int r1 = notakeleft + notakeright + root->val;
29+
int r2 = max(takeleft,notakeleft) + max(takeright,notakeright);
30+
return make_pair(r1, r2);
31+
}
32+
int rob(TreeNode* root) {
33+
auto res = f(root);
34+
return max(res.first, res.second);
35+
}
36+
};
37+
```

notes/src/day49.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# 第九章 动态规划part10
2+
3+
● 121. 买卖股票的最佳时机
4+
● 122.买卖股票的最佳时机II
5+
6+
详细布置
7+
8+
股票问题是一个动态规划的系列问题,今日安排的题目不多,大家可以慢慢消化。
9+
10+
## 121. 买卖股票的最佳时机
11+
视频讲解:https://www.bilibili.com/video/BV1Xe4y1u77q
12+
https://programmercarl.com/0121.%E4%B9%B0%E5%8D%96%E8%82%A1%E7%A5%A8%E7%9A%84%E6%9C%80%E4%BD%B3%E6%97%B6%E6%9C%BA.html
13+
14+
15+
16+
17+
18+
## 122.买卖股票的最佳时机II
19+
视频讲解:https://www.bilibili.com/video/BV1D24y1Q7Ls
20+
https://programmercarl.com/0122.%E4%B9%B0%E5%8D%96%E8%82%A1%E7%A5%A8%E7%9A%84%E6%9C%80%E4%BD%B3%E6%97%B6%E6%9C%BAII%EF%BC%88%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%EF%BC%89.html

notes/src/day49/lc121.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# 121. 买卖股票的最佳时机
2+
3+
一开始这样子没有用动规
4+
5+
```cpp
6+
class Solution {
7+
public:
8+
int maxProfit(vector<int>& prices) {
9+
int res = 0;
10+
int cmin = INT_MAX;
11+
for (int i = 0; i < prices.size(); i ++ ) {
12+
cmin = min(cmin, prices[i]);
13+
if (prices[i] > cmin) {
14+
res = max(res, prices[i] - cmin);
15+
}
16+
}
17+
return res;
18+
}
19+
};
20+
```

notes/src/day49/lc122.md

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# 122. 买卖股票的最佳时机 II
2+
3+
抄了随想录
4+
5+
```cpp
6+
class Solution {
7+
public:
8+
int maxProfit(vector<int>& prices) {
9+
int len = prices.size();
10+
vector<vector<int>> dp(len, vector<int>(2, 0));
11+
// dp[i][0] 表示第i天持有股票所得现金。
12+
// dp[i][1] 表示第i天不持有股票所得最多现金
13+
14+
// 如果第i天持有股票即dp[i][0], 那么可以由两个状态推出来
15+
16+
// 第i-1天就持有股票,那么就保持现状,所得现金就是昨天持有股票的所得现金 即:dp[i - 1][0]
17+
// 第i天买入股票,所得现金就是昨天不持有股票的所得现金减去 今天的股票价格 即:dp[i - 1][1] - prices[i]
18+
19+
20+
// 再来看看如果第i天不持有股票即dp[i][1]的情况, 依然可以由两个状态推出来
21+
22+
// 第i-1天就不持有股票,那么就保持现状,所得现金就是昨天不持有股票的所得现金 即:dp[i - 1][1]
23+
// 第i天卖出股票,所得现金就是按照今天股票价格卖出后所得现金即:prices[i] + dp[i - 1][0]
24+
dp[0][0] -= prices[0];
25+
dp[0][1] = 0;
26+
for (int i = 1; i < len; i++) {
27+
dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]); // 注意这里是和121. 买卖股票的最佳时机唯一不同的地方。
28+
dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i]);
29+
}
30+
return dp[len - 1][1];
31+
32+
33+
}
34+
};
35+
```

notes/src/day50.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# 第九章 动态规划part11
2+
3+
● 123.买卖股票的最佳时机III
4+
● 188.买卖股票的最佳时机IV
5+
6+
详细布置
7+
8+
## 123.买卖股票的最佳时机III
9+
10+
这道题一下子就难度上来了,关键在于至多买卖两次,这意味着可以买卖一次,可以买卖两次,也可以不买卖。
11+
视频讲解:https://www.bilibili.com/video/BV1WG411K7AR
12+
https://programmercarl.com/0123.%E4%B9%B0%E5%8D%96%E8%82%A1%E7%A5%A8%E7%9A%84%E6%9C%80%E4%BD%B3%E6%97%B6%E6%9C%BAIII.html
13+
14+
## 188.买卖股票的最佳时机IV
15+
本题是123.买卖股票的最佳时机III 的进阶版
16+
视频讲解:https://www.bilibili.com/video/BV16M411U7XJ
17+
https://programmercarl.com/0188.%E4%B9%B0%E5%8D%96%E8%82%A1%E7%A5%A8%E7%9A%84%E6%9C%80%E4%BD%B3%E6%97%B6%E6%9C%BAIV.html
18+
19+
20+
21+

notes/src/day50/lc123.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# 123.买卖股票的最佳时机III
2+
3+
4+
自己写的时候漏掉了`dp[0][3]=-prices[0];`这个条件
5+
6+
```cpp
7+
class Solution {
8+
public:
9+
int maxProfit(vector<int>& prices) {
10+
// 一天一共就有五个状态,
11+
12+
// 没有操作 (其实我们也可以不设置这个状态)
13+
// 第一次持有股票
14+
// 第一次不持有股票
15+
// 第二次持有股票
16+
// 第二次不持有股票
17+
// dp[i][j]中 i表示第i天,j为 [0 - 4] 五个状态,dp[i][j]表示第i天状态j所剩最大现金。
18+
vector<vector<int>>dp(prices.size(), vector<int>(5,0));
19+
dp[0][1]=dp[0][3]=-prices[0];
20+
21+
for(int i=1;i<prices.size();i++){
22+
dp[i][1] = max(dp[i - 1][0] - prices[i], dp[i - 1][1]);
23+
dp[i][2] = max(dp[i - 1][1] + prices[i], dp[i - 1][2]);
24+
dp[i][3] = max(dp[i - 1][2] - prices[i], dp[i - 1][3]);
25+
dp[i][4] = max(dp[i - 1][3] + prices[i], dp[i - 1][4]);
26+
}
27+
return max(dp[prices.size()-1][2],dp[prices.size()-1][4]);
28+
}
29+
};
30+
```

0 commit comments

Comments
 (0)