File tree Expand file tree Collapse file tree 4 files changed +101
-0
lines changed Expand file tree Collapse file tree 4 files changed +101
-0
lines changed Original file line number Diff line number Diff line change 21
21
22
22
(持续更新中....)
23
23
24
+ ** 通知:不少录友反馈说:刷题攻略这一栏怎么没有了,因为发现一些公众号会抄袭我的刷题攻略把整个刷题顺序全部抄走,所以这块我暂时先不对外开放了**
25
+
24
26
# 算法文章精选
25
27
26
28
** 提示:在电脑端看如下文章的,看不到文章的评论区,建议在手机端「代码随想录」公众号里也翻一下对应的文章,评论区有录友们的打卡总结,相信会和你有不少共鸣!**
174
176
* [ 贪心算法:分发饼干] ( https://mp.weixin.qq.com/s/YSuLIAYyRGlyxbp9BNC1uw )
175
177
* [ 贪心算法:摆动序列] ( https://mp.weixin.qq.com/s/Xytl05kX8LZZ1iWWqjMoHA )
176
178
* [ 贪心算法:最大子序和] ( https://mp.weixin.qq.com/s/DrjIQy6ouKbpletQr0g1Fg )
179
+ * [ 本周小结!(贪心算法系列一)] ( https://mp.weixin.qq.com/s/KQ2caT9GoVXgB1t2ExPncQ )
177
180
178
181
179
182
* 动态规划
192
195
193
196
(持续更新中....)
194
197
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
+
195
208
196
209
# 算法模板
197
210
283
296
| [ 0242.有效的字母异位词] ( https://github.com/youngyangyang04/leetcode/blob/master/problems/0242.有效的字母异位词.md ) | 哈希表 | 简单| ** 哈希** |
284
297
| [ 0257.二叉树的所有路径] ( https://github.com/youngyangyang04/leetcode/blob/master/problems/0257.二叉树的所有路径.md ) | 树 | 简单| ** 递归/回溯** |
285
298
| [ 0283.移动零] ( https://github.com/youngyangyang04/leetcode/blob/master/problems/0283.移动零.md ) | 数组 | 简单| ** 双指针** 和 27.移除元素 一个套路|
299
+ | [ 0300.最长上升子序列] ( https://github.com/youngyangyang04/leetcode/blob/master/problems/0300.最长上升子序列.md ) | 动态规划 | 中等| ** 动态规划** |
286
300
| [ 0316.去除重复字母] ( https://github.com/youngyangyang04/leetcode/blob/master/problems/0316.去除重复字母.md ) | 贪心/字符串 | 中等| ** 单调栈** 这道题目处理的情况比较多,属于单调栈中的难题|
287
301
| [ 0332.重新安排行程] ( https://github.com/youngyangyang04/leetcode/blob/master/problems/0332.重新安排行程.md ) | 深度优先搜索/回溯 | 中等| ** 深度优先搜索/回溯算法** |
302
+ | [ 0343.整数拆分] ( https://github.com/youngyangyang04/leetcode/blob/master/problems/0343.整数拆分.md ) | 动态规划/贪心 | 中等| ** 动态规划** |
288
303
| [ 0344.反转字符串] ( https://github.com/youngyangyang04/leetcode/blob/master/problems/0344.反转字符串.md ) | 字符串 | 简单| ** 双指针** |
289
304
| [ 0347.前K个高频元素] ( https://github.com/youngyangyang04/leetcode/blob/master/problems/0347.前K个高频元素.md ) | 哈希/堆/优先级队列 | 中等| ** 哈希/优先级队列** |
290
305
| [ 0349.两个数组的交集] ( https://github.com/youngyangyang04/leetcode/blob/master/problems/0349.两个数组的交集.md ) | 哈希表 | 简单| ** 哈希** |
Original file line number Diff line number Diff line change
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
+ ```
Original file line number Diff line number Diff line change
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
+ 我这里就不做证明了。
Original file line number Diff line number Diff line change 23
23
24
24
贪心在优先按照身高高的people的k来插入,后序插入节点也不会影响前面已经插入的节点,最终按照k的规则完成了队列。
25
25
26
+ 局部最优:优先按照身高搞的people的k来插入。插入操作过后的people满足队列属性
27
+
28
+ 全局最优:最后都做完插入操作,整个队列满足题目队列属性
29
+
30
+ 局部最优可推出全局最优。
31
+
26
32
整个插入过程如下:
27
33
28
34
排序完:
You can’t perform that action at this time.
0 commit comments