Skip to content

Commit 57c2a25

Browse files
Update
1 parent 8b64043 commit 57c2a25

File tree

4 files changed

+101
-0
lines changed

4 files changed

+101
-0
lines changed

README.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121

2222
(持续更新中....)
2323

24+
**通知:不少录友反馈说:刷题攻略这一栏怎么没有了,因为发现一些公众号会抄袭我的刷题攻略把整个刷题顺序全部抄走,所以这块我暂时先不对外开放了**
25+
2426
# 算法文章精选
2527

2628
**提示:在电脑端看如下文章的,看不到文章的评论区,建议在手机端「代码随想录」公众号里也翻一下对应的文章,评论区有录友们的打卡总结,相信会和你有不少共鸣!**
@@ -174,6 +176,7 @@
174176
* [贪心算法:分发饼干](https://mp.weixin.qq.com/s/YSuLIAYyRGlyxbp9BNC1uw)
175177
* [贪心算法:摆动序列](https://mp.weixin.qq.com/s/Xytl05kX8LZZ1iWWqjMoHA)
176178
* [贪心算法:最大子序和](https://mp.weixin.qq.com/s/DrjIQy6ouKbpletQr0g1Fg)
179+
* [本周小结!(贪心算法系列一)](https://mp.weixin.qq.com/s/KQ2caT9GoVXgB1t2ExPncQ)
177180

178181

179182
* 动态规划
@@ -192,6 +195,16 @@
192195

193196
(持续更新中....)
194197

198+
# LeetCode 刷题攻略
199+
200+
刷题顺序:建议先从同一类型里题目开始刷起,同一类型里再从简单到中等到困难刷起,题型顺序建议:**数组-> 链表-> 哈希表->字符串->栈与队列->树->回溯->贪心->动态规划->图论**
201+
202+
目前大家可以按照上面的「算法文章精选」顺序来刷,都是各个类型的经典题目而且题目顺序都是精心设计,**初学者可以按照这个顺序来刷题**,算法老手可以按照这个list查缺补漏!
203+
204+
**同时这份刷题列表也在公众号[「代码随想录」](https://img-blog.csdnimg.cn/20201124161234338.png)左下角的「算法汇总」里,方便大家用手机查看**,用手机看的好处可以看到每篇文章下都有很多录友(代码随想录的朋友们)的留言,录友会总结每篇文章的重点,如果文章有一些笔误的话,留言区也会及时纠正,所以**刷一下文章留言区会对理解知识点非常有帮助!**而且公众号更新要比Github早2-3天。
205+
206+
**赶紧去公众号[「代码随想录」](https://img-blog.csdnimg.cn/20201124161234338.png)里看看吧,你会发现相见恨晚!**
207+
195208

196209
# 算法模板
197210

@@ -283,8 +296,10 @@
283296
|[0242.有效的字母异位词](https://github.com/youngyangyang04/leetcode/blob/master/problems/0242.有效的字母异位词.md) |哈希表 |简单| **哈希**|
284297
|[0257.二叉树的所有路径](https://github.com/youngyangyang04/leetcode/blob/master/problems/0257.二叉树的所有路径.md) ||简单| **递归/回溯**|
285298
|[0283.移动零](https://github.com/youngyangyang04/leetcode/blob/master/problems/0283.移动零.md) |数组 |简单| **双指针** 和 27.移除元素 一个套路|
299+
|[0300.最长上升子序列](https://github.com/youngyangyang04/leetcode/blob/master/problems/0300.最长上升子序列.md) |动态规划 |中等| **动态规划**|
286300
|[0316.去除重复字母](https://github.com/youngyangyang04/leetcode/blob/master/problems/0316.去除重复字母.md) |贪心/字符串 |中等| **单调栈** 这道题目处理的情况比较多,属于单调栈中的难题|
287301
|[0332.重新安排行程](https://github.com/youngyangyang04/leetcode/blob/master/problems/0332.重新安排行程.md) |深度优先搜索/回溯 |中等| **深度优先搜索/回溯算法**|
302+
|[0343.整数拆分](https://github.com/youngyangyang04/leetcode/blob/master/problems/0343.整数拆分.md) |动态规划/贪心 |中等| **动态规划**|
288303
|[0344.反转字符串](https://github.com/youngyangyang04/leetcode/blob/master/problems/0344.反转字符串.md) |字符串 |简单| **双指针**|
289304
|[0347.前K个高频元素](https://github.com/youngyangyang04/leetcode/blob/master/problems/0347.前K个高频元素.md) |哈希/堆/优先级队列 |中等| **哈希/优先级队列**|
290305
|[0349.两个数组的交集](https://github.com/youngyangyang04/leetcode/blob/master/problems/0349.两个数组的交集.md) |哈希表 |简单|**哈希**|
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
2+
* dp[i]的定义
3+
4+
dp[i]表示i之前包括i的最长上升子序列。
5+
6+
7+
* dp[i]的初始化
8+
9+
每一个i,对应的dp[i](即最长上升子序列)起始大小至少是1.
10+
11+
12+
* 状态转移方程
13+
14+
15+
if (nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1);
16+
17+
```
18+
class Solution {
19+
public:
20+
int lengthOfLIS(vector<int>& nums) {
21+
if (nums.size() <= 1) return nums.size();
22+
vector<int> dp(nums.size(), 1);
23+
int result = 0;
24+
for (int i = 1; i < nums.size(); i++) {
25+
for (int j = 0; j < i; j++) {
26+
if (nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1);
27+
}
28+
if (dp[i] > result) result = dp[i]; // 取长的子序列
29+
//for (int j = 0 ; j < nums.size(); j++) cout << dp[j] << " ";
30+
//cout << endl;
31+
}
32+
return result;
33+
}
34+
};
35+
```

problems/0343.整数拆分.md

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
2+
// 拆成两个 还是拆成三个呢
3+
4+
# 思路
5+
6+
## 动态规划
7+
8+
* 明确dp[i]的含义
9+
10+
dp[i]表示 分拆数字i,可以得到的最大乘积。
11+
12+
* dp的初始化
13+
14+
初始化dp[i] = i,这里的初始化 不是为了让 i的最大乘积是dp[i],而是为了做递推公式的时候,dp[i]可以表示i这个数字,好用来做乘法。
15+
16+
* 递归公式
17+
18+
可以想 dp[i]的最大乘积是怎么得到的呢?
19+
20+
**一定是dp[j]的最大乘积 * dp[i - j]的最大乘积,那么只需要遍历一下j(取值范围[2,i-1)),取此时dp[i]的最大值就可以了**
21+
22+
递推公式:dp[i] = max(dp[i], dp[i - j] * dp[j]);
23+
24+
```
25+
class Solution {
26+
public:
27+
int integerBreak(int n) {
28+
if (n <= 3) return 1 * (n - 1); // 处理 2和3的情况
29+
int dp[60];
30+
for (int i = 0; i <= n; i++) dp[i] = i; // 初始化
31+
for (int i = 4; i <= n ; i++) {
32+
for (int j = 2; j < i - 1; j++) {
33+
dp[i] = max(dp[i], dp[i - j] * dp[j]);
34+
}
35+
}
36+
return dp[n];
37+
}
38+
};
39+
```
40+
41+
# 贪心
42+
43+
本题也可以用贪心,但是真的需要数学证明证明其合理性,网上有很多贪心的代码,每次拆成3就可以了,代码很简单,大家如果感兴趣可以自己去查一查。
44+
45+
我这里就不做证明了。

problems/0406.根据身高重建队列.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,12 @@
2323

2424
贪心在优先按照身高高的people的k来插入,后序插入节点也不会影响前面已经插入的节点,最终按照k的规则完成了队列。
2525

26+
局部最优:优先按照身高搞的people的k来插入。插入操作过后的people满足队列属性
27+
28+
全局最优:最后都做完插入操作,整个队列满足题目队列属性
29+
30+
局部最优可推出全局最优。
31+
2632
整个插入过程如下:
2733

2834
排序完:

0 commit comments

Comments
 (0)