diff --git a/README.md b/README.md
index b64bcea6..a66e5a30 100644
--- a/README.md
+++ b/README.md
@@ -69,13 +69,14 @@
## 前序
-* [「代码随想录」学习社区](https://programmercarl.com/other/kstar.html)
+* [做项目(多个C++、Java、Go、前端、测开项目)](https://programmercarl.com/other/kstar.html)
* 编程语言
* [C++面试&C++学习指南知识点整理](https://github.com/youngyangyang04/TechCPP)
* [编程语言基础课](https://kamacoder.com/courseshop.php)
* [23种设计模式](https://github.com/youngyangyang04/kama-DesignPattern)
+ * [大厂算法笔试题](https://kamacoder.com/company.php)
* 工具
* [一站式vim配置](https://github.com/youngyangyang04/PowerVim)
@@ -180,7 +181,7 @@
题目分类大纲如下:
-
+
1. [关于二叉树,你该了解这些!](./problems/二叉树理论基础.md)
2. [二叉树:二叉树的递归遍历](./problems/二叉树的递归遍历.md)
@@ -221,7 +222,7 @@
题目分类大纲如下:
-
+
1. [关于回溯算法,你该了解这些!](./problems/回溯算法理论基础.md)
2. [回溯算法:77.组合](./problems/0077.组合.md)
@@ -251,7 +252,7 @@
题目分类大纲如下:
-
+
1. [关于贪心算法,你该了解这些!](./problems/贪心算法理论基础.md)
2. [贪心算法:455.分发饼干](./problems/0455.分发饼干.md)
@@ -385,9 +386,9 @@
9. [图论:沉没孤岛](./problems/kamacoder/0102.沉没孤岛.md)
10. [图论:水流问题](./problems/kamacoder/0103.水流问题.md)
11. [图论:建造最大岛屿](./problems/kamacoder/0104.建造最大岛屿.md)
-12. [图论:字符串接龙](./problems/kamacoder/0110.字符串接龙.md)
-13. [图论:有向图的完全可达性](./problems/kamacoder/0105.有向图的完全可达性.md)
-14. [图论:岛屿的周长](./problems/kamacoder/0106.岛屿的周长.md)
+12. [图论:岛屿的周长](./problems/kamacoder/0106.岛屿的周长.md)
+13. [图论:字符串接龙](./problems/kamacoder/0110.字符串接龙.md)
+14. [图论:有向图的完全可达性](./problems/kamacoder/0105.有向图的完全可达性.md)
15. [图论:并查集理论基础](./problems/kamacoder/图论并查集理论基础.md)
16. [图论:寻找存在的路径](./problems/kamacoder/0107.寻找存在的路径.md)
17. [图论:冗余连接](./problems/kamacoder/0108.冗余连接.md)
@@ -502,5 +503,5 @@
添加微信记得备注,如果是已工作,备注:姓名-城市-岗位。如果学生,备注:姓名-学校-年级。**备注没有自我介绍不通过哦**
-


-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 1. 两数之和 @@ -85,10 +83,10 @@ map目的用来存放我们访问过的元素,因为遍历数组的时候, 过程如下: - + - + C++代码: @@ -557,7 +555,3 @@ int* twoSum(int* nums, int numsSize, int target, int* returnSize){ } ``` -
-
-
-
diff --git a/problems/0005.最长回文子串.md b/problems/0005.最长回文子串.md
index b3d3b938..1e0667e5 100644
--- a/problems/0005.最长回文子串.md
+++ b/problems/0005.最长回文子串.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -108,7 +106,7 @@ dp[i][j]可以初始化为true么? 当然不行,怎能刚开始就全都匹 dp[i + 1][j - 1] 在 dp[i][j]的左下角,如图: - + 如果这矩阵是从上到下,从左到右遍历,那么会用到没有计算过的dp[i + 1][j - 1],也就是根据不确定是不是回文的区间[i+1,j-1],来判断了[i,j]是不是回文,那结果一定是不对的。 @@ -142,7 +140,7 @@ for (int i = s.size() - 1; i >= 0; i--) { // 注意遍历顺序 举例,输入:"aaa",dp[i][j]状态如下: - + **注意因为dp[i][j]的定义,所以j一定是大于等于i的,那么在填充dp[i][j]的时候一定是只填充右上半部分**。 @@ -731,8 +729,4 @@ public class Solution { ``` -
-
-
-
diff --git a/problems/0015.三数之和.md b/problems/0015.三数之和.md
index 1685db74..52dbdab7 100644
--- a/problems/0015.三数之和.md
+++ b/problems/0015.三数之和.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -980,7 +978,3 @@ object Solution { } ``` -
-
-
-
diff --git a/problems/0017.电话号码的字母组合.md b/problems/0017.电话号码的字母组合.md
index 9a320ca0..a35fd4e2 100644
--- a/problems/0017.电话号码的字母组合.md
+++ b/problems/0017.电话号码的字母组合.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 17.电话号码的字母组合 @@ -13,7 +11,7 @@ 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 - + 示例: * 输入:"23" @@ -66,7 +64,7 @@ const string letterMap[10] = { 例如:输入:"23",抽象为树形结构,如图所示: - + 图中可以看出遍历的深度,就是输入"23"的长度,而叶子节点就是我们要收集的结果,输出["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]。 @@ -766,7 +764,3 @@ public class Solution ``` -
-
-
-
diff --git a/problems/0018.四数之和.md b/problems/0018.四数之和.md
index f3188b0f..bf7d3bd4 100644
--- a/problems/0018.四数之和.md
+++ b/problems/0018.四数之和.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 一样的道理,能解决四数之和 @@ -798,8 +796,4 @@ def four_sum(nums, target) end ``` -
-
-
-
diff --git a/problems/0019.删除链表的倒数第N个节点.md b/problems/0019.删除链表的倒数第N个节点.md
index 16312d0f..9b2ba88e 100644
--- a/problems/0019.删除链表的倒数第N个节点.md
+++ b/problems/0019.删除链表的倒数第N个节点.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -18,7 +16,7 @@ 示例 1: - + 输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5] @@ -479,7 +477,3 @@ public class Solution { } } ``` -
-
-
-
diff --git a/problems/0020.有效的括号.md b/problems/0020.有效的括号.md
index 2475138e..72824712 100644
--- a/problems/0020.有效的括号.md
+++ b/problems/0020.有效的括号.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -83,13 +81,13 @@ cd a/b/c/../../ 1. 第一种情况,字符串里左方向的括号多余了 ,所以不匹配。 - + 2. 第二种情况,括号没有多余,但是 括号的类型没有匹配上。 - + 3. 第三种情况,字符串里右方向的括号多余了,所以不匹配。 - + @@ -574,8 +572,4 @@ impl Solution { } ``` -
-
-
-
diff --git a/problems/0024.两两交换链表中的节点.md b/problems/0024.两两交换链表中的节点.md
index 305bb7cc..b9494297 100644
--- a/problems/0024.两两交换链表中的节点.md
+++ b/problems/0024.两两交换链表中的节点.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 24. 两两交换链表中的节点 @@ -527,7 +525,3 @@ public ListNode SwapPairs(ListNode head) } ``` -
-
-
-
diff --git a/problems/0027.移除元素.md b/problems/0027.移除元素.md
index 10817ba6..d01765ff 100644
--- a/problems/0027.移除元素.md
+++ b/problems/0027.移除元素.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 27. 移除元素 @@ -519,7 +517,3 @@ int removeElement(List
-
-
-
diff --git a/problems/0028.实现strStr.md b/problems/0028.实现strStr.md
index 63a08d96..b25cb301 100644
--- a/problems/0028.实现strStr.md
+++ b/problems/0028.实现strStr.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 在一个串中查找是否出现过另一个串,这是KMP的看家本领。 @@ -1520,7 +1518,3 @@ int strStr(char* haystack, char* needle) { } ``` -
-
-
-
diff --git a/problems/0031.下一个排列.md b/problems/0031.下一个排列.md
index 48af8d0d..95bb1d89 100644
--- a/problems/0031.下一个排列.md
+++ b/problems/0031.下一个排列.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -269,7 +267,3 @@ var nextPermutation = function(nums) { -
-
-
-
diff --git a/problems/0034.在排序数组中查找元素的第一个和最后一个位置.md b/problems/0034.在排序数组中查找元素的第一个和最后一个位置.md
index 16adcdf1..37248e48 100644
--- a/problems/0034.在排序数组中查找元素的第一个和最后一个位置.md
+++ b/problems/0034.在排序数组中查找元素的第一个和最后一个位置.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 34. 在排序数组中查找元素的第一个和最后一个位置 @@ -855,7 +853,3 @@ int* searchRange(int* nums, int numsSize, int target, int* returnSize){ ``` -
-
-
-
diff --git a/problems/0035.搜索插入位置.md b/problems/0035.搜索插入位置.md
index b5be9a5f..c9826fa2 100644
--- a/problems/0035.搜索插入位置.md
+++ b/problems/0035.搜索插入位置.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -43,7 +41,7 @@ 这道题目,要在数组中插入目标值,无非是这四种情况。 - + * 目标值在数组所有元素之前 * 目标值等于数组中某一个元素 @@ -84,14 +82,14 @@ public: 效率如下: - + ### 二分法 既然暴力解法的时间复杂度是O(n),就要尝试一下使用二分查找法。 - + 大家注意这道题目的前提是数组是有序数组,这也是使用二分查找的基础条件。 @@ -101,7 +99,7 @@ public: 大体讲解一下二分法的思路,这里来举一个例子,例如在这个数组中,使用二分法寻找元素为5的位置,并返回其下标。 - + 二分查找涉及的很多的边界条件,逻辑比较简单,就是写不好。 @@ -152,7 +150,7 @@ public: * 空间复杂度:O(1) 效率如下: - + ### 二分法第二种写法 @@ -549,7 +547,3 @@ int searchInsert(int* nums, int numsSize, int target){ ``` -
-
-
-
diff --git a/problems/0037.解数独.md b/problems/0037.解数独.md
index 5f3f881c..5d2adb4d 100644
--- a/problems/0037.解数独.md
+++ b/problems/0037.解数独.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -20,11 +18,11 @@ 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。 空白格用 '.' 表示。 - + 一个数独。 - + 答案被标成红色。 @@ -54,7 +52,7 @@ 因为这个树形结构太大了,我抽取一部分,如图所示: - + ### 回溯三部曲 @@ -85,7 +83,7 @@ bool backtracking(vector
-
-
-
diff --git a/problems/0039.组合总和.md b/problems/0039.组合总和.md
index 92c68562..84672771 100644
--- a/problems/0039.组合总和.md
+++ b/problems/0039.组合总和.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -52,7 +50,7 @@ candidates 中的数字可以无限制重复被选取。 本题搜索的过程抽象成树形结构如下: - + 注意图中叶子节点的返回条件,因为本题没有组合数量要求,仅仅是总和的限制,所以递归没有层数的限制,只要选取的元素总和超过target,就返回! 而在[77.组合](https://programmercarl.com/0077.组合.html)和[216.组合总和III](https://programmercarl.com/0216.组合总和III.html) 中都可以知道要递归K层,因为要取k个元素的组合。 @@ -87,7 +85,7 @@ void backtracking(vector
-
-
-
diff --git a/problems/0040.组合总和II.md b/problems/0040.组合总和II.md
index 22cf726d..f0cbc220 100644
--- a/problems/0040.组合总和II.md
+++ b/problems/0040.组合总和II.md
@@ -1,12 +1,8 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) -> 这篇可以说是全网把组合问题如何去重,讲的最清晰的了! - # 40.组合总和II [力扣题目链接](https://leetcode.cn/problems/combination-sum-ii/) @@ -80,7 +76,7 @@ candidates 中的每个数字在每个组合中只能使用一次。 选择过程树形结构如图所示: - + 可以看到图中,每个节点相对于 [39.组合总和](https://mp.weixin.qq.com/s/FLg8G6EjVcxBjwCbzpACPw)我多加了used数组,这个used数组下面会重点介绍。 @@ -130,7 +126,7 @@ if (sum == target) { 这块比较抽象,如图: - + 我在图中将used的变化用橘黄色标注上,可以看出在candidates[i] == candidates[i - 1]相同的情况下: @@ -141,7 +137,7 @@ if (sum == target) { 而 used[i - 1] == true,说明是进入下一层递归,去下一个数,所以是树枝上,如图所示: - + **这块去重的逻辑很抽象,网上搜的题解基本没有能讲清楚的,如果大家之前思考过这个问题或者刷过这道题目,看到这里一定会感觉通透了很多!** @@ -807,7 +803,3 @@ public class Solution } ``` -
-
-
-
diff --git a/problems/0042.接雨水.md b/problems/0042.接雨水.md
index 0484f830..1e6ec11b 100644
--- a/problems/0042.接雨水.md
+++ b/problems/0042.接雨水.md
@@ -1,13 +1,10 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) -> 这个图就是大厂面试经典题目,接雨水! 最常青藤的一道题,面试官百出不厌! # 42. 接雨水 @@ -50,10 +47,10 @@ 首先要明确,要按照行来计算,还是按照列来计算。 按照行来计算如图: - + 按照列来计算如图: - + 一些同学在实现的时候,很容易一会按照行来计算一会按照列来计算,这样就会越写越乱。 @@ -65,7 +62,7 @@ 这句话可以有点绕,来举一个理解,例如求列4的雨水高度,如图: - + 列4 左侧最高的柱子是列3,高度为2(以下用lHeight表示)。 @@ -204,7 +201,7 @@ public: 1. 首先单调栈是按照行方向来计算雨水,如图: - + 知道这一点,后面的就可以理解了。 @@ -218,7 +215,7 @@ public: 如图: - + 关于单调栈的顺序给大家一个总结: [739. 每日温度](https://programmercarl.com/0739.每日温度.html) 中求一个元素右边第一个更大元素,单调栈就是递增的,[84.柱状图中最大的矩形](https://programmercarl.com/0084.柱状图中最大的矩形.html)求一个元素右边第一个更小元素,单调栈就是递减的。 @@ -232,7 +229,7 @@ public: 如图所示: - + 4. 栈里要保存什么数值 @@ -287,7 +284,7 @@ if (height[i] == height[st.top()]) { // 例如 5 5 1 7 这种情况 如果当前遍历的元素(柱子)高度大于栈顶元素的高度,此时就出现凹槽了,如图所示: - + 取栈顶元素,将栈顶元素弹出,这个就是凹槽的底部,也就是中间位置,下标记为mid,对应的高度为height[mid](就是图中的高度1)。 @@ -1095,7 +1092,3 @@ impl Solution { } ``` -
-
-
-
diff --git a/problems/0045.跳跃游戏II.md b/problems/0045.跳跃游戏II.md
index 8919d393..dd51384d 100644
--- a/problems/0045.跳跃游戏II.md
+++ b/problems/0045.跳跃游戏II.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 相对于[贪心算法:跳跃游戏](https://mp.weixin.qq.com/s/606_N9j8ACKCODoCbV1lSA)难了不少,做好心理准备! @@ -49,7 +47,7 @@ 如图: - + **图中覆盖范围的意义在于,只要红色的区域,最多两步一定可以到!(不用管具体怎么跳,反正一定可以跳到)** @@ -101,11 +99,11 @@ public: 因为当移动下标指向 nums.size - 2 时: - 如果移动下标等于当前覆盖最大距离下标, 需要再走一步(即 ans++),因为最后一步一定是可以到的终点。(题目假设总是可以到达数组的最后一个位置),如图: -  +  - 如果移动下标不等于当前覆盖最大距离下标,说明当前覆盖最远距离就可以直接达到终点了,不需要再走一步。如图: - + 代码如下: @@ -542,7 +540,3 @@ public class Solution ``` -
-
-
-
diff --git a/problems/0046.全排列.md b/problems/0046.全排列.md
index ca465efd..5a190242 100644
--- a/problems/0046.全排列.md
+++ b/problems/0046.全排列.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 46.全排列 @@ -43,7 +41,7 @@ 我以[1,2,3]为例,抽象成树形结构如下: - + ### 回溯三部曲 @@ -55,7 +53,7 @@ 但排列问题需要一个used数组,标记已经选择的元素,如图橘黄色部分所示: - + 代码如下: @@ -67,7 +65,7 @@ void backtracking (vector
-
-
-
diff --git a/problems/0047.全排列II.md b/problems/0047.全排列II.md
index 08e3c616..6ed794aa 100644
--- a/problems/0047.全排列II.md
+++ b/problems/0047.全排列II.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -50,7 +48,7 @@ 我以示例中的 [1,1,2]为例 (为了方便举例,已经排序)抽象为一棵树,去重过程如图: - + 图中我们对同一树层,前一位(也就是nums[i-1])如果使用过,那么就进行去重。 @@ -132,11 +130,11 @@ if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == true) { 树层上去重(used[i - 1] == false),的树形结构如下: - + 树枝上去重(used[i - 1] == true)的树型结构如下: - + 大家应该很清晰的看到,树层上对前一位去重非常彻底,效率很高,树枝上对前一位去重虽然最后可以得到答案,但是做了很多无用搜索。 @@ -555,7 +553,3 @@ public class Solution ``` -
-
-
-
diff --git a/problems/0051.N皇后.md b/problems/0051.N皇后.md
index 38fc07e7..2a90a023 100644
--- a/problems/0051.N皇后.md
+++ b/problems/0051.N皇后.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 51. N皇后 @@ -17,7 +15,7 @@ n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上, 示例 1: - + * 输入:n = 4 * 输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]] @@ -47,7 +45,7 @@ n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上, 下面我用一个 3 * 3 的棋盘,将搜索过程抽象为一棵树,如图: - + 从图中,可以看出,二维矩阵中矩阵的高就是这棵树的高度,矩阵的宽就是树形结构中每一个节点的宽度。 @@ -87,7 +85,7 @@ void backtracking(int n, int row, vector
-
-
-
diff --git a/problems/0052.N皇后II.md b/problems/0052.N皇后II.md
index 271484a4..489ab1f7 100644
--- a/problems/0052.N皇后II.md
+++ b/problems/0052.N皇后II.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -15,7 +13,7 @@ n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并 上图为 8 皇后问题的一种解法。 - + 给定一个整数 n,返回 n 皇后不同的解决方案的数量。 @@ -307,7 +305,3 @@ class Solution { } ``` -
-
-
-
diff --git a/problems/0053.最大子序和.md b/problems/0053.最大子序和.md
index 705a00d7..6f8c2a6e 100644
--- a/problems/0053.最大子序和.md
+++ b/problems/0053.最大子序和.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 53. 最大子序和 @@ -492,7 +490,3 @@ public class Solution ``` -
-
-
-
diff --git a/problems/0053.最大子序和(动态规划).md b/problems/0053.最大子序和(动态规划).md
index 38a3a118..174f55e8 100644
--- a/problems/0053.最大子序和(动态规划).md
+++ b/problems/0053.最大子序和(动态规划).md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 53. 最大子序和 @@ -56,7 +54,7 @@ dp[0]应该是多少呢? 5. 举例推导dp数组 以示例一为例,输入:nums = [-2,1,-3,4,-1,2,1,-5,4],对应的dp状态如下: - + **注意最后的结果可不是dp[nums.size() - 1]!** ,而是dp[6]。 @@ -244,7 +242,3 @@ function maxSubArray(nums: number[]): number { -
-
-
-
diff --git a/problems/0054.螺旋矩阵.md b/problems/0054.螺旋矩阵.md
index 3b7afb90..a852b674 100644
--- a/problems/0054.螺旋矩阵.md
+++ b/problems/0054.螺旋矩阵.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -38,7 +36,7 @@ 由外向内一圈一圈这么画下去,如下所示: - + 这里每一种颜色,代表一条边,我们遍历的长度,可以看出每一个拐角处的处理规则,拐角处让给新的一条边来继续画。 @@ -485,7 +483,3 @@ func min(x, y int) int { ``` -
-
-
-
diff --git a/problems/0055.跳跃游戏.md b/problems/0055.跳跃游戏.md
index 896dc998..0ebbcb59 100644
--- a/problems/0055.跳跃游戏.md
+++ b/problems/0055.跳跃游戏.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 55. 跳跃游戏 @@ -50,7 +48,7 @@ 如图: - + i 每次移动只能在 cover 的范围内移动,每移动一个元素,cover 得到该元素数值(新的覆盖范围)的补充,让 i 继续移动下去。 @@ -293,7 +291,3 @@ public class Solution } ``` -
-
-
-
diff --git a/problems/0056.合并区间.md b/problems/0056.合并区间.md
index 538be693..cb06fcab 100644
--- a/problems/0056.合并区间.md
+++ b/problems/0056.合并区间.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 56. 合并区间 @@ -40,7 +38,7 @@ 这么说有点抽象,看图:(**注意图中区间都是按照左边界排序之后了**) - + 知道如何判断重复之后,剩下的就是合并了,如何去模拟合并区间呢? @@ -405,7 +403,3 @@ public class Solution } ``` -
-
-
-
diff --git a/problems/0059.螺旋矩阵II.md b/problems/0059.螺旋矩阵II.md
index 94966126..d7aea257 100644
--- a/problems/0059.螺旋矩阵II.md
+++ b/problems/0059.螺旋矩阵II.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -56,7 +54,7 @@ 那么我按照左闭右开的原则,来画一圈,大家看一下: - + 这里每一种颜色,代表一条边,我们遍历的长度,可以看出每一个拐角处的处理规则,拐角处让给新的一条边来继续画。 @@ -829,7 +827,3 @@ def generate_matrix(n) end ``` -
-
-
-
diff --git a/problems/0062.不同路径.md b/problems/0062.不同路径.md
index 7025135a..20bd56ba 100644
--- a/problems/0062.不同路径.md
+++ b/problems/0062.不同路径.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -18,7 +16,7 @@ 示例 1: - + * 输入:m = 3, n = 7 * 输出:28 @@ -64,7 +62,7 @@ 如图举例: - + 此时问题就可以转化为求二叉树叶子节点的个数,代码如下: @@ -133,7 +131,7 @@ for (int j = 0; j < n; j++) dp[0][j] = 1; 如图所示: - + 以上动规五部曲分析完毕,C++代码如下: @@ -182,7 +180,7 @@ public: 在这个图中,可以看出一共m,n的话,无论怎么走,走到终点都需要 m + n - 2 步。 - + 在这m + n - 2 步中,一定有 m - 1 步是要向下走的,不用管什么时候向下走。 @@ -192,7 +190,7 @@ public: 那么答案,如图所示: - + **求组合的时候,要防止两个int相乘溢出!** 所以不能把算式的分子都算出来,分母都算出来再做除法。 @@ -616,7 +614,3 @@ public class Solution -
-
-
-
diff --git a/problems/0063.不同路径II.md b/problems/0063.不同路径II.md
index 13923abe..d39036ba 100644
--- a/problems/0063.不同路径II.md
+++ b/problems/0063.不同路径II.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -16,13 +14,13 @@ 现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径? - + 网格中的障碍物和空位置分别用 1 和 0 来表示。 示例 1: - + * 输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]] * 输出:2 @@ -34,7 +32,7 @@ 示例 2: - + * 输入:obstacleGrid = [[0,1],[0,0]] * 输出:1 @@ -95,7 +93,7 @@ for (int j = 0; j < n; j++) dp[0][j] = 1; 如图: - + 下标(0, j)的初始化情况同理。 @@ -129,11 +127,11 @@ for (int i = 1; i < m; i++) { 拿示例1来举例如题: - + 对应的dp table 如图: - + 如果这个图看不懂,建议再理解一下递归公式,然后照着文章中说的遍历顺序,自己推导一下! @@ -781,7 +779,3 @@ public class Solution ``` -
-
-
-
diff --git a/problems/0070.爬楼梯.md b/problems/0070.爬楼梯.md
index 6a13a21c..17bf3ee7 100644
--- a/problems/0070.爬楼梯.md
+++ b/problems/0070.爬楼梯.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 70. 爬楼梯 @@ -103,7 +101,7 @@ dp[i]: 爬到第i层楼梯,有dp[i]种方法 举例当n为5的时候,dp table(dp数组)应该是这样的 - + 如果代码出问题了,就把dp table 打印出来,看看究竟是不是和自己推导的一样。 @@ -520,8 +518,4 @@ impl Solution { ``` -
-
-
-
diff --git a/problems/0070.爬楼梯完全背包版本.md b/problems/0070.爬楼梯完全背包版本.md
index c51a590b..a5435ddd 100644
--- a/problems/0070.爬楼梯完全背包版本.md
+++ b/problems/0070.爬楼梯完全背包版本.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 70. 爬楼梯(进阶版) @@ -252,7 +250,3 @@ var climbStairs = function (n: number): number { ### Rust: -
-
-
-
diff --git a/problems/0072.编辑距离.md b/problems/0072.编辑距离.md
index 0da3bf50..192ea470 100644
--- a/problems/0072.编辑距离.md
+++ b/problems/0072.编辑距离.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 72. 编辑距离 @@ -172,7 +170,7 @@ for (int j = 0; j <= word2.size(); j++) dp[0][j] = j; 可以看出dp[i][j]是依赖左方,上方和左上方元素的,如图: - + 所以在dp矩阵中一定是从左到右从上到下去遍历。 @@ -196,7 +194,7 @@ for (int i = 1; i <= word1.size(); i++) { 以示例1为例,输入:`word1 = "horse", word2 = "ros"`为例,dp矩阵状态图如下: - + 以上动规五部分析完毕,C++代码如下: @@ -462,7 +460,3 @@ impl Solution { } ``` -
-
-
-
diff --git a/problems/0077.组合.md b/problems/0077.组合.md
index c4be5a38..c523c01c 100644
--- a/problems/0077.组合.md
+++ b/problems/0077.组合.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 第77题. 组合 @@ -84,7 +82,7 @@ for (int i = 1; i <= n; i++) { 那么我把组合问题抽象为如下树形结构: - + 可以看出这棵树,一开始集合是 1,2,3,4, 从左向右取数,取过的数,不再重复取。 @@ -128,7 +126,7 @@ vector
-
-
-
diff --git a/problems/0077.组合优化.md b/problems/0077.组合优化.md
index 0fa568af..c5e26e77 100644
--- a/problems/0077.组合优化.md
+++ b/problems/0077.组合优化.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -69,7 +67,7 @@ for (int i = startIndex; i <= n; i++) { 这么说有点抽象,如图所示: - + 图中每一个节点(图中为矩形),就代表本层的一个for循环,那么每一层的for循环从第二个数开始遍历的话,都没有意义,都是无效遍历。 @@ -412,7 +410,3 @@ object Solution { ``` -
-
-
-
diff --git a/problems/0078.子集.md b/problems/0078.子集.md
index 0c368b41..73eb385b 100644
--- a/problems/0078.子集.md
+++ b/problems/0078.子集.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 78.子集 @@ -492,7 +490,3 @@ public class Solution { -
-
-
-
diff --git a/problems/0084.柱状图中最大的矩形.md b/problems/0084.柱状图中最大的矩形.md
index 5c6f4073..e1a6671e 100644
--- a/problems/0084.柱状图中最大的矩形.md
+++ b/problems/0084.柱状图中最大的矩形.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 84.柱状图中最大的矩形 @@ -13,9 +11,9 @@ 求在该柱状图中,能够勾勒出来的矩形的最大面积。 - + - + * 1 <= heights.length <=10^5 * 0 <= heights[i] <= 10^4 @@ -116,7 +114,7 @@ public: 我来举一个例子,如图: - + 只有栈里从大到小的顺序,才能保证栈顶元素找到左右两边第一个小于栈顶元素的柱子。 @@ -181,7 +179,7 @@ public: 如果数组本身就是升序的,例如[2,4,6,8],那么入栈之后 都是单调递减,一直都没有走 情况三 计算结果的哪一步,所以最后输出的就是0了。 如图: - + 那么结尾加一个0,就会让栈里的所有元素,走到情况三的逻辑。 @@ -196,7 +194,7 @@ public: 之后又将6 加入栈(此时8已经弹出了),然后 就是 4 与 栈口元素 6 进行比较,周而复始,那么计算的最后结果result就是0。 如图所示: - + 所以我们需要在 height数组前后各加一个元素0。 @@ -863,7 +861,3 @@ impl Solution { ``` -
-
-
-
diff --git a/problems/0090.子集II.md b/problems/0090.子集II.md
index 811d3cc0..2f26e606 100644
--- a/problems/0090.子集II.md
+++ b/problems/0090.子集II.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 90.子集II @@ -41,7 +39,7 @@ 用示例中的[1, 2, 2] 来举例,如图所示: (**注意去重需要先对集合排序**) - + 从图中可以看出,同一树层上重复取2 就要过滤掉,同一树枝上就可以重复取2,因为同一树枝上元素的集合才是唯一子集! @@ -697,7 +695,3 @@ public class Solution ``` -
-
-
-
diff --git a/problems/0093.复原IP地址.md b/problems/0093.复原IP地址.md
index a03a0e3b..5ef21628 100644
--- a/problems/0093.复原IP地址.md
+++ b/problems/0093.复原IP地址.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -56,7 +54,7 @@ 切割问题可以抽象为树型结构,如图: - + ### 回溯三部曲 @@ -108,7 +106,7 @@ if (pointNum == 3) { // 逗点数量为3时,分隔结束 如果不合法就结束本层循环,如图中剪掉的分支: - + 然后就是递归和回溯的过程: @@ -876,7 +874,3 @@ public class Solution -
-
-
-
diff --git a/problems/0096.不同的二叉搜索树.md b/problems/0096.不同的二叉搜索树.md
index 25d79aff..ca99a466 100644
--- a/problems/0096.不同的二叉搜索树.md
+++ b/problems/0096.不同的二叉搜索树.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -14,7 +12,7 @@ 示例: - + ## 算法公开课 @@ -29,11 +27,11 @@ 了解了二叉搜索树之后,我们应该先举几个例子,画画图,看看有没有什么规律,如图: - + n为1的时候有一棵树,n为2有两棵树,这个是很直观的。 - + 来看看n为3的时候,有哪几种情况。 @@ -67,7 +65,7 @@ dp[3],就是 元素1为头结点搜索树的数量 + 元素2为头结点搜索 如图所示: - + 此时我们已经找到递推关系了,那么可以用动规五部曲再系统分析一遍。 @@ -120,7 +118,7 @@ for (int i = 1; i <= n; i++) { n为5时候的dp数组状态如图: - + 当然如果自己画图举例的话,基本举例到n为3就可以了,n为4的时候,画图已经比较麻烦了。 @@ -348,7 +346,3 @@ public class Solution } ``` -
-
-
-
diff --git a/problems/0098.验证二叉搜索树.md b/problems/0098.验证二叉搜索树.md
index fb4ca7d8..9569cbdd 100644
--- a/problems/0098.验证二叉搜索树.md
+++ b/problems/0098.验证二叉搜索树.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 98.验证二叉搜索树 @@ -18,7 +16,7 @@ * 节点的右子树只包含大于当前节点的数。 * 所有左子树和右子树自身必须也是二叉搜索树。 - + ## 算法公开课 @@ -104,7 +102,7 @@ if (root->val > root->left->val && root->val < root->right->val) { 例如: [10,5,15,null,null,6,20] 这个case: - + 节点10大于左节点5,小于右节点15,但右子树里出现了一个6 这就不符合了! @@ -807,7 +805,3 @@ public bool IsValidBST(TreeNode root) ``` -
-
-
-
diff --git a/problems/0100.相同的树.md b/problems/0100.相同的树.md
index 7268b9f0..e5f61000 100644
--- a/problems/0100.相同的树.md
+++ b/problems/0100.相同的树.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -14,9 +12,9 @@ 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。 - + - + ## 思路 @@ -340,7 +338,3 @@ function isSameTree(p: TreeNode | null, q: TreeNode | null): boolean { -
-
-
-
diff --git a/problems/0101.对称二叉树.md b/problems/0101.对称二叉树.md
index 31c24fc5..205597b0 100644
--- a/problems/0101.对称二叉树.md
+++ b/problems/0101.对称二叉树.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 101. 对称二叉树 @@ -11,7 +9,7 @@ 给定一个二叉树,检查它是否是镜像对称的。 - + ## 算法公开课 @@ -27,7 +25,7 @@ 比较的是两个子树的里侧和外侧的元素是否相等。如图所示: - + 那么遍历的顺序应该是什么样的呢? @@ -946,8 +944,4 @@ public bool IsSymmetric(TreeNode root) ``` -
-
-
-
diff --git a/problems/0102.二叉树的层序遍历.md b/problems/0102.二叉树的层序遍历.md
index ce53e49a..6725d72c 100644
--- a/problems/0102.二叉树的层序遍历.md
+++ b/problems/0102.二叉树的层序遍历.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -39,7 +37,7 @@ 给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。 - + ### 思路 @@ -534,7 +532,7 @@ public IList
-
-
-
diff --git a/problems/0104.二叉树的最大深度.md b/problems/0104.二叉树的最大深度.md
index fdc90096..2eb22ae5 100644
--- a/problems/0104.二叉树的最大深度.md
+++ b/problems/0104.二叉树的最大深度.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -20,7 +18,7 @@ 给定二叉树 [3,9,20,null,null,15,7], - + 返回它的最大深度 3 。 @@ -174,7 +172,7 @@ public: 在二叉树中,一层一层的来遍历二叉树,记录一下遍历的层数就是二叉树的深度,如图所示: - + 所以这道题的迭代法就是一道模板题,可以使用二叉树层序遍历的模板来解决的。 @@ -219,7 +217,7 @@ public: 例如,给定一个 3叉树 : - + 我们应返回其最大深度,3。 @@ -1195,7 +1193,3 @@ public int MaxDepth(TreeNode root) -
-
-
-
diff --git a/problems/0106.从中序与后序遍历序列构造二叉树.md b/problems/0106.从中序与后序遍历序列构造二叉树.md
index bde61a75..2f8e5eef 100644
--- a/problems/0106.从中序与后序遍历序列构造二叉树.md
+++ b/problems/0106.从中序与后序遍历序列构造二叉树.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -27,7 +25,7 @@ * 后序遍历 postorder = [9,15,7,20,3] 返回如下的二叉树: - + ## 算法公开课 @@ -42,7 +40,7 @@ 流程如图: - + 那么代码应该怎么写呢? @@ -413,7 +411,7 @@ public: 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: - + ### 思路 @@ -556,7 +554,7 @@ public: 举一个例子: - + tree1 的前序遍历是[1 2 3], 后序遍历是[3 2 1]。 @@ -1351,7 +1349,3 @@ public TreeNode BuildTree(int[] inorder, int[] postorder) ``` -
-
-
-
diff --git a/problems/0108.将有序数组转换为二叉搜索树.md b/problems/0108.将有序数组转换为二叉搜索树.md
index 4804ccd3..5829e2d2 100644
--- a/problems/0108.将有序数组转换为二叉搜索树.md
+++ b/problems/0108.将有序数组转换为二叉搜索树.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 构造二叉搜索树,一不小心就平衡了 @@ -18,7 +16,7 @@ 示例: - + ## 算法公开课 @@ -42,7 +40,7 @@ 例如 有序数组[-10,-3,0,5,9] 就可以构造成这样的二叉搜索树,如图。 - + 上图中,是符合二叉搜索树的特性吧,如果要这么做的话,是不是本题意义就不大了,所以才强调是平衡二叉搜索树。 @@ -562,7 +560,3 @@ public TreeNode Traversal(int[] nums, int left, int right) -
-
-
-
diff --git a/problems/0110.平衡二叉树.md b/problems/0110.平衡二叉树.md
index a4339ac3..ff84ad84 100644
--- a/problems/0110.平衡二叉树.md
+++ b/problems/0110.平衡二叉树.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -21,7 +19,7 @@ 给定二叉树 [3,9,20,null,null,15,7] - + 返回 true 。 @@ -29,7 +27,7 @@ 给定二叉树 [1,2,2,3,3,null,null,4,4] - + 返回 false 。 @@ -48,7 +46,7 @@ 但leetcode中强调的深度和高度很明显是按照节点来计算的,如图: - + 关于根节点的深度究竟是1 还是 0,不同的地方有不一样的标准,leetcode的题目中都是以节点为一度,即根节点深度是1。但维基百科上定义用边为一度,即根节点的深度是0,我们暂时以leetcode为准(毕竟要在这上面刷题)。 @@ -998,7 +996,3 @@ public int GetHeight(TreeNode root) ``` -
-
-
-
diff --git a/problems/0111.二叉树的最小深度.md b/problems/0111.二叉树的最小深度.md
index 708e0532..bd4ea29d 100644
--- a/problems/0111.二叉树的最小深度.md
+++ b/problems/0111.二叉树的最小深度.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 和求最大深度一个套路? @@ -22,7 +20,7 @@ 给定二叉树 [3,9,20,null,null,15,7], - + 返回它的最小深度 2. @@ -752,7 +750,3 @@ public int MinDepth(TreeNode root) } ``` -
-
-
-
diff --git a/problems/0112.路径总和.md b/problems/0112.路径总和.md
index b97013e6..24891ace 100644
--- a/problems/0112.路径总和.md
+++ b/problems/0112.路径总和.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -17,7 +15,7 @@ 示例: 给定如下二叉树,以及目标和 sum = 22, - + 返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2。 @@ -55,7 +53,7 @@ 如图所示: - + 图中可以看出,遍历的路线,并不要遍历整棵树,所以递归函数需要返回值,可以用bool类型表示。 @@ -232,7 +230,7 @@ public: 给定如下二叉树,以及目标和 sum = 22, - + ### 思路 @@ -241,7 +239,7 @@ public: 如图: - + 为了尽可能的把细节体现出来,我写出如下代码(**这份代码并不简洁,但是逻辑非常清晰**) @@ -309,25 +307,25 @@ public: 0112.路径总和 ```java -class solution { - public boolean haspathsum(treenode root, int targetsum) { +class Solution { + public boolean hasPathSum(TreeNode root, int targetSum) { if (root == null) { return false; } - targetsum -= root.val; + targetSum -= root.val; // 叶子结点 if (root.left == null && root.right == null) { - return targetsum == 0; + return targetSum == 0; } if (root.left != null) { - boolean left = haspathsum(root.left, targetsum); - if (left) { // 已经找到 + boolean left = hasPathSum(root.left, targetSum); + if (left) { // 已经找到,提前返回 return true; } } if (root.right != null) { - boolean right = haspathsum(root.right, targetsum); - if (right) { // 已经找到 + boolean right = hasPathSum(root.right, targetSum); + if (right) { // 已经找到,提前返回 return true; } } @@ -336,16 +334,16 @@ class solution { } // lc112 简洁方法 -class solution { - public boolean haspathsum(treenode root, int targetsum) { +class Solution { + public boolean hasPathSum(TreeNode root, int targetSum) { if (root == null) return false; // 为空退出 // 叶子节点判断是否符合 - if (root.left == null && root.right == null) return root.val == targetsum; + if (root.left == null && root.right == null) return root.val == targetSum; // 求两侧分支的路径和 - return haspathsum(root.left, targetsum - root.val) || haspathsum(root.right, targetsum - root.val); + return hasPathSum(root.left, targetSum - root.val) || hasPathSum(root.right, targetSum - root.val); } } ``` @@ -353,22 +351,22 @@ class solution { 迭代 ```java -class solution { - public boolean haspathsum(treenode root, int targetsum) { +class Solution { + public boolean hasPathSum(TreeNode root, int targetSum) { if(root == null) return false; - stack
-
-
-
+
diff --git a/problems/0115.不同的子序列.md b/problems/0115.不同的子序列.md
index cf24c4c1..1df3d899 100644
--- a/problems/0115.不同的子序列.md
+++ b/problems/0115.不同的子序列.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 115.不同的子序列 @@ -72,7 +70,7 @@ dp[i][j]:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为d 从递推公式dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]; 和 dp[i][j] = dp[i - 1][j]; 中可以看出dp[i][j] 是从上方和左上方推导而来,如图:,那么 dp[i][0] 和dp[0][j]是一定要初始化的。 - + 每次当初始化的时候,都要回顾一下dp[i][j]的定义,不要凭感觉初始化。 @@ -103,7 +101,7 @@ for (int j = 1; j <= t.size(); j++) dp[0][j] = 0; // 其实这行代码可以和 从递推公式dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]; 和 dp[i][j] = dp[i - 1][j]; 中可以看出dp[i][j]都是根据左上方和正上方推出来的。 - + 所以遍历的时候一定是从上到下,从左到右,这样保证dp[i][j]可以根据之前计算出来的数值进行计算。 @@ -376,7 +374,3 @@ impl Solution { -
-
-
-
diff --git a/problems/0116.填充每个节点的下一个右侧节点指针.md b/problems/0116.填充每个节点的下一个右侧节点指针.md
index 98bd4e41..9de1de1e 100644
--- a/problems/0116.填充每个节点的下一个右侧节点指针.md
+++ b/problems/0116.填充每个节点的下一个右侧节点指针.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 116. 填充每个节点的下一个右侧节点指针 @@ -28,7 +26,7 @@ struct Node { * 你只能使用常量级额外空间。 * 使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。 - + ## 思路 @@ -489,8 +487,4 @@ public class Solution -
-
-
-
diff --git a/problems/0121.买卖股票的最佳时机.md b/problems/0121.买卖股票的最佳时机.md
index f8092503..f82ed962 100644
--- a/problems/0121.买卖股票的最佳时机.md
+++ b/problems/0121.买卖股票的最佳时机.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 121. 买卖股票的最佳时机 @@ -131,7 +129,7 @@ dp[0][1]表示第0天不持有股票,不持有股票那么现金就是0,所 以示例1,输入:[7,1,5,3,6,4]为例,dp数组状态如下: - + dp[5][1]就是最终结果。 @@ -627,7 +625,3 @@ impl Solution { ``` -
-
-
-
diff --git a/problems/0122.买卖股票的最佳时机II.md b/problems/0122.买卖股票的最佳时机II.md
index 6663a66d..4ccb17bb 100644
--- a/problems/0122.买卖股票的最佳时机II.md
+++ b/problems/0122.买卖股票的最佳时机II.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 122.买卖股票的最佳时机 II @@ -68,7 +66,7 @@ 如图: - + 一些同学陷入:第一天怎么就没有利润呢,第一天到底算不算的困惑中。 @@ -423,7 +421,3 @@ public class Solution ``` -
-
-
-
diff --git a/problems/0122.买卖股票的最佳时机II(动态规划).md b/problems/0122.买卖股票的最佳时机II(动态规划).md
index 0dced9ef..d8cb308b 100644
--- a/problems/0122.买卖股票的最佳时机II(动态规划).md
+++ b/problems/0122.买卖股票的最佳时机II(动态规划).md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 122.买卖股票的最佳时机II @@ -477,7 +475,3 @@ impl Solution { ``` -
-
-
-
diff --git a/problems/0123.买卖股票的最佳时机III.md b/problems/0123.买卖股票的最佳时机III.md
index 1b7c09d2..c4ff89a0 100644
--- a/problems/0123.买卖股票的最佳时机III.md
+++ b/problems/0123.买卖股票的最佳时机III.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 123.买卖股票的最佳时机III @@ -122,7 +120,7 @@ dp[i][4] = max(dp[i - 1][4], dp[i - 1][3] + prices[i]); 以输入[1,2,3,4,5]为例 - + 大家可以看到红色框为最后两次卖出的状态。 @@ -565,7 +563,3 @@ impl Solution { ``` -
-
-
-
diff --git a/problems/0127.单词接龙.md b/problems/0127.单词接龙.md
index 00d7d4cf..1ce0bc11 100644
--- a/problems/0127.单词接龙.md
+++ b/problems/0127.单词接龙.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 127. 单词接龙 @@ -33,7 +31,7 @@ 以示例1为例,从这个图中可以看出 hit 到 cog的路线,不止一条,有三条,一条是最短的长度为5,两条长度为6。 - + 本题只需要求出最短路径的长度就可以了,不用找出路径。 @@ -360,7 +358,3 @@ function diffonechar(word1: string, word2: string): boolean { ``` -
-
-
-
diff --git a/problems/0129.求根到叶子节点数字之和.md b/problems/0129.求根到叶子节点数字之和.md
index 90dfd061..923bc638 100644
--- a/problems/0129.求根到叶子节点数字之和.md
+++ b/problems/0129.求根到叶子节点数字之和.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -383,7 +381,3 @@ int sumNumbers(struct TreeNode* root){ ``` -
-
-
-
diff --git a/problems/0130.被围绕的区域.md b/problems/0130.被围绕的区域.md
index 8ef8d5b2..278c12ec 100644
--- a/problems/0130.被围绕的区域.md
+++ b/problems/0130.被围绕的区域.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 130. 被围绕的区域 @@ -10,7 +8,7 @@ 给你一个 m x n 的矩阵 board ,由若干字符 'X' 和 'O' ,找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充。 - + * 输入:board = [["X","X","X","X"],["X","O","O","X"],["X","X","O","X"],["X","O","X","X"]] * 输出:[["X","X","X","X"],["X","X","X","X"],["X","X","X","X"],["X","O","X","X"]] @@ -30,11 +28,11 @@ 步骤一:深搜或者广搜将地图周边的'O'全部改成'A',如图所示: - + 步骤二:在遍历地图,将'O'全部改成'X'(地图中间的'O'改成了'X'),将'A'改回'O'(保留的地图周边的'O'),如图所示: - + 整体C++代码如下,以下使用dfs实现,其实遍历方式dfs,bfs都是可以的。 @@ -793,7 +791,3 @@ impl Solution { ``` -
-
-
-
diff --git a/problems/0131.分割回文串.md b/problems/0131.分割回文串.md
index 4eca0ddf..f9b5d244 100644
--- a/problems/0131.分割回文串.md
+++ b/problems/0131.分割回文串.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 切割问题其实是一种组合问题! @@ -1007,7 +1005,3 @@ public class Solution -
-
-
-
diff --git a/problems/0132.分割回文串II.md b/problems/0132.分割回文串II.md
index 85e047f2..089dd52c 100644
--- a/problems/0132.分割回文串II.md
+++ b/problems/0132.分割回文串II.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -163,7 +161,7 @@ for (int i = s.size() - 1; i >= 0; i--) { 以输入:"aabc" 为例: - + 以上分析完毕,代码如下: @@ -373,7 +371,3 @@ var minCut = function(s) { -
-
-
-
diff --git a/problems/0134.加油站.md b/problems/0134.加油站.md
index 0248760d..354f6424 100644
--- a/problems/0134.加油站.md
+++ b/problems/0134.加油站.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 134. 加油站 @@ -146,7 +144,7 @@ i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i 如图: - + 那么为什么一旦[0,i] 区间和为负数,起始位置就可以是i+1呢,i+1后面就不会出现更大的负数? @@ -154,7 +152,7 @@ i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i 那有没有可能 [0,i] 区间 选某一个作为起点,累加到 i这里 curSum是不会小于零呢? 如图: - + 如果 curSum<0 说明 区间和1 + 区间和2 < 0, 那么 假设从上图中的位置开始计数curSum不会小于0的话,就是 区间和2>0。 @@ -709,7 +707,3 @@ public class Solution ``` -
-
-
-
diff --git a/problems/0135.分发糖果.md b/problems/0135.分发糖果.md
index eb2081fe..30df2149 100644
--- a/problems/0135.分发糖果.md
+++ b/problems/0135.分发糖果.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 135. 分发糖果 @@ -58,7 +56,7 @@ for (int i = 1; i < ratings.size(); i++) { 如图: - + 再确定左孩子大于右孩子的情况(从后向前遍历) @@ -68,7 +66,7 @@ for (int i = 1; i < ratings.size(); i++) { 如果从前向后遍历,rating[5]与rating[4]的比较 就不能用上 rating[5]与rating[6]的比较结果了 。如图: - + **所以确定左孩子大于右孩子的情况一定要从后向前遍历!** @@ -84,7 +82,7 @@ for (int i = 1; i < ratings.size(); i++) { 如图: - + 所以该过程代码如下: @@ -401,7 +399,3 @@ public class Solution -
-
-
-
diff --git a/problems/0139.单词拆分.md b/problems/0139.单词拆分.md
index 29748e27..513d327b 100644
--- a/problems/0139.单词拆分.md
+++ b/problems/0139.单词拆分.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -182,7 +180,7 @@ dp[0]表示如果字符串为空的话,说明出现在字典里。 以输入: s = "leetcode", wordDict = ["leet", "code"]为例,dp状态如图: - + dp[s.size()]就是最终结果。 @@ -243,7 +241,7 @@ public: 使用用例:s = "applepenapple", wordDict = ["apple", "pen"],对应的dp数组状态如下: - + 最后dp[s.size()] = 0 即 dp[13] = 0 ,而不是1,因为先用 "apple" 去遍历的时候,dp[8]并没有被赋值为1 (还没用"pen"),所以 dp[13]也不能变成1。 @@ -565,7 +563,3 @@ impl Solution { } ``` -
-
-
-
diff --git a/problems/0141.环形链表.md b/problems/0141.环形链表.md
index ac656576..685a92d5 100644
--- a/problems/0141.环形链表.md
+++ b/problems/0141.环形链表.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 141. 环形链表 @@ -15,7 +13,7 @@ 如果链表中存在环,则返回 true 。 否则,返回 false 。 - + ## 思路 @@ -160,7 +158,3 @@ function hasCycle(head: ListNode | null): boolean { -
-
-
-
diff --git a/problems/0142.环形链表II.md b/problems/0142.环形链表II.md
index 7cda58c3..6cfabc60 100644
--- a/problems/0142.环形链表II.md
+++ b/problems/0142.环形链表II.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -22,7 +20,7 @@ **说明**:不允许修改给定的链表。 - + ## 算法公开课 @@ -52,7 +50,7 @@ 会发现最终都是这种情况, 如下图: - + fast和slow各自再走一步, fast和slow就相遇了 @@ -72,7 +70,7 @@ fast和slow各自再走一步, fast和slow就相遇了 环形入口节点到 fast指针与slow指针相遇节点 节点数为y。 从相遇节点 再到环形入口节点节点数为 z。 如图所示: - + 那么相遇时: slow指针走过的节点数为: `x + y`, @@ -156,20 +154,20 @@ public: 即文章[链表:环找到了,那入口呢?](https://programmercarl.com/0142.环形链表II.html)中如下的地方: - + 首先slow进环的时候,fast一定是先进环来了。 如果slow进环入口,fast也在环入口,那么把这个环展开成直线,就是如下图的样子: - + 可以看出如果slow 和 fast同时在环入口开始走,一定会在环入口3相遇,slow走了一圈,fast走了两圈。 重点来了,slow进环的时候,fast一定是在环的任意一个位置,如图: - + 那么fast指针走到环入口3的时候,已经走了k + n 个节点,slow相应的应该走了(k + n) / 2 个节点。 @@ -465,7 +463,3 @@ public class Solution } ``` -
-
-
-
diff --git a/problems/0143.重排链表.md b/problems/0143.重排链表.md
index ccddef5b..98488bc1 100644
--- a/problems/0143.重排链表.md
+++ b/problems/0143.重排链表.md
@@ -1,14 +1,12 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 143.重排链表 [力扣题目链接](https://leetcode.cn/problems/reorder-list/submissions/) - + ## 思路 @@ -689,7 +687,3 @@ void reorderList(struct ListNode* head){ ``` -
-
-
-
diff --git a/problems/0150.逆波兰表达式求值.md b/problems/0150.逆波兰表达式求值.md
index bc73f6da..6d21452d 100644
--- a/problems/0150.逆波兰表达式求值.md
+++ b/problems/0150.逆波兰表达式求值.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 这不仅仅是一道好题,也展现出计算机的思考方式 @@ -550,7 +548,3 @@ int evalRPN(char** tokens, int tokensSize) { } ``` -
-
-
-
diff --git a/problems/0151.翻转字符串里的单词.md b/problems/0151.翻转字符串里的单词.md
index 3dbd59b9..b5246a7d 100644
--- a/problems/0151.翻转字符串里的单词.md
+++ b/problems/0151.翻转字符串里的单词.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -1086,8 +1084,4 @@ public string ReverseWords(string s) { } ``` -
-
-
-
diff --git a/problems/0160.相交链表.md b/problems/0160.相交链表.md
index d4422bd8..cdc58912 100644
--- a/problems/0160.相交链表.md
+++ b/problems/0160.相交链表.md
@@ -1,11 +1,5 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) 同:[链表:链表相交](https://programmercarl.com/面试题02.07.链表相交.html) -
-
-
-
diff --git a/problems/0188.买卖股票的最佳时机IV.md b/problems/0188.买卖股票的最佳时机IV.md
index cbba12c9..a3fc7ef1 100644
--- a/problems/0188.买卖股票的最佳时机IV.md
+++ b/problems/0188.买卖股票的最佳时机IV.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 188.买卖股票的最佳时机IV @@ -134,7 +132,7 @@ for (int j = 1; j < 2 * k; j += 2) { 以输入[1,2,3,4,5],k=2为例。 - + 最后一次卖出,一定是利润最大的,dp[prices.size() - 1][2 * k]即红色部分就是最后求解。 @@ -641,8 +639,4 @@ impl Solution { -
-
-
-
diff --git a/problems/0189.旋转数组.md b/problems/0189.旋转数组.md
index e91109c6..976cbed4 100644
--- a/problems/0189.旋转数组.md
+++ b/problems/0189.旋转数组.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 189. 旋转数组 @@ -212,7 +210,3 @@ impl Solution { ``` -
-
-
-
diff --git a/problems/0198.打家劫舍.md b/problems/0198.打家劫舍.md
index 032204bb..0bee40f7 100644
--- a/problems/0198.打家劫舍.md
+++ b/problems/0198.打家劫舍.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 198.打家劫舍 @@ -89,7 +87,7 @@ for (int i = 2; i < nums.size(); i++) { 以示例二,输入[2,7,9,3,1]为例。 - + 红框dp[nums.size() - 1]为结果。 @@ -361,7 +359,3 @@ impl Solution { -
-
-
-
diff --git a/problems/0200.岛屿数量.广搜版.md b/problems/0200.岛屿数量.广搜版.md
index 00e4efd8..9ea47329 100644
--- a/problems/0200.岛屿数量.广搜版.md
+++ b/problems/0200.岛屿数量.广搜版.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 200. 岛屿数量 @@ -15,7 +13,7 @@ 此外,你可以假设该网格的四条边均被水包围。 - + 提示: @@ -30,7 +28,7 @@ 也就是说斜角度链接是不算了, 例如示例二,是三个岛屿,如图: - + 这道题题目是 DFS,BFS,并查集,基础题目。 @@ -50,7 +48,7 @@ 如果从队列拿出节点,再去标记这个节点走过,就会发生下图所示的结果,会导致很多节点重复加入队列。 - + 超时写法 (从队列中取出节点再标记) @@ -410,7 +408,3 @@ impl Solution { ``` ``` -
-
-
-
diff --git a/problems/0200.岛屿数量.深搜版.md b/problems/0200.岛屿数量.深搜版.md
index 46579203..a0153998 100644
--- a/problems/0200.岛屿数量.深搜版.md
+++ b/problems/0200.岛屿数量.深搜版.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 200. 岛屿数量 @@ -14,7 +12,7 @@ 此外,你可以假设该网格的四条边均被水包围。 - + 提示: @@ -29,7 +27,7 @@ 也就是说斜角度链接是不算了, 例如示例二,是三个岛屿,如图: - + 这道题题目是 DFS,BFS,并查集,基础题目。 @@ -463,7 +461,3 @@ impl Solution { } ``` -
-
-
-
diff --git a/problems/0202.快乐数.md b/problems/0202.快乐数.md
index 39cb39fa..fdcadee9 100644
--- a/problems/0202.快乐数.md
+++ b/problems/0202.快乐数.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -558,7 +556,3 @@ def next_value(n) end ``` -
-
-
-
diff --git a/problems/0203.移除链表元素.md b/problems/0203.移除链表元素.md
index 5a4bbb74..5ecf89bf 100644
--- a/problems/0203.移除链表元素.md
+++ b/problems/0203.移除链表元素.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -36,11 +34,11 @@ 这里以链表 1 4 2 4 来举例,移除元素4。 - + 如果使用C,C++编程语言的话,不要忘了还要从内存中删除这两个移除的节点, 清理节点内存之后如图: - + **当然如果使用java ,python的话就不用手动管理内存了。** @@ -58,16 +56,16 @@ 来看第一种操作:直接使用原来的链表来进行移除。 - + 移除头结点和移除其他节点的操作是不一样的,因为链表的其他节点都是通过前一个节点来移除当前节点,而头结点没有前一个节点。 所以头结点如何移除呢,其实只要将头结点向后移动一位就可以,这样就从链表中移除了一个头结点。 - + 依然别忘将原头结点从内存中删掉。 - + 这样移除了一个头结点,是不是发现,在单链表中移除头结点 和 移除其他节点的操作方式是不一样,其实在写代码的时候也会发现,需要单独写一段逻辑来处理移除头结点的情况。 @@ -78,7 +76,7 @@ 来看看如何设置一个虚拟头。依然还是在这个链表中,移除元素1。 - + 这里来给链表添加一个虚拟头结点为新的头结点,此时要移除这个旧头结点元素1。 @@ -808,7 +806,3 @@ end ``` -
-
-
-
diff --git a/problems/0205.同构字符串.md b/problems/0205.同构字符串.md
index e416d9ce..ba255e06 100644
--- a/problems/0205.同构字符串.md
+++ b/problems/0205.同构字符串.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 205. 同构字符串 @@ -180,7 +178,3 @@ function isIsomorphic(s: string, t: string): boolean { -
-
-
-
diff --git a/problems/0206.翻转链表.md b/problems/0206.翻转链表.md
index 430bebe5..4e33342a 100644
--- a/problems/0206.翻转链表.md
+++ b/problems/0206.翻转链表.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 反转链表的写法很简单,一些同学甚至可以背下来但过一阵就忘了该咋写,主要是因为没有理解真正的反转过程。 @@ -29,7 +27,7 @@ 其实只需要改变链表的next指针的指向,直接将链表反转 ,而不用重新定义一个新的链表,如图所示: - + 之前链表的头节点是元素1, 反转之后头结点就是元素5 ,这里并没有添加或者删除节点,仅仅是改变next指针的方向。 @@ -739,7 +737,3 @@ public ListNode reverseList(ListNode head) { > 采用这种方法需要注意一点。就是当整个出栈循环结束以后,cur正好指向原来链表的第一个结点,而此时结点1中的next指向的是结点2,因此最后还需要`cur.next = null`  -
-
-
-
diff --git a/problems/0207.课程表.md b/problems/0207.课程表.md
index dff0b18e..f992c72b 100644
--- a/problems/0207.课程表.md
+++ b/problems/0207.课程表.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) 拓扑排序指的是一种 解决问题的大体思路, 而具体算法,可能是 广搜 可能是深搜。 @@ -59,7 +57,3 @@ public: } }; ``` -
-
-
-
diff --git a/problems/0209.长度最小的子数组.md b/problems/0209.长度最小的子数组.md
index c6d89976..ca24bc42 100644
--- a/problems/0209.长度最小的子数组.md
+++ b/problems/0209.长度最小的子数组.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 209.长度最小的子数组 @@ -106,7 +104,7 @@ public: 解题的关键在于 窗口的起始位置如何移动,如图所示: - + 可以发现**滑动窗口的精妙之处在于根据当前子序列和大小的情况,不断调节子序列的起始位置。从而将O(n^2)暴力解法降为O(n)。** @@ -558,7 +556,3 @@ public class Solution { } } ``` -
-
-
-
diff --git a/problems/0210.课程表II.md b/problems/0210.课程表II.md
index 2d2e2429..b0d9fe8a 100644
--- a/problems/0210.课程表II.md
+++ b/problems/0210.课程表II.md
@@ -1,3 +1,6 @@
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html)
+* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html)
+* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html)
```CPP
class Solution {
diff --git a/problems/0213.打家劫舍II.md b/problems/0213.打家劫舍II.md
index 05ebd1ad..8fceb0a9 100644
--- a/problems/0213.打家劫舍II.md
+++ b/problems/0213.打家劫舍II.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 213.打家劫舍II @@ -44,15 +42,15 @@ * 情况一:考虑不包含首尾元素 - + * 情况二:考虑包含首元素,不包含尾元素 - + * 情况三:考虑包含尾元素,不包含首元素 - + **注意我这里用的是"考虑"**,例如情况三,虽然是考虑包含尾元素,但不一定要选尾部元素! 对于情况三,取nums[1] 和 nums[3]就是最大的。 @@ -367,7 +365,3 @@ impl Solution { ``` -
-
-
-
diff --git a/problems/0216.组合总和III.md b/problems/0216.组合总和III.md
index 3d7f2d0c..e23be78d 100644
--- a/problems/0216.组合总和III.md
+++ b/problems/0216.组合总和III.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -47,7 +45,7 @@ 选取过程如图: - + 图中,可以看出,只有最后取到集合(1,3)和为4 符合条件。 @@ -110,7 +108,7 @@ if (path.size() == k) { 本题和[77. 组合](https://programmercarl.com/0077.组合.html)区别之一就是集合固定的就是9个数[1,...,9],所以for循环固定i<=9 如图: - + 处理过程就是 path收集每次选取的元素,相当于树型结构里的边,sum来统计path里元素的总和。 @@ -168,7 +166,7 @@ public: 这道题目,剪枝操作其实是很容易想到了,想必大家看上面的树形图的时候已经想到了。 如图: - + 已选元素总和如果已经大于n(图中数值为4)了,那么往后遍历就没有意义了,直接剪掉。 @@ -739,7 +737,3 @@ public class Solution -
-
-
-
diff --git a/problems/0222.完全二叉树的节点个数.md b/problems/0222.完全二叉树的节点个数.md
index 8d7779f9..37ae7819 100644
--- a/problems/0222.完全二叉树的节点个数.md
+++ b/problems/0222.完全二叉树的节点个数.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 222.完全二叉树的节点个数 @@ -155,7 +153,7 @@ public: 我来举一个典型的例子如题: -
+
完全二叉树只有两种情况,情况一:就是满二叉树,情况二:最后一层叶子节点没有满。
@@ -164,10 +162,10 @@ public:
对于情况二,分别递归左孩子,和右孩子,递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后依然可以按照情况1来计算。
完全二叉树(一)如图:
-
+
完全二叉树(二)如图:
-
+
可以看出如果整个树不是满二叉树,就递归其左右孩子,直到遇到满二叉树为止,用公式计算这个子树(满二叉树)的节点数量。
@@ -175,15 +173,15 @@ public:
在完全二叉树中,如果递归向左遍历的深度等于递归向右遍历的深度,那说明就是满二叉树。如图:
-
+
在完全二叉树中,如果递归向左遍历的深度不等于递归向右遍历的深度,则说明不是满二叉树,如图:
-
+
那有录友说了,这种情况,递归向左遍历的深度等于递归向右遍历的深度,但也不是满二叉树,如题:
-
+
如果这么想,大家就是对 完全二叉树理解有误区了,**以上这棵二叉树,它根本就不是一个完全二叉树**!
@@ -894,7 +892,3 @@ public int CountNodes(TreeNode root)
```
-
-
-
-
diff --git a/problems/0225.用队列实现栈.md b/problems/0225.用队列实现栈.md
index 73d9db1b..23968580 100644
--- a/problems/0225.用队列实现栈.md
+++ b/problems/0225.用队列实现栈.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -1367,7 +1365,3 @@ void myStackFree(MyStack* obj) { ``` -
-
-
-
diff --git a/problems/0226.翻转二叉树.md b/problems/0226.翻转二叉树.md
index c34ca4bf..248a28a4 100644
--- a/problems/0226.翻转二叉树.md
+++ b/problems/0226.翻转二叉树.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 226.翻转二叉树 @@ -12,7 +10,7 @@ 翻转一棵二叉树。 - + 这道题目背后有一个让程序员心酸的故事,听说 Homebrew的作者Max Howell,就是因为没在白板上写出翻转二叉树,最后被Google拒绝了。(真假不做判断,全当一个乐子哈) @@ -37,7 +35,7 @@ 如果要从整个树来看,翻转还真的挺复杂,整个树以中间分割线进行翻转,如图: - + 可以发现想要翻转它,其实就把每一个节点的左右孩子交换一下就可以了。 @@ -1022,7 +1020,3 @@ public TreeNode InvertTree(TreeNode root) { ``` -
-
-
-
diff --git a/problems/0232.用栈实现队列.md b/problems/0232.用栈实现队列.md
index 657567cf..6775a372 100644
--- a/problems/0232.用栈实现队列.md
+++ b/problems/0232.用栈实现队列.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 工作上一定没人这么搞,但是考察对栈、队列理解程度的好题 @@ -691,7 +689,3 @@ impl MyQueue { } ``` -
-
-
-
diff --git a/problems/0234.回文链表.md b/problems/0234.回文链表.md
index 1356b7da..f4933839 100644
--- a/problems/0234.回文链表.md
+++ b/problems/0234.回文链表.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 234.回文链表 @@ -429,7 +427,3 @@ function reverseList(head: ListNode | null): ListNode | null { -
-
-
-
diff --git a/problems/0235.二叉搜索树的最近公共祖先.md b/problems/0235.二叉搜索树的最近公共祖先.md
index 3911261a..98cc5b7d 100644
--- a/problems/0235.二叉搜索树的最近公共祖先.md
+++ b/problems/0235.二叉搜索树的最近公共祖先.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 235. 二叉搜索树的最近公共祖先 @@ -16,7 +14,7 @@ 例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5] - + 示例 1: @@ -54,7 +52,7 @@ 如图,我们从根节点搜索,第一次遇到 cur节点是数值在[q, p]区间中,即 节点5,此时可以说明 q 和 p 一定分别存在于 节点 5的左子树,和右子树中。 - + 此时节点5是不是最近公共祖先? 如果 从节点5继续向左遍历,那么将错过成为p的祖先, 如果从节点5继续向右遍历则错过成为q的祖先。 @@ -66,7 +64,7 @@ 如图所示:p为节点6,q为节点9 - + 可以看出直接按照指定的方向,就可以找到节点8,为最近公共祖先,而且不需要遍历整棵树,找到结果直接返回! @@ -548,7 +546,3 @@ public TreeNode LowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) -
-
-
-
diff --git a/problems/0236.二叉树的最近公共祖先.md b/problems/0236.二叉树的最近公共祖先.md
index 8cd505a8..537d6240 100644
--- a/problems/0236.二叉树的最近公共祖先.md
+++ b/problems/0236.二叉树的最近公共祖先.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 本来是打算将二叉树和二叉搜索树的公共祖先问题一起讲,后来发现篇幅过长了,只能先说一说二叉树的公共祖先问题。 @@ -18,7 +16,7 @@ 例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4] - + 示例 1: 输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 @@ -53,7 +51,7 @@ **首先最容易想到的一个情况:如果找到一个节点,发现左子树出现结点p,右子树出现节点q,或者 左子树出现结点q,右子树出现节点p,那么该节点就是节点p和q的最近公共祖先。** 即情况一: - + 判断逻辑是 如果递归遍历遇到q,就将q返回,遇到p 就将p返回,那么如果 左右子树的返回值都不为空,说明此时的中节点,一定是q 和p 的最近祖先。 @@ -63,7 +61,7 @@ **但是很多人容易忽略一个情况,就是节点本身p(q),它拥有一个子孙节点q(p)。** 情况二: - + 其实情况一 和 情况二 代码实现过程都是一样的,也可以说,实现情况一的逻辑,顺便包含了情况二。 @@ -131,7 +129,7 @@ left与right的逻辑处理; // 中 如图: - + 就像图中一样直接返回7。 @@ -164,7 +162,7 @@ TreeNode* right = lowestCommonAncestor(root->right, p, q); 如图: - + 图中节点10的左子树返回null,右子树返回目标值7,那么此时节点10的处理逻辑就是把右子树的返回值(最近公共祖先7)返回上去! @@ -185,7 +183,7 @@ else { // (left == NULL && right == NULL) 那么寻找最小公共祖先,完整流程图如下: - + **从图中,大家可以看到,我们是如何回溯遍历整棵二叉树,将结果返回给头结点的!** @@ -491,7 +489,3 @@ public TreeNode LowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) ``` -
-
-
-
diff --git a/problems/0239.滑动窗口最大值.md b/problems/0239.滑动窗口最大值.md
index 651e4da4..875f1bd1 100644
--- a/problems/0239.滑动窗口最大值.md
+++ b/problems/0239.滑动窗口最大值.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -922,8 +920,4 @@ int* maxSlidingWindow(int* nums, int numsSize, int k, int* returnSize) { ``` -
-
-
-
diff --git a/problems/0242.有效的字母异位词.md b/problems/0242.有效的字母异位词.md
index 61488f03..9a783e5b 100644
--- a/problems/0242.有效的字母异位词.md
+++ b/problems/0242.有效的字母异位词.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 数组就是简单的哈希表,但是数组的大小可不是无限开辟的 @@ -416,7 +414,3 @@ bool isAnagram(char* s, char* t) { -
-
-
-
diff --git a/problems/0257.二叉树的所有路径.md b/problems/0257.二叉树的所有路径.md
index 2d9292bc..5d713511 100644
--- a/problems/0257.二叉树的所有路径.md
+++ b/problems/0257.二叉树的所有路径.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 以为只用了递归,其实还用了回溯 @@ -16,7 +14,7 @@ 说明: 叶子节点是指没有子节点的节点。 示例: - + ## 算法公开课 @@ -30,7 +28,7 @@ 前序遍历以及回溯的过程如图: - + 我们先使用递归的方式,来做前序遍历。**要知道递归和回溯就是一家的,本题也需要回溯。** @@ -69,15 +67,15 @@ if (cur->left == NULL && cur->right == NULL) { 再来看一下终止处理的逻辑。 -这里使用vector
-
-
-
diff --git a/problems/0279.完全平方数.md b/problems/0279.完全平方数.md
index dc5a7e9e..8171a409 100644
--- a/problems/0279.完全平方数.md
+++ b/problems/0279.完全平方数.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 279.完全平方数 @@ -95,7 +93,7 @@ for (int i = 0; i <= n; i++) { // 遍历背包 已输入n为5例,dp状态图如下: - + dp[0] = 0 dp[1] = min(dp[0] + 1) = 1 @@ -479,7 +477,3 @@ impl Solution { ``` -
-
-
-
diff --git a/problems/0283.移动零.md b/problems/0283.移动零.md
index cbce0295..d7911054 100644
--- a/problems/0283.移动零.md
+++ b/problems/0283.移动零.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 283. 移动零:动态规划:一样的套路,再求一次完全平方数 @@ -186,7 +184,3 @@ impl Solution { -
-
-
-
diff --git a/problems/0300.最长上升子序列.md b/problems/0300.最长上升子序列.md
index 442938c0..de37ed5c 100644
--- a/problems/0300.最长上升子序列.md
+++ b/problems/0300.最长上升子序列.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 300.最长递增子序列 @@ -87,7 +85,7 @@ for (int i = 1; i < nums.size(); i++) { 输入:[0,1,0,3,2],dp数组的变化如下: - + 如果代码写出来,但一直AC不了,那么就把dp数组打印出来,看看对不对! @@ -361,7 +359,3 @@ func lengthOfLIS(nums: Array
-
-
-
diff --git a/problems/0309.最佳买卖股票时机含冷冻期.md b/problems/0309.最佳买卖股票时机含冷冻期.md
index b98a416c..599a1f42 100644
--- a/problems/0309.最佳买卖股票时机含冷冻期.md
+++ b/problems/0309.最佳买卖股票时机含冷冻期.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 309.最佳买卖股票时机含冷冻期 @@ -49,7 +47,7 @@ dp[i][j],第i天状态为j,所剩的最多现金为dp[i][j]。 * 状态三:今天卖出股票 * 状态四:今天为冷冻期状态,但冷冻期状态不可持续,只有一天! - + j的状态为: @@ -138,7 +136,7 @@ dp[i][3] = dp[i - 1][2]; 以 [1,2,3,0,2] 为例,dp数组如下: - + 最后结果是取 状态二,状态三,和状态四的最大值,不少同学会把状态四忘了,状态四是冷冻期,最后一天如果是冷冻期也可能是最大值。 @@ -603,8 +601,4 @@ impl Solution { ``` -
-
-
-
diff --git a/problems/0322.零钱兑换.md b/problems/0322.零钱兑换.md
index e55e20be..7f3bc1e4 100644
--- a/problems/0322.零钱兑换.md
+++ b/problems/0322.零钱兑换.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 322. 零钱兑换 @@ -106,7 +104,7 @@ dp[0] = 0; 以输入:coins = [1, 2, 5], amount = 5为例 - + dp[amount]为最终结果。 @@ -499,7 +497,3 @@ function coinChange(coins: number[], amount: number): number { ``` -
-
-
-
diff --git a/problems/0332.重新安排行程.md b/problems/0332.重新安排行程.md
index 78e14074..fcdb6a33 100644
--- a/problems/0332.重新安排行程.md
+++ b/problems/0332.重新安排行程.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 这也可以用回溯法? 其实深搜和回溯也是相辅相成的,毕竟都用递归。 @@ -59,7 +57,7 @@ 对于死循环,我来举一个有重复机场的例子: - + 为什么要举这个例子呢,就是告诉大家,出发机场和到达机场也会重复的,**如果在解题的过程中没有对集合元素处理好,就会死循环。** @@ -113,7 +111,7 @@ void backtracking(参数) { 本题以输入:[["JFK", "KUL"], ["JFK", "NRT"], ["NRT", "JFK"]为例,抽象为树形结构如下: - + 开始回溯三部曲讲解: @@ -139,7 +137,7 @@ bool backtracking(int ticketNum, vector
-
-
-
diff --git a/problems/0337.打家劫舍III.md b/problems/0337.打家劫舍III.md
index a3130df7..4916af4c 100644
--- a/problems/0337.打家劫舍III.md
+++ b/problems/0337.打家劫舍III.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 337.打家劫舍 III @@ -14,7 +12,7 @@ 计算在不触动警报的情况下,小偷一晚能够盗取的最高金额。 - + ## 算法公开课 @@ -179,7 +177,7 @@ return {val2, val1}; 以示例1为例,dp数组状态如下:(**注意用后序遍历的方式推导**) - + **最后头结点就是 取下标0 和 下标1的最大值就是偷得的最大金钱**。 @@ -623,7 +621,3 @@ impl Solution { ``` -
-
-
-
diff --git a/problems/0343.整数拆分.md b/problems/0343.整数拆分.md
index 5d0110f6..203c4228 100644
--- a/problems/0343.整数拆分.md
+++ b/problems/0343.整数拆分.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 343. 整数拆分 @@ -129,7 +127,7 @@ for (int i = 3; i <= n ; i++) { 举例当n为10 的时候,dp数组里的数值,如下: - + 以上动规五部曲分析完毕,C++代码如下: @@ -564,7 +562,3 @@ public class Solution ``` -
-
-
-
diff --git a/problems/0344.反转字符串.md b/problems/0344.反转字符串.md
index 793c9af3..c88d008c 100644
--- a/problems/0344.反转字符串.md
+++ b/problems/0344.反转字符串.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -429,7 +427,3 @@ object Solution { } } ``` -
-
-
-
diff --git a/problems/0347.前K个高频元素.md b/problems/0347.前K个高频元素.md
index cca9b0ed..b6575c5f 100644
--- a/problems/0347.前K个高频元素.md
+++ b/problems/0347.前K个高频元素.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 前K个大数问题,老生常谈,不得不谈 @@ -609,8 +607,4 @@ impl Solution { ``` -
-
-
-
diff --git a/problems/0349.两个数组的交集.md b/problems/0349.两个数组的交集.md
index 93fa0931..65d22a80 100644
--- a/problems/0349.两个数组的交集.md
+++ b/problems/0349.两个数组的交集.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -16,7 +14,7 @@ 题意:给定两个数组,编写一个函数来计算它们的交集。 - + **说明:** 输出结果中的每个元素一定是唯一的。 @@ -53,7 +51,7 @@ std::set和std::multiset底层实现都是红黑树,std::unordered_set的底 思路如图所示: - + C++代码如下: @@ -544,8 +542,4 @@ end * [350.两个数组的交集 II](https://leetcode.cn/problems/intersection-of-two-arrays-ii/) -
-
-
-
diff --git a/problems/0376.摆动序列.md b/problems/0376.摆动序列.md
index e2ea9904..50934981 100644
--- a/problems/0376.摆动序列.md
+++ b/problems/0376.摆动序列.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 376. 摆动序列 @@ -48,7 +46,7 @@ 用示例二来举例,如图所示: - + **局部最优:删除单调坡度上的节点(不包括单调坡度两端的节点),那么这个坡度就可以有两个局部峰值**。 @@ -74,13 +72,13 @@ 例如 [1,2,2,2,2,1]这样的数组,如图: - + 它的摇摆序列长度是多少呢? **其实是长度是 3**,也就是我们在删除的时候 要不删除左面的三个 2,要不就删除右边的三个 2。 如图,可以统一规则,删除左边的三个 2: - + 在图中,当 i 指向第一个 2 的时候,`prediff > 0 && curdiff = 0` ,当 i 指向最后一个 2 的时候 `prediff = 0 && curdiff < 0`。 @@ -108,7 +106,7 @@ 那么为了规则统一,针对序列[2,5],可以假设为[2,2,5],这样它就有坡度了即 preDiff = 0,如图: - + 针对以上情形,result 初始为 1(默认最右面有一个峰值),此时 curDiff > 0 && preDiff <= 0,那么 result++(计算了左面的峰值),最后得到的 result 就是 2(峰值个数为 2 即摆动序列长度为 2) @@ -147,7 +145,7 @@ public: 在版本一中,我们忽略了一种情况,即 如果在一个单调坡度上有平坡,例如[1,2,2,2,3,4],如图: - + 图中,我们可以看出,版本一的代码在三个地方记录峰值,但其实结果因为是 2,因为 单调中的平坡 不能算峰值(即摆动)。 @@ -186,7 +184,7 @@ public: **本题异常情况的本质,就是要考虑平坡**, 平坡分两种,一个是 上下中间有平坡,一个是单调有平坡,如图: - + ### 思路 2(动态规划) @@ -714,7 +712,3 @@ public class Solution } ``` -
-
-
-
diff --git a/problems/0377.组合总和Ⅳ.md b/problems/0377.组合总和Ⅳ.md
index ba8546c6..20a94331 100644
--- a/problems/0377.组合总和Ⅳ.md
+++ b/problems/0377.组合总和Ⅳ.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 377. 组合总和 Ⅳ @@ -105,7 +103,7 @@ dp[i](考虑nums[j])可以由 dp[i - nums[j]](不考虑nums[j]) 推导 我们再来用示例中的例子推导一下: - + 如果代码运行处的结果不是想要的结果,就把dp[i]都打出来,看看和我们推导的一不一样。 @@ -357,7 +355,3 @@ public class Solution ``` -
-
-
-
diff --git a/problems/0383.赎金信.md b/problems/0383.赎金信.md
index 1d739173..8a2f52ae 100644
--- a/problems/0383.赎金信.md
+++ b/problems/0383.赎金信.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -466,8 +464,4 @@ bool canConstruct(char* ransomNote, char* magazine) { ``` -
-
-
-
diff --git a/problems/0392.判断子序列.md b/problems/0392.判断子序列.md
index 92246e4f..d59b7bc1 100644
--- a/problems/0392.判断子序列.md
+++ b/problems/0392.判断子序列.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 392.判断子序列 @@ -82,7 +80,7 @@ if (s[i - 1] != t[j - 1]),此时相当于t要删除元素,t如果把当前 因为这样的定义在dp二维矩阵中可以留出初始化的区间,如图: - + 如果要是定义的dp[i][j]是以下标i为结尾的字符串s和以下标j为结尾的字符串t,初始化就比较麻烦了。 @@ -100,14 +98,14 @@ vector
-
-
-
diff --git a/problems/0404.左叶子之和.md b/problems/0404.左叶子之和.md
index 66aff68f..69723815 100644
--- a/problems/0404.左叶子之和.md
+++ b/problems/0404.左叶子之和.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 404.左叶子之和 @@ -14,7 +12,7 @@ 示例: - + ## 算法公开课 @@ -28,12 +26,12 @@ 大家思考一下如下图中二叉树,左叶子之和究竟是多少? - + **其实是0,因为这棵树根本没有左叶子!** 但看这个图的左叶子之和是多少? - + 相信通过这两个图,大家对最左叶子的定义有明确理解了。 @@ -685,7 +683,3 @@ public int SumOfLeftLeaves(TreeNode root) ``` -
-
-
-
diff --git a/problems/0406.根据身高重建队列.md b/problems/0406.根据身高重建队列.md
index d6fc415b..0d060ee8 100644
--- a/problems/0406.根据身高重建队列.md
+++ b/problems/0406.根据身高重建队列.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 406.根据身高重建队列 @@ -63,7 +61,7 @@ 以图中{5,2} 为例: - + 按照身高排序之后,优先按身高高的people的k来插入,后序插入节点也不会影响前面已经插入的节点,最终按照k的规则完成了队列。 @@ -422,7 +420,3 @@ public class Solution -
-
-
-
diff --git a/problems/0416.分割等和子集.md b/problems/0416.分割等和子集.md
index 55ed7ad2..79b4d4f7 100644
--- a/problems/0416.分割等和子集.md
+++ b/problems/0416.分割等和子集.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 416. 分割等和子集 @@ -60,7 +58,7 @@ * [动态规划:关于01背包问题,你该了解这些!](https://programmercarl.com/背包理论基础01背包-1.html) * [动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html) -### 01背包问题 +## 01背包问题 01背包问题,大家都知道,有N件物品和一个最多能背重量为W 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。 @@ -92,7 +90,7 @@ 动规五部曲分析如下: -1. 确定dp数组以及下标的含义 +### 1. 确定dp数组以及下标的含义 01背包中,dp[j] 表示: 容量(所能装的重量)为j的背包,所背的物品价值最大可以为dp[j]。 @@ -104,7 +102,7 @@ 而dp[6] 就可以等于6了,放进1 和 5,那么dp[6] == 6,说明背包装满了。 -2. 确定递推公式 +### 2. 确定递推公式 01背包的递推公式为:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]); @@ -113,7 +111,7 @@ 所以递推公式:dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]); -3. dp数组如何初始化 +### 3. dp数组如何初始化 在01背包,一维dp如何初始化,已经讲过, @@ -133,7 +131,7 @@ vector
-
-
-
diff --git a/problems/0417.太平洋大西洋水流问题.md b/problems/0417.太平洋大西洋水流问题.md
index 5156ce22..116cd08e 100644
--- a/problems/0417.太平洋大西洋水流问题.md
+++ b/problems/0417.太平洋大西洋水流问题.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -20,7 +18,7 @@ 示例 1: - + * 输入: heights = [[1,2,2,3,5],[3,2,3,4,4],[2,4,5,3,1],[6,7,1,4,5],[5,1,1,2,4]] * 输出: [[0,4],[1,3],[1,4],[2,2],[3,0],[3,1],[4,0]] @@ -132,11 +130,11 @@ public: 从太平洋边上节点出发,如图: - + 从大西洋边上节点出发,如图: - + 按照这样的逻辑,就可以写出如下遍历代码:(详细注释) @@ -837,7 +835,3 @@ impl Solution { } ``` -
-
-
-
diff --git a/problems/0435.无重叠区间.md b/problems/0435.无重叠区间.md
index d6321315..04845ea7 100644
--- a/problems/0435.无重叠区间.md
+++ b/problems/0435.无重叠区间.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 435. 无重叠区间 @@ -46,7 +44,7 @@ 这里记录非交叉区间的个数还是有技巧的,如图: - + 区间,1,2,3,4,5,6都按照右边界排好序。 @@ -495,7 +493,3 @@ public class Solution -
-
-
-
diff --git a/problems/0450.删除二叉搜索树中的节点.md b/problems/0450.删除二叉搜索树中的节点.md
index 831655e8..406116a3 100644
--- a/problems/0450.删除二叉搜索树中的节点.md
+++ b/problems/0450.删除二叉搜索树中的节点.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 二叉搜索树删除节点就涉及到结构调整了 @@ -22,7 +20,7 @@ 示例: - + ## 算法公开课 @@ -836,7 +834,3 @@ def delete_node(root, key) end ``` -
-
-
-
diff --git a/problems/0452.用最少数量的箭引爆气球.md b/problems/0452.用最少数量的箭引爆气球.md
index 14456f92..17d21cd1 100644
--- a/problems/0452.用最少数量的箭引爆气球.md
+++ b/problems/0452.用最少数量的箭引爆气球.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 452. 用最少数量的箭引爆气球 @@ -78,7 +76,7 @@ 以题目示例: [[10,16],[2,8],[1,6],[7,12]]为例,如图:(方便起见,已经排序) - + 可以看出首先第一组重叠气球,一定是需要一个箭,气球3,的左边界大于了 第一组重叠气球的最小右边界,所以再需要一支箭来射气球3了。 @@ -357,7 +355,3 @@ public class Solution } ``` -
-
-
-
diff --git a/problems/0454.四数相加II.md b/problems/0454.四数相加II.md
index af19f5f7..a26071a1 100644
--- a/problems/0454.四数相加II.md
+++ b/problems/0454.四数相加II.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 需要哈希的地方都能找到map的身影 @@ -526,7 +524,3 @@ def two_sum_mapping(nums1, nums2) end ``` -
-
-
-
diff --git a/problems/0455.分发饼干.md b/problems/0455.分发饼干.md
index 5e8fb730..2a6ade1b 100644
--- a/problems/0455.分发饼干.md
+++ b/problems/0455.分发饼干.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 455.分发饼干 @@ -48,7 +46,7 @@ 如图: - + 这个例子可以看出饼干 9 只有喂给胃口为 7 的小孩,这样才是整体最优解,并想不出反例,那么就可以撸代码了。 @@ -91,7 +89,7 @@ public: 如果 for 控制的是饼干, if 控制胃口,就是出现如下情况 : - + if 里的 index 指向 胃口 10, for 里的 i 指向饼干 9,因为 饼干 9 满足不了 胃口 10,所以 i 持续向前移动,而 index 走不到` s[index] >= g[i]` 的逻辑,所以 index 不会移动,那么当 i 持续向前移动,最后所有的饼干都匹配不上。 @@ -434,7 +432,3 @@ public class Solution } ``` -
-
-
-
diff --git a/problems/0459.重复的子字符串.md b/problems/0459.重复的子字符串.md
index bdced0ef..627a27a4 100644
--- a/problems/0459.重复的子字符串.md
+++ b/problems/0459.重复的子字符串.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > KMP算法还能干这个 @@ -48,13 +46,13 @@ 当一个字符串s:abcabc,内部由重复的子串组成,那么这个字符串的结构一定是这样的: - + 也就是由前后相同的子串组成。 那么既然前面有相同的子串,后面有相同的子串,用 s + s,这样组成的字符串中,后面的子串做前串,前面的子串做后串,就一定还能组成一个s,如图: - + 当然,我们在判断 s + s 拼接的字符串里是否出现一个s的的时候,**要刨除 s + s 的首字符和尾字符**,这样避免在s+s中搜索出原来的s,我们要搜索的是中间拼接出来的s。 @@ -66,11 +64,11 @@ 如图,字符串s,图中数字为数组下标,在 s + s 拼接后, 不算首尾字符,中间凑成s字符串。 (图中数字为数组下标) - + 图中,因为中间拼接成了s,根据红色框 可以知道 s[4] = s[0], s[5] = s[1], s[0] = s[2], s[1] = s[3] s[2] = s[4] ,s[3] = s[5] - + 以上相等关系我们串联一下: @@ -85,7 +83,7 @@ s[5] = s[1] = s[3] 这里可以有录友想,凭什么就是这样组成的s呢,我换一个方式组成s 行不行,如图: - + s[3] = s[0],s[4] = s[1] ,s[5] = s[2],s[0] = s[3],s[1] = s[4],s[2] = s[5] @@ -103,7 +101,7 @@ s[0] s[1] s[2] = s[3] s[4] s[5] 如果是这样的呢,如图: - + s[1] = s[0],s[2] = s[1] ,s[3] = s[2],s[4] = s[3],s[5] = s[4],s[0] = s[5] @@ -167,23 +165,23 @@ KMP算法中next数组为什么遇到字符不匹配的时候可以找到上一 那么相同前后缀可以是这样: - + 也可以是这样: - + 最长的相等前后缀,也就是这样: - + 这里有录友就想:如果字符串s 是由最小重复子串p组成,最长相等前后缀就不能更长一些? 例如这样: - + 如果这样的话,因为前后缀要相同,所以 p2 = p1,p3 = p2,如图: - + p2 = p1,p3 = p2 即: p1 = p2 = p3 @@ -205,7 +203,7 @@ p2 = p1,p3 = p2 即: p1 = p2 = p3 情况一, 最长相等前后缀不包含的子串的长度 比 字符串s的一半的长度还大,那一定不是字符串s的重复子串,如图: - + 图中:前后缀不包含的子串的长度 大于 字符串s的长度的 二分之一 @@ -213,7 +211,7 @@ p2 = p1,p3 = p2 即: p1 = p2 = p3 情况二,最长相等前后缀不包含的子串的长度 可以被 字符串s的长度整除,如图: - + 步骤一:因为 这是相等的前缀和后缀,t[0] 与 k[0]相同, t[1] 与 k[1]相同,所以 s[0] 一定和 s[2]相同,s[1] 一定和 s[3]相同,即:,s[0]s[1]与s[2]s[3]相同 。 @@ -236,7 +234,7 @@ p2 = p1,p3 = p2 即: p1 = p2 = p3 那么它的最长相同前后缀,就不是上图中的前后缀,而是这样的的前后缀: - + 录友可能再问,由一个字符组成的字符串,最长相等前后缀凭什么就是这样的。 @@ -252,7 +250,7 @@ p2 = p1,p3 = p2 即: p1 = p2 = p3 **情况三,最长相等前后缀不包含的子串的长度 不被 字符串s的长度整除得情况**,如图: - + 步骤一:因为 这是相等的前缀和后缀,t[0] 与 k[0]相同, t[1] 与 k[1]相同,t[2] 与 k[2]相同。 @@ -689,6 +687,29 @@ var repeatedSubstringPattern = function (s) { }; ``` +> 正则匹配 +```javascript +/** + * @param {string} s + * @return {boolean} + */ +var repeatedSubstringPattern = function(s) { + let reg = /^(\w+)\1+$/ + return reg.test(s) +}; +``` +> 移动匹配 +```javascript +/** + * @param {string} s + * @return {boolean} + */ +var repeatedSubstringPattern = function (s) { + let ss = s + s; + return ss.substring(1, ss.length - 1).includes(s); +}; +``` + ### TypeScript: > 前缀表统一减一 @@ -894,8 +915,10 @@ impl Solution { } ``` ### C# + +> 前缀表不减一 + ```csharp -// 前缀表不减一 public bool RepeatedSubstringPattern(string s) { if (s.Length == 0) @@ -920,6 +943,13 @@ public int[] GetNext(string s) } ``` +> 移动匹配 +```csharp +public bool RepeatedSubstringPattern(string s) { + string ss = (s + s).Substring(1, (s + s).Length - 2); + return ss.Contains(s); +} +``` ### C ```c @@ -967,7 +997,3 @@ bool repeatedSubstringPattern(char* s) { ``` -
-
-
-
diff --git a/problems/0463.岛屿的周长.md b/problems/0463.岛屿的周长.md
index 5261d6c2..40ddc57d 100644
--- a/problems/0463.岛屿的周长.md
+++ b/problems/0463.岛屿的周长.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -17,7 +15,7 @@ 岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。 - + * 输入:grid = [[0,1,0,0],[1,1,1,0],[0,1,0,0],[1,1,0,0]] * 输出:16 @@ -433,7 +431,3 @@ function islandPerimeter(grid: number[][]): number { ``` -
-
-
-
diff --git a/problems/0474.一和零.md b/problems/0474.一和零.md
index e514e729..8166b39a 100644
--- a/problems/0474.一和零.md
+++ b/problems/0474.一和零.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 474.一和零 @@ -53,7 +51,7 @@ 其实本题并不是多重背包,再来看一下这个图,捋清几种背包的关系 - + 多重背包是每个物品,数量不同的情况。 @@ -129,7 +127,7 @@ for (string str : strs) { // 遍历物品 最后dp数组的状态如下所示: - + 以上动规五部曲分析完毕,C++代码如下: @@ -261,8 +259,70 @@ public: ## 其他语言版本 - ### Java + +三维DP数组实现 + +```java +class Solution { + public int findMaxForm(String[] strs, int m, int n) { + /// 数组有三个维度 + // 第一个维度:取前面的几个字符串 + // 第二个维度:0的数量限制(背包维度 1 容量) + // 第三个维度:1的数量限制(背包维度 2 容量) + int[][][] dpArr = new int[strs.length][m + 1][n + 1]; + + /// 初始化dpArr数组 + // 计算第一个字符串的零数量和1数量 + int zeroNum = 0; + int oneNum = 0; + for (char c : strs[0].toCharArray()) { + if (c == '0') { + zeroNum++; + } else { + oneNum++; + } + } + // 当0数量、1数量都容得下第一个字符串时,将DP数组的相应位置初始化为1,因为当前的子集数量为1 + for (int j = zeroNum; j <= m; j++) { + for (int k = oneNum; k <= n; k++) { + dpArr[0][j][k] = 1; + } + } + /// 依次填充加入第i个字符串之后的DP数组 + for (int i = 1; i < strs.length; i++) { + zeroNum = 0; + oneNum = 0; + for (char c : strs[i].toCharArray()) { + if (c == '0') { + zeroNum++; + } else { + oneNum++; + } + } + for (int j = 0; j <= m; j++) { + for (int k = 0; k <= n; k++) { + if (j >= zeroNum && k >= oneNum) { + // --if-- 当0数量维度和1数量维度的容量都大于等于当前字符串的0数量和1数量时,才考虑是否将当前字符串放入背包 + // 不放入第i个字符串,子集数量仍为 dpArr[i - 1][j][k] + // 放入第i个字符串,需要在0维度腾出 zeroNum 个容量,1维度腾出 oneNum 个容量,然后放入当前字符串,即 dpArr[i - 1][j - zeroNum][k - oneNum] + 1) + dpArr[i][j][k] = Math.max(dpArr[i - 1][j][k], dpArr[i - 1][j - zeroNum][k - oneNum] + 1); + } else { + // --if-- 无法放入第i个字符串,子集数量仍为 dpArr[i - 1][j][k] + dpArr[i][j][k] = dpArr[i - 1][j][k]; + } + } + } + } + return dpArr[dpArr.length - 1][m][n]; + } +} +``` + + + +二维DP数组实现 + ```Java class Solution { public int findMaxForm(String[] strs, int m, int n) { @@ -678,7 +738,4 @@ public class Solution ``` -
-
-
-
+
diff --git a/problems/0491.递增子序列.md b/problems/0491.递增子序列.md
index 7832095a..b3171c8a 100644
--- a/problems/0491.递增子序列.md
+++ b/problems/0491.递增子序列.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 和子集问题有点像,但又处处是陷阱 @@ -47,7 +45,7 @@ 为了有鲜明的对比,我用[4, 7, 6, 7]这个数组来举例,抽象为树形结构如图: - + @@ -81,7 +79,7 @@ if (path.size() > 1) { * 单层搜索逻辑 - + 在图中可以看出,**同一父节点下的同层上使用过的元素就不能再使用了** 那么单层搜索代码如下: @@ -640,7 +638,3 @@ public class Solution { } ``` -
-
-
-
diff --git a/problems/0494.目标和.md b/problems/0494.目标和.md
index 4a1fc6ab..a23e1743 100644
--- a/problems/0494.目标和.md
+++ b/problems/0494.目标和.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -165,7 +163,7 @@ if (abs(target) > sum) return 0; // 此时没有方案 先只考虑物品0,如图: - + (这里的所有物品,都是题目中的数字1)。 @@ -179,7 +177,7 @@ if (abs(target) > sum) return 0; // 此时没有方案 接下来 考虑 物品0 和 物品1,如图: - + 装满背包容量为0 的方法个数是1,即 放0件物品。 @@ -193,7 +191,7 @@ if (abs(target) > sum) return 0; // 此时没有方案 接下来 考虑 物品0 、物品1 和 物品2 ,如图: - + 装满背包容量为0 的方法个数是1,即 放0件物品。 @@ -209,17 +207,17 @@ if (abs(target) > sum) return 0; // 此时没有方案 如图红色部分: - + dp[2][2] = 3,即 放物品0 和 放物品1、放物品0 和 物品 2、放物品1 和 物品2, 如图所示,三种方法: - + **容量为2 的背包,如果不放 物品2 有几种方法呢**? 有 dp[1][2] 种方法,即 背包容量为2,只考虑物品0 和 物品1 ,有 dp[1][2] 种方法,如图: - + **容量为2 的背包, 如果放 物品2 有几种方法呢**? @@ -231,7 +229,7 @@ dp[2][2] = 3,即 放物品0 和 放物品1、放物品0 和 物品 2、放物 如图: - + 有录友可能疑惑,这里计算的是放满 容量为2的背包 有几种方法,那物品2去哪了? @@ -241,7 +239,7 @@ dp[2][2] = 容量为2的背包不放物品2有几种方法 + 容量为2的背包 所以 dp[2][2] = dp[1][2] + dp[1][1] ,如图: - + 以上过程,抽象化如下: @@ -268,11 +266,11 @@ else dp[i][j] = dp[i - 1][j] + dp[i - 1][j - nums[i]]; 先明确递推的方向,如图,求解 dp[2][2] 是由 上方和左上方推出。 - + 那么二维数组的最上行 和 最左列一定要初始化,这是递推公式推导的基础,如图红色部分: - + 关于dp[0][0]的值,在上面的递推公式讲解中已经讲过,装满背包容量为0 的方法数量是1,即 放0件物品。 @@ -325,7 +323,7 @@ for (int i = 0; i < nums.size(); i++) { 例如下图,如果上方没数值,左上方没数值,就无法推出 dp[2][2]。 - + 那么是先 从上到下 ,再从左到右遍历,例如这样: @@ -351,11 +349,11 @@ for (int j = 0; j <= bagSize; j++) { // 列,遍历背包 这里我再画图讲一下,以求dp[2][2]为例,当先从上到下,再从左到右遍历,矩阵是这样: - + 当先从左到右,再从上到下遍历,矩阵是这样: - + 这里大家可以看出,无论是以上哪种遍历,都不影响 dp[2][2]的求值,用来 推导 dp[2][2] 的数值都在。 @@ -368,7 +366,7 @@ bagSize = (target + sum) / 2 = (3 + 5) / 2 = 4 dp数组状态变化如下: - + 这么大的矩阵,我们是可以自己手动模拟出来的。 @@ -447,7 +445,7 @@ bagSize = (target + sum) / 2 = (3 + 5) / 2 = 4 dp数组状态变化如下: - + 大家可以和 二维dp数组的打印结果做一下对比。 @@ -825,30 +823,69 @@ func abs(x int) int { ### JavaScript ```javascript +/** + * 题目来源: {@link https://leetcode.cn/problems/target-sum/} + * + * 题解来源: {@link https://programmercarl.com/0494.%E7%9B%AE%E6%A0%87%E5%92%8C.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE} + * + * 时间复杂度: O(n * C), C 为数组元素总和与目标值之和的一半 + * + * 空间复杂度: O(C) + * + * @param { number[] } nums + * @param { number } target + * @return { number } + */ const findTargetSumWays = (nums, target) => { + // 原题目可转化为: + // + // 将所有元素划分为 2 个集合, + // 一个集合中包含所有要添加 "+" 号的元素, 一个集合中包含所有要添加 "-" 号的元素 + // + // 设两个集合的元素和分别为 positive 和 negative, 所有元素总和为 sum, 那么有如下等式: + // positive + negative = sum (1) + // positive - negative = target (2) + // (1) 与 (2) 联立可得: positive = (sum + target) / 2, + // 所以如果能从原数组中取出若干个元素形成 1 个元素总和为 (sum + target) / 2 的集合, + // 就算得到了 1 种满足题意的组合方法 + // + // 因此, 所求变为: 有多少种取法, 可使得容量为 (sum + target) / 2 的背包被装满? - const sum = nums.reduce((a, b) => a+b); + const sum = nums.reduce((a, b) => a + b); - if(Math.abs(target) > sum) { + if (Math.abs(target) > sum) { return 0; } - if((target + sum) % 2) { + if ((target + sum) % 2) { return 0; } - const halfSum = (target + sum) / 2; - - let dp = new Array(halfSum+1).fill(0); + const bagWeight = (target + sum) / 2; + + // 1. dp 数组的含义 + // dp[j]: 装满容量为 j 的背包, 有 dp[j] 种方法 + let dp = new Array(bagWeight + 1).fill(0); + + // 2. 递推公式 + // dp[j] = Σ(dp[j - nums[j]]), (j ∈ [0, j] 且 j >= nums[j]) + // 因为 dp[j - nums[j]] 表示: 装满容量为 j - nums[j] 背包有 dp[j - nums[j]] 种方法 + // 而容量为 j - nums[j] 的背包只需要再将 nums[j] 放入背包就能使得背包容量达到 j + // 因此, 让背包容量达到 j 有 Σ(dp[j - nums[j]]) 种方法 + + // 3. dp 数组如何初始化 + // dp[0] = 1, dp[1 ~ bagWeight] = 0 dp[0] = 1; - - for(let i = 0; i < nums.length; i++) { - for(let j = halfSum; j >= nums[i]; j--) { + + // 4. 遍历顺序 + // 先物品后背包, 物品从前往后遍历, 背包容量从后往前遍历 + for (let i = 0; i < nums.length; i++) { + for (let j = bagWeight; j >= nums[i]; j--) { dp[j] += dp[j - nums[i]]; } } - return dp[halfSum]; + return dp[bagWeight]; }; ``` @@ -985,8 +1022,4 @@ public class Solution ``` -
-
-
-
diff --git a/problems/0496.下一个更大元素I.md b/problems/0496.下一个更大元素I.md
index 02e73a58..628149b7 100644
--- a/problems/0496.下一个更大元素I.md
+++ b/problems/0496.下一个更大元素I.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 496.下一个更大元素 I @@ -507,7 +505,3 @@ impl Solution { -
-
-
-
diff --git a/problems/0501.二叉搜索树中的众数.md b/problems/0501.二叉搜索树中的众数.md
index c89f8031..8cca8e65 100644
--- a/problems/0501.二叉搜索树中的众数.md
+++ b/problems/0501.二叉搜索树中的众数.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 二叉树上应该怎么求,二叉搜索树上又应该怎么求? @@ -25,7 +23,7 @@ 给定 BST [1,null,2,2], - + 返回[2]. @@ -146,7 +144,7 @@ public: 如图: - + 中序遍历代码如下: @@ -1052,7 +1050,3 @@ public class Solution -
-
-
-
diff --git a/problems/0503.下一个更大元素II.md b/problems/0503.下一个更大元素II.md
index b466337d..93924483 100644
--- a/problems/0503.下一个更大元素II.md
+++ b/problems/0503.下一个更大元素II.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 503.下一个更大元素II @@ -358,7 +356,3 @@ impl Solution { ``` -
-
-
-
diff --git a/problems/0509.斐波那契数.md b/problems/0509.斐波那契数.md
index 1c4127fc..b2e56a61 100644
--- a/problems/0509.斐波那契数.md
+++ b/problems/0509.斐波那契数.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 509. 斐波那契数 @@ -151,7 +149,7 @@ public: * 时间复杂度:O(2^n) * 空间复杂度:O(n),算上了编程语言中实现递归的系统栈所占空间 -这个递归的时间复杂度大家画一下树形图就知道了,如果不清晰的同学,可以看这篇:[通过一道面试题目,讲一讲递归算法的时间复杂度!](https://programmercarl.com/前序/通过一道面试题目,讲一讲递归算法的时间复杂度!.html) +这个递归的时间复杂度大家画一下树形图就知道了,如果不清晰的同学,可以看这篇:[通过一道面试题目,讲一讲递归算法的时间复杂度!](./前序/递归算法的时间复杂度.md) ## 总结 @@ -476,7 +474,3 @@ public class Solution -
-
-
-
diff --git a/problems/0513.找树左下角的值.md b/problems/0513.找树左下角的值.md
index c7446726..4098cb7b 100644
--- a/problems/0513.找树左下角的值.md
+++ b/problems/0513.找树左下角的值.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 513.找树左下角的值 @@ -14,11 +12,11 @@ 示例 1: - + 示例 2: - + ## 算法公开课 @@ -764,7 +762,3 @@ public class Solution // @lc code=end ``` -
-
-
-
diff --git a/problems/0516.最长回文子序列.md b/problems/0516.最长回文子序列.md
index 166310aa..5e456ac9 100644
--- a/problems/0516.最长回文子序列.md
+++ b/problems/0516.最长回文子序列.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -58,7 +56,7 @@ 如果s[i]与s[j]相同,那么dp[i][j] = dp[i + 1][j - 1] + 2; 如图: - + (如果这里看不懂,回忆一下dp[i][j]的定义) @@ -70,7 +68,7 @@ 那么dp[i][j]一定是取最大的,即:dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]); - + 代码如下: @@ -99,7 +97,7 @@ for (int i = 0; i < s.size(); i++) dp[i][i] = 1; 从递归公式中,可以看出,dp[i][j] 依赖于 dp[i + 1][j - 1] ,dp[i + 1][j] 和 dp[i][j - 1],如图: - + **所以遍历i的时候一定要从下到上遍历,这样才能保证下一行的数据是经过计算的**。 @@ -123,7 +121,7 @@ for (int i = s.size() - 1; i >= 0; i--) { 输入s:"cbbd" 为例,dp数组状态如图: - + 红色框即:dp[0][s.size() - 1]; 为最终结果。 @@ -299,7 +297,3 @@ impl Solution { -
-
-
-
diff --git a/problems/0518.零钱兑换II.md b/problems/0518.零钱兑换II.md
index 835df852..95122a7c 100644
--- a/problems/0518.零钱兑换II.md
+++ b/problems/0518.零钱兑换II.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 518.零钱兑换II @@ -138,7 +136,7 @@ 那么二维数组的最上行 和 最左列一定要初始化,这是递推公式推导的基础,如图红色部分: - + 这里首先要关注的就是 dp[0][0] 应该是多少? @@ -298,7 +296,7 @@ for (int j = 0; j <= amount; j++) { // 遍历背包容量 输入: amount = 5, coins = [1, 2, 5] ,dp状态图如下: - + 最后红色框dp[amount]为最终结果。 @@ -589,7 +587,3 @@ public class Solution ``` -
-
-
-
diff --git a/problems/0530.二叉搜索树的最小绝对差.md b/problems/0530.二叉搜索树的最小绝对差.md
index 2533a618..466bd744 100644
--- a/problems/0530.二叉搜索树的最小绝对差.md
+++ b/problems/0530.二叉搜索树的最小绝对差.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 利用二叉搜索树的特性搞起! @@ -15,7 +13,7 @@ 示例: - + 提示:树中至少有 2 个节点。 @@ -72,7 +70,7 @@ public: 如图: - + 一些同学不知道在递归中如何记录前一个节点的指针,其实实现起来是很简单的,大家只要看过一次,写过一次,就掌握了。 @@ -153,23 +151,27 @@ public: 递归 ```java class Solution { - TreeNode pre;// 记录上一个遍历的结点 + TreeNode pre; // 记录上一个遍历的结点 int result = Integer.MAX_VALUE; + public int getMinimumDifference(TreeNode root) { - if(root==null)return 0; - traversal(root); - return result; + if (root == null) + return 0; + traversal(root); + return result; } - public void traversal(TreeNode root){ - if(root==null)return; - //左 + + public void traversal(TreeNode root) { + if (root == null) + return; + // 左 traversal(root.left); - //中 - if(pre!=null){ - result = Math.min(result,root.val-pre.val); + // 中 + if (pre != null) { + result = Math.min(result, root.val - pre.val); } pre = root; - //右 + // 右 traversal(root.right); } } @@ -182,22 +184,27 @@ class Solution { TreeNode pre = null; int result = Integer.MAX_VALUE; - if(root != null) + if (root != null) stack.add(root); - while(!stack.isEmpty()){ + + // 中序遍历(左中右),由于栈先入后出,反序(右中左) + while (!stack.isEmpty()) { TreeNode curr = stack.peek(); - if(curr != null){ + if (curr != null) { stack.pop(); - if(curr.right != null) + // 右 + if (curr.right != null) stack.add(curr.right); + // 中(先用null标记) stack.add(curr); stack.add(null); - if(curr.left != null) + // 左 + if (curr.left != null) stack.add(curr.left); - }else{ + } else { // 中(遇到null再处理) stack.pop(); TreeNode temp = stack.pop(); - if(pre != null) + if (pre != null) result = Math.min(result, temp.val - pre.val); pre = temp; } @@ -670,7 +677,4 @@ public class Solution ``` -
-
-
-
+
diff --git a/problems/0538.把二叉搜索树转换为累加树.md b/problems/0538.把二叉搜索树转换为累加树.md
index b95b5854..45bf1f96 100644
--- a/problems/0538.把二叉搜索树转换为累加树.md
+++ b/problems/0538.把二叉搜索树转换为累加树.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 538.把二叉搜索树转换为累加树 @@ -20,7 +18,7 @@ 示例 1: - + * 输入:[4,1,6,0,2,5,7,null,null,null,3,null,null,null,8] * 输出:[30,36,21,36,35,26,15,null,null,null,33,null,null,null,8] @@ -69,7 +67,7 @@ 遍历顺序如图所示: - + 本题依然需要一个pre指针记录当前遍历节点cur的前一个节点,这样才方便做累加。 @@ -549,7 +547,3 @@ public class Solution -
-
-
-
diff --git a/problems/0541.反转字符串II.md b/problems/0541.反转字符串II.md
index b3e7b022..2bbe6cff 100644
--- a/problems/0541.反转字符串II.md
+++ b/problems/0541.反转字符串II.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -516,8 +514,4 @@ impl Solution { } ``` -
-
-
-
diff --git a/problems/0583.两个字符串的删除操作.md b/problems/0583.两个字符串的删除操作.md
index b9f9ad96..7f7d30f6 100644
--- a/problems/0583.两个字符串的删除操作.md
+++ b/problems/0583.两个字符串的删除操作.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 583. 两个字符串的删除操作 @@ -83,7 +81,7 @@ for (int j = 0; j <= word2.size(); j++) dp[0][j] = j; 以word1:"sea",word2:"eat"为例,推导dp数组状态图如下: - + 以上分析完毕,代码如下: @@ -470,7 +468,3 @@ impl Solution { ``` -
-
-
-
diff --git a/problems/0617.合并二叉树.md b/problems/0617.合并二叉树.md
index 530350ac..755200fe 100644
--- a/problems/0617.合并二叉树.md
+++ b/problems/0617.合并二叉树.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 617.合并二叉树 @@ -15,7 +13,7 @@ 示例 1: - + 注意: 合并必须从两个树的根节点开始。 @@ -804,7 +802,3 @@ public TreeNode MergeTrees(TreeNode root1, TreeNode root2) ``` -
-
-
-
diff --git a/problems/0647.回文子串.md b/problems/0647.回文子串.md
index cf32d7ed..72829535 100644
--- a/problems/0647.回文子串.md
+++ b/problems/0647.回文子串.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 647. 回文子串 @@ -50,7 +48,7 @@ dp[i] 和 dp[i-1] ,dp[i + 1] 看上去都没啥关系。 所以我们要看回文串的性质。 如图: - + 我们在判断字符串S是否是回文,那么如果我们知道 s[1],s[2],s[3] 这个子串是回文的,那么只需要比较 s[0]和s[4]这两个元素是否相同,如果相同的话,这个字符串s 就是回文串。 @@ -108,7 +106,7 @@ dp[i][j]可以初始化为true么? 当然不行,怎能刚开始就全都匹 dp[i + 1][j - 1] 在 dp[i][j]的左下角,如图: - + 如果这矩阵是从上到下,从左到右遍历,那么会用到没有计算过的dp[i + 1][j - 1],也就是根据不确定是不是回文的区间[i+1,j-1],来判断了[i,j]是不是回文,那结果一定是不对的。 @@ -138,7 +136,7 @@ for (int i = s.size() - 1; i >= 0; i--) { // 注意遍历顺序 举例,输入:"aaa",dp[i][j]状态如下: - + 图中有6个true,所以就是有6个回文子串。 @@ -613,7 +611,3 @@ impl Solution { } ``` -
-
-
-
diff --git a/problems/0649.Dota2参议院.md b/problems/0649.Dota2参议院.md
index 1540a601..e77070fc 100644
--- a/problems/0649.Dota2参议院.md
+++ b/problems/0649.Dota2参议院.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -284,7 +282,3 @@ function predictPartyVictory(senate: string): string { -
-
-
-
diff --git a/problems/0654.最大二叉树.md b/problems/0654.最大二叉树.md
index fed9b2b9..b8841a8b 100644
--- a/problems/0654.最大二叉树.md
+++ b/problems/0654.最大二叉树.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 654.最大二叉树 @@ -19,7 +17,7 @@ 示例 : - + 提示: @@ -599,7 +597,3 @@ public TreeNode ConstructMaximumBinaryTree(int[] nums) ``` -
-
-
-
diff --git a/problems/0657.机器人能否返回原点.md b/problems/0657.机器人能否返回原点.md
index eccfef3a..89993b6f 100644
--- a/problems/0657.机器人能否返回原点.md
+++ b/problems/0657.机器人能否返回原点.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 657. 机器人能否返回原点 @@ -182,7 +180,3 @@ var judgeCircle = function (moves) { -
-
-
-
diff --git a/problems/0669.修剪二叉搜索树.md b/problems/0669.修剪二叉搜索树.md
index 32573386..f4ded2c4 100644
--- a/problems/0669.修剪二叉搜索树.md
+++ b/problems/0669.修剪二叉搜索树.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -16,9 +14,9 @@ 给定一个二叉搜索树,同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树,使得所有节点的值在[L, R]中 (R>=L) 。你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新的根节点。 - + - + ## 算法公开课 @@ -52,7 +50,7 @@ public: 我们在重新关注一下第二个示例,如图: - + **所以以上的代码是不可行的!** @@ -62,7 +60,7 @@ public: 在上图中我们发现节点0并不符合区间要求,那么将节点0的右孩子 节点2 直接赋给 节点3的左孩子就可以了(就是把节点0从二叉树中移除),如图: - + 理解了最关键部分了我们再递归三部曲: @@ -129,7 +127,7 @@ return root; 在回顾一下上面的代码,针对下图中二叉树的情况: - + 如下代码相当于把节点0的右孩子(节点2)返回给上一层, @@ -587,7 +585,3 @@ public TreeNode TrimBST(TreeNode root, int low, int high) -
-
-
-
diff --git a/problems/0673.最长递增子序列的个数.md b/problems/0673.最长递增子序列的个数.md
index 0366ee80..92009f5b 100644
--- a/problems/0673.最长递增子序列的个数.md
+++ b/problems/0673.最长递增子序列的个数.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 673.最长递增子序列的个数 @@ -180,7 +178,7 @@ for (int i = 0; i < nums.size(); i++) { 输入:[1,3,5,4,7] - + **如果代码写出来了,怎么改都通过不了,那么把dp和count打印出来看看对不对!** @@ -361,7 +359,3 @@ var findNumberOfLIS = function(nums) { -
-
-
-
diff --git a/problems/0674.最长连续递增序列.md b/problems/0674.最长连续递增序列.md
index 8b967092..16bb2f18 100644
--- a/problems/0674.最长连续递增序列.md
+++ b/problems/0674.最长连续递增序列.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 674. 最长连续递增序列 @@ -87,7 +85,7 @@ for (int i = 1; i < nums.size(); i++) { 已输入nums = [1,3,5,4,7]为例,dp数组状态如下: - + **注意这里要取dp[i]里的最大值,所以dp[2]才是结果!** @@ -514,7 +512,3 @@ func findLengthOfLCIS(nums: Array
-
-
-
diff --git a/problems/0684.冗余连接.md b/problems/0684.冗余连接.md
index 78085490..8a7234df 100644
--- a/problems/0684.冗余连接.md
+++ b/problems/0684.冗余连接.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 684.冗余连接 @@ -14,7 +12,7 @@ 请找出一条可以删去的边,删除后可使得剩余部分是一个有着 n 个节点的树。如果有多个答案,则返回数组 edges 中最后出现的边。 - + 提示: * n == edges.length @@ -87,7 +85,7 @@ void join(int u, int v) { 如图所示: - + 节点A 和节点 B 不在同一个集合,那么就可以将两个 节点连在一起。 @@ -97,7 +95,7 @@ void join(int u, int v) { 如图所示: - + 已经判断 节点A 和 节点B 在在同一个集合(同一个根),如果将 节点A 和 节点B 连在一起就一定会出现环。 @@ -379,7 +377,3 @@ var findRedundantConnection = function(edges) { -
-
-
-
diff --git a/problems/0685.冗余连接II.md b/problems/0685.冗余连接II.md
index 3f489d82..66f7bfe1 100644
--- a/problems/0685.冗余连接II.md
+++ b/problems/0685.冗余连接II.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 685.冗余连接II @@ -18,9 +16,9 @@ 返回一条能删除的边,使得剩下的图是有 n 个节点的有根树。若有多个答案,返回最后出现在给定二维数组的答案。 - + - + 提示: @@ -620,7 +618,3 @@ var findRedundantDirectedConnection = function(edges) { -
-
-
-
diff --git a/problems/0695.岛屿的最大面积.md b/problems/0695.岛屿的最大面积.md
index 11b638d4..972a9995 100644
--- a/problems/0695.岛屿的最大面积.md
+++ b/problems/0695.岛屿的最大面积.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 695. 岛屿的最大面积 @@ -16,7 +14,7 @@ 计算并返回 grid 中最大的岛屿面积。如果没有岛屿,则返回面积为 0 。 - + * 输入:grid = [[0,0,1,0,0,0,0,1,0,0,0,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],[0,1,1,0,1,0,0,0,0,0,0,0,0],[0,1,0,0,1,1,0,0,1,0,1,0,0],[0,1,0,0,1,1,0,0,1,1,1,0,0],[0,0,0,0,0,0,0,0,0,0,1,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],[0,0,0,0,0,0,0,1,1,0,0,0,0]] * 输出:6 @@ -29,7 +27,7 @@ 也就是说斜角度链接是不算了, 例如示例二,是三个岛屿,如图: - + 这道题目也是 dfs bfs基础类题目,就是搜索每个岛屿上“1”的数量,然后取一个最大的。 @@ -44,7 +42,7 @@ 这里其实涉及到dfs的两种写法。 -写法一,dfs只处理下一个节点,即在主函数遇到岛屿就计数为1,dfs处理接下来的相邻陆地 +写法一,dfs处理当前节点的相邻节点,即在主函数遇到岛屿就计数为1,dfs处理接下来的相邻陆地 ```CPP // 版本一 @@ -87,7 +85,7 @@ public: }; ``` -写法二,dfs处理当前节点,即即在主函数遇到岛屿就计数为0,dfs处理接下来的全部陆地 +写法二,dfs处理当前节点,即在主函数遇到岛屿就计数为0,dfs处理接下来的全部陆地 dfs ```CPP @@ -709,7 +707,3 @@ impl Solution { } ``` -
-
-
-
diff --git a/problems/0700.二叉搜索树中的搜索.md b/problems/0700.二叉搜索树中的搜索.md
index 9ec51524..0c373f61 100644
--- a/problems/0700.二叉搜索树中的搜索.md
+++ b/problems/0700.二叉搜索树中的搜索.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 700.二叉搜索树中的搜索 @@ -14,7 +12,7 @@ 例如, - + 在上述示例中,如果要找的值是 5,但因为没有节点值为 5,我们应该返回 NULL。 @@ -126,7 +124,7 @@ public: 中间节点如果大于3就向左走,如果小于3就向右走,如图: - + 所以迭代法代码如下: @@ -508,7 +506,3 @@ public TreeNode SearchBST(TreeNode root, int val) ``` -
-
-
-
diff --git a/problems/0701.二叉搜索树中的插入操作.md b/problems/0701.二叉搜索树中的插入操作.md
index 25d39486..6ce9ef33 100644
--- a/problems/0701.二叉搜索树中的插入操作.md
+++ b/problems/0701.二叉搜索树中的插入操作.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 701.二叉搜索树中的插入操作 @@ -14,7 +12,7 @@ 注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回任意有效的结果。 - + 提示: @@ -724,7 +722,3 @@ public TreeNode InsertIntoBST(TreeNode root, int val) { ``` -
-
-
-
diff --git a/problems/0704.二分查找.md b/problems/0704.二分查找.md
index d86146d6..0ce2f3b8 100644
--- a/problems/0704.二分查找.md
+++ b/problems/0704.二分查找.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 704. 二分查找 @@ -61,7 +59,7 @@ 例如在数组:1,2,3,4,7,9,10中查找元素2,如图所示: - + 代码如下:(详细注释) @@ -104,7 +102,7 @@ public: 在数组:1,2,3,4,7,9,10中查找元素2,如图所示:(**注意和方法一的区别**) - + 代码如下:(详细注释) @@ -837,7 +835,3 @@ class Solution { ``` -
-
-
-
diff --git a/problems/0707.设计链表.md b/problems/0707.设计链表.md
index ed1726d9..a2b2803b 100644
--- a/problems/0707.设计链表.md
+++ b/problems/0707.设计链表.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) > 听说这道题目把链表常见的五个操作都覆盖了? @@ -22,7 +20,7 @@ * deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。 - + ## 算法公开课 @@ -37,10 +35,10 @@ 如果对链表的虚拟头结点不清楚,可以看这篇文章:[链表:听说用虚拟头节点会方便很多?](https://programmercarl.com/0203.移除链表元素.html) 删除链表节点: - + 添加链表节点: - + 这道题目设计链表的五个接口: * 获取链表第index个节点的数值 @@ -1191,6 +1189,160 @@ MyLinkedList.prototype.deleteAtIndex = function(index) { */ ``` +```js +/** + 定义双头节点的结构:同时包含前指针`prev`和后指针next` +*/ +class Node { + constructor(val, prev, next) { + this.val = val + this.prev = prev + this.next = next + } +} + +/** + 双链表:维护 `head` 和 `tail` 两个哨兵节点,这样可以简化对于中间节点的操作 + 并且维护 `size`,使得能够以O(1)时间判断操作是否合法 +*/ +var MyLinkedList = function () { + this.tail = new Node(-1) + this.head = new Node(-1) + this.tail.prev = this.head + this.head.next = this.tail + this.size = 0 +}; + +/** + * 获取在index处节点的值 + * + * @param {number} index + * @return {number} + * + * 时间复杂度: O(n) + * 空间复杂度: O(1) + */ +MyLinkedList.prototype.get = function (index) { + // 当索引超出范围时,返回-1 + if (index > this.size) { + return -1 + } + + let cur = this.head + for (let i = 0; i <= index; i++) { + cur = cur.next + } + + return cur.val +}; + +/** + * 在链表头部添加一个新节点 + * + * @param {number} val + * @return {void} + * + * 时间复杂度: O(1) + * 空间复杂度: O(1) + */ +MyLinkedList.prototype.addAtHead = function (val) { + /** + head <-> [newNode] <-> originNode + */ + this.size++ + const originNode = this.head.next + // 创建新节点,并建立连接 + const newNode = new Node(val, this.head, originNode) + + // 取消原前后结点的连接 + this.head.next = newNode + originNode.prev = newNode +}; + +/** + * 在链表尾部添加一个新节点 + * + * @param {number} val + * @return {void} + * + * 时间复杂度: O(1) + * 空间复杂度: O(1) + */ +MyLinkedList.prototype.addAtTail = function (val) { + /** + originNode <-> [newNode] <-> tail + */ + this.size++ + const originNode = this.tail.prev + + // 创建新节点,并建立连接 + const newNode = new Node(val, originNode, this.tail) + + // 取消原前后结点的连接 + this.tail.prev = newNode + originNode.next = newNode +}; + +/** + * 在指定索引位置前添加一个新节点 + * + * @param {number} index + * @param {number} val + * @return {void} + * + * 时间复杂度: O(n) + * 空间复杂度: O(1) + */ +MyLinkedList.prototype.addAtIndex = function (index, val) { + // 当索引超出范围时,直接返回 + if (index > this.size) { + return + } + this.size++ + + let cur = this.head + for (let i = 0; i < index; i++) { + cur = cur.next + } + + const new_next = cur.next + + // 创建新节点,并建立连接 + const node = new Node(val, cur, new_next) + + // 取消原前后结点的连接 + cur.next = node + new_next.prev = node +}; + +/** + * 删除指定索引位置的节点 + * + * @param {number} index + * @return {void} + * + * 时间复杂度: O(n) + * 空间复杂度: O(1) + */ +MyLinkedList.prototype.deleteAtIndex = function (index) { + // 当索引超出范围时,直接返回 + if (index >= this.size) { + return + } + + this.size-- + let cur = this.head + for (let i = 0; i < index; i++) { + cur = cur.next + } + + const new_next = cur.next.next + // 取消原前后结点的连接 + new_next.prev = cur + cur.next = new_next +}; +``` + ### TypeScript: ```TypeScript @@ -1691,8 +1843,4 @@ public class MyLinkedList } ``` -
-
-
-
diff --git a/problems/0714.买卖股票的最佳时机含手续费.md b/problems/0714.买卖股票的最佳时机含手续费.md
index e742b8c8..fb095d75 100644
--- a/problems/0714.买卖股票的最佳时机含手续费.md
+++ b/problems/0714.买卖股票的最佳时机含手续费.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 714. 买卖股票的最佳时机含手续费 @@ -361,7 +359,3 @@ object Solution { ``` -
-
-
-
diff --git a/problems/0714.买卖股票的最佳时机含手续费(动态规划).md b/problems/0714.买卖股票的最佳时机含手续费(动态规划).md
index 17997b62..ebed4a0b 100644
--- a/problems/0714.买卖股票的最佳时机含手续费(动态规划).md
+++ b/problems/0714.买卖股票的最佳时机含手续费(动态规划).md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 714.买卖股票的最佳时机含手续费 @@ -337,7 +335,3 @@ impl Solution { ``` -
-
-
-
diff --git a/problems/0718.最长重复子数组.md b/problems/0718.最长重复子数组.md
index 1391926a..b371bd85 100644
--- a/problems/0718.最长重复子数组.md
+++ b/problems/0718.最长重复子数组.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 718. 最长重复子数组 @@ -97,7 +95,7 @@ for (int i = 1; i <= nums1.size(); i++) { 拿示例1中,A: [1,2,3,2,1],B: [3,2,1,4,7]为例,画一个dp数组的状态变化,如下: - + 以上五部曲分析完毕,C++代码如下: @@ -129,7 +127,7 @@ public: 在如下图中: - + 我们可以看出dp[i][j]都是由dp[i - 1][j - 1]推出。那么压缩为一维数组,也就是dp[j]都是由dp[j - 1]推出。 @@ -602,7 +600,3 @@ func findLength(nums1: Array
-
-
-
diff --git a/problems/0724.寻找数组的中心索引.md b/problems/0724.寻找数组的中心索引.md
index a66a4450..bccca4f2 100644
--- a/problems/0724.寻找数组的中心索引.md
+++ b/problems/0724.寻找数组的中心索引.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 724.寻找数组的中心下标 @@ -159,7 +157,3 @@ function pivotIndex(nums: number[]): number { -
-
-
-
diff --git a/problems/0738.单调递增的数字.md b/problems/0738.单调递增的数字.md
index f2cfee04..17182778 100644
--- a/problems/0738.单调递增的数字.md
+++ b/problems/0738.单调递增的数字.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) # 738.单调递增的数字 @@ -441,8 +439,4 @@ public class Solution } ``` -
-
-
-
diff --git a/problems/0739.每日温度.md b/problems/0739.每日温度.md
index dd633aed..ed43cf14 100644
--- a/problems/0739.每日温度.md
+++ b/problems/0739.每日温度.md
@@ -1,8 +1,6 @@
-
-
-
-
-
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html) +* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html) +* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html) @@ -71,7 +69,7 @@ 首先先将第一个遍历元素加入单调栈 - + --------- @@ -79,65 +77,65 @@ 我们要保持一个递增单调栈(从栈头到栈底),所以将T[0]弹出,T[1]加入,此时result数组可以记录了,result[0] = 1,即T[0]右面第一个比T[0]大的元素是T[1]。 - + ----------- 加入T[2],同理,T[1]弹出 - + ------- 加入T[3],T[3] < T[2] (当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况),加T[3]加入单调栈。 - + --------- 加入T[4],T[4] == T[3] (当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况),此时依然要加入栈,不用计算距离,因为我们要求的是右面第一个大于本元素的位置,而不是大于等于! - + --------- 加入T[5],T[5] > T[4] (当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况),将T[4]弹出,同时计算距离,更新result - + ---------- T[4]弹出之后, T[5] > T[3] (当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况),将T[3]继续弹出,同时计算距离,更新result - + ------- 直到发现T[5]小于T[st.top()],终止弹出,将T[5]加入单调栈 - + ------- 加入T[6],同理,需要将栈里的T[5],T[2]弹出 - + ------- 同理,继续弹出 - + ------ 此时栈里只剩下了T[6] - + ------------ 加入T[7], T[7] < T[6] 直接入栈,这就是最后的情况,result数组也更新完了。 - + 此时有同学可能就疑惑了,那result[6] , result[7]怎么没更新啊,元素也一直在栈里。 @@ -515,7 +513,3 @@ impl Solution { -
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益! ' -cx $i
+ # ex -sc '1i| 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益! ' -cx $i
+
+ ex -sc '1i|* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html)' -cx $i
+ ex -sc '1i|* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html)' -cx $i
+ ex -sc '1i|* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html)' -cx $i
+
+
# echo '## 其他语言版本' >> $i
# echo '\n' >> $i
# echo 'Java:' >> $i
@@ -48,10 +54,10 @@ do
# 添加结尾
- echo ' ' >> $i
- echo '' >> $i
- echo ' ' >> $i
+ # echo '' >> $i
+ # echo '
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
- 参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
-
-
-
diff --git a/problems/0743.网络延迟时间.md b/problems/0743.网络延迟时间.md
index e631951a..c8a87361 100644
--- a/problems/0743.网络延迟时间.md
+++ b/problems/0743.网络延迟时间.md
@@ -1,3 +1,6 @@
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html)
+* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html)
+* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html)
# 743.网络延迟时间
@@ -10,7 +13,7 @@ https://leetcode.cn/problems/network-delay-time/description/
现在,从某个节点 K 发出一个信号。需要多久才能使所有节点都收到信号?如果不能使所有节点收到信号,返回 -1 。
-
+
提示:
@@ -39,7 +42,7 @@ dijkstra算法:在有权图(权值非负数)中求从起点到其他节点
如本题示例中的图:
-
+
起点(节点1)到终点(节点7) 的最短路径是 图中 标记绿线的部分。
@@ -85,7 +88,7 @@ minDist数组数值初始化为int最大值。
这里在强点一下 **minDist数组的含义:记录所有节点到源点的最短路径**,那么初始化的时候就应该初始为最大值,这样才能在后续出现最短路径的时候及时更新。
-
+
(图中,max 表示默认值,节点0 不做处理,统一从下标1 开始计算,这样下标和节点数值统一, 方便大家理解,避免搞混)
@@ -107,7 +110,7 @@ minDist数组数值初始化为int最大值。
3、更新非访问节点到源点的距离(即更新minDist数组) ,如图:
-
+
更新 minDist数组,即:源点(节点1) 到 节点2 和 节点3的距离。
@@ -133,7 +136,7 @@ minDist数组数值初始化为int最大值。
3、更新非访问节点到源点的距离(即更新minDist数组) ,如图:
-
+
更新 minDist数组,即:源点(节点1) 到 节点6 、 节点3 和 节点4的距离。
@@ -167,7 +170,7 @@ minDist数组数值初始化为int最大值。
3、更新非访问节点到源点的距离(即更新minDist数组) ,如图:
-
+
由于节点3的加入,那么源点可以有新的路径链接到节点4 所以更新minDist数组:
@@ -187,7 +190,7 @@ minDist数组数值初始化为int最大值。
3、更新非访问节点到源点的距离(即更新minDist数组) ,如图:
-
+
由于节点4的加入,那么源点可以链接到节点5 所以更新minDist数组:
@@ -207,7 +210,7 @@ minDist数组数值初始化为int最大值。
3、更新非访问节点到源点的距离(即更新minDist数组) ,如图:
-
+
由于节点6的加入,那么源点可以链接到节点7 所以 更新minDist数组:
@@ -227,7 +230,7 @@ minDist数组数值初始化为int最大值。
3、更新非访问节点到源点的距离(即更新minDist数组) ,如图:
-
+
由于节点5的加入,那么源点有新的路径可以链接到节点7 所以 更新minDist数组:
@@ -245,7 +248,7 @@ minDist数组数值初始化为int最大值。
3、更新非访问节点到源点的距离(即更新minDist数组) ,如图:
-
+
节点7加入,但节点7到节点7的距离为0,所以 不用更新minDist数组
@@ -259,7 +262,7 @@ minDist数组数值初始化为int最大值。
路径如图:
-
+
在上面的讲解中,每一步 我都是按照 dijkstra 三部曲来讲解的,理解了这三部曲,代码也就好懂的。
@@ -428,7 +431,7 @@ select:4
看一下这个图: (有负权值)
-
+
节点1 到 节点5 的最短路径 应该是 节点1 -> 节点2 -> 节点3 -> 节点4 -> 节点5
@@ -438,7 +441,7 @@ select:4
初始化:
-
+
---------------
@@ -452,7 +455,7 @@ select:4
3、更新非访问节点到源点的距离(即更新minDist数组) ,如图:
-
+
更新 minDist数组,即:源点(节点1) 到 节点2 和 节点3的距离。
@@ -471,7 +474,7 @@ select:4
3、更新非访问节点到源点的距离(即更新minDist数组) ,如图:
-
+
由于节点3的加入,那么源点可以有新的路径链接到节点4 所以更新minDist数组:
@@ -489,7 +492,7 @@ select:4
3、更新非访问节点到源点的距离(即更新minDist数组) ,如图:
-
+
由于节点4的加入,那么源点可以有新的路径链接到节点5 所以更新minDist数组:
@@ -507,7 +510,7 @@ select:4
3、更新非访问节点到源点的距离(即更新minDist数组) ,如图:
-
+
节点5的加入,而节点5 没有链接其他节点, 所以不用更新minDist数组,仅标记节点5被访问过了
@@ -523,7 +526,7 @@ select:4
3、更新非访问节点到源点的距离(即更新minDist数组) ,如图:
-
+
--------------
@@ -651,7 +654,7 @@ for (int v = 1; v <= n; v++) {
如图:
-
+
在一个 n (节点数)为8 的图中,就需要申请 8 * 8 这么大的空间,有一条双向边,即:grid[2][5] = 6,grid[5][2] = 6
@@ -675,7 +678,7 @@ for (int v = 1; v <= n; v++) {
邻接表的构造如图:
-
+
这里表达的图是:
@@ -760,7 +763,7 @@ vector> grid(n + 1);
不少录友,不知道 如何定义的数据结构,怎么表示邻接表的,我来给大家画一个图:
-
+
图中邻接表表示:
@@ -781,7 +784,7 @@ vector
>> grid(n + 1);
举例来给大家展示 该代码表达的数据 如下:
-
+
* 节点1 指向 节点3 权值为 1
* 节点1 指向 节点5 权值为 2
@@ -904,7 +907,7 @@ for (int v = 1; v <= n; v++) {
再回顾一下邻接表的构造(数组 + 链表):
-
+
假如 加入的cur 是节点 2, 那么 grid[2] 表示的就是图中第二行链表。 (grid数组的构造我们在 上面 「图的存储」中讲过)
diff --git a/problems/0746.使用最小花费爬楼梯.md b/problems/0746.使用最小花费爬楼梯.md
index 753a104d..147c7bfb 100644
--- a/problems/0746.使用最小花费爬楼梯.md
+++ b/problems/0746.使用最小花费爬楼梯.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/0763.划分字母区间.md b/problems/0763.划分字母区间.md
index 19d862db..daf52bea 100644
--- a/problems/0763.划分字母区间.md
+++ b/problems/0763.划分字母区间.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/0787.K站中转内最便宜的航班.md b/problems/0787.K站中转内最便宜的航班.md
index 9c0a8e7f..6133ac77 100644
--- a/problems/0787.K站中转内最便宜的航班.md
+++ b/problems/0787.K站中转内最便宜的航班.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/0797.所有可能的路径.md b/problems/0797.所有可能的路径.md
index 40e1bbe7..639b6b2b 100644
--- a/problems/0797.所有可能的路径.md
+++ b/problems/0797.所有可能的路径.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/0827.最大人工岛.md b/problems/0827.最大人工岛.md
index d24eaacc..e6aa4601 100644
--- a/problems/0827.最大人工岛.md
+++ b/problems/0827.最大人工岛.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/0841.钥匙和房间.md b/problems/0841.钥匙和房间.md
index b78693b4..60180d27 100644
--- a/problems/0841.钥匙和房间.md
+++ b/problems/0841.钥匙和房间.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/0844.比较含退格的字符串.md b/problems/0844.比较含退格的字符串.md
index c32cdd33..f2294473 100644
--- a/problems/0844.比较含退格的字符串.md
+++ b/problems/0844.比较含退格的字符串.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/0860.柠檬水找零.md b/problems/0860.柠檬水找零.md
index b7887d45..aeb470fe 100644
--- a/problems/0860.柠檬水找零.md
+++ b/problems/0860.柠檬水找零.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/0922.按奇偶排序数组II.md b/problems/0922.按奇偶排序数组II.md
index 28680dbf..484099f8 100644
--- a/problems/0922.按奇偶排序数组II.md
+++ b/problems/0922.按奇偶排序数组II.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/0925.长按键入.md b/problems/0925.长按键入.md
index f4a8fa8e..47465199 100644
--- a/problems/0925.长按键入.md
+++ b/problems/0925.长按键入.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/0941.有效的山脉数组.md b/problems/0941.有效的山脉数组.md
index 77167df0..d4165f36 100644
--- a/problems/0941.有效的山脉数组.md
+++ b/problems/0941.有效的山脉数组.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/0968.监控二叉树.md b/problems/0968.监控二叉树.md
index 327c54f7..d8c31ca9 100644
--- a/problems/0968.监控二叉树.md
+++ b/problems/0968.监控二叉树.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/0977.有序数组的平方.md b/problems/0977.有序数组的平方.md
index b8488e10..6e58be1a 100644
--- a/problems/0977.有序数组的平方.md
+++ b/problems/0977.有序数组的平方.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/1002.查找常用字符.md b/problems/1002.查找常用字符.md
index f938c2b7..3d7d8e07 100644
--- a/problems/1002.查找常用字符.md
+++ b/problems/1002.查找常用字符.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/1005.K次取反后最大化的数组和.md b/problems/1005.K次取反后最大化的数组和.md
index 1a781777..6e908d5a 100644
--- a/problems/1005.K次取反后最大化的数组和.md
+++ b/problems/1005.K次取反后最大化的数组和.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/1020.飞地的数量.md b/problems/1020.飞地的数量.md
index f708e4a3..ae6b3895 100644
--- a/problems/1020.飞地的数量.md
+++ b/problems/1020.飞地的数量.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/1035.不相交的线.md b/problems/1035.不相交的线.md
index 5164e1f7..0119df82 100644
--- a/problems/1035.不相交的线.md
+++ b/problems/1035.不相交的线.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/1047.删除字符串中的所有相邻重复项.md b/problems/1047.删除字符串中的所有相邻重复项.md
index 51ec4e62..01d33fbf 100644
--- a/problems/1047.删除字符串中的所有相邻重复项.md
+++ b/problems/1047.删除字符串中的所有相邻重复项.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/1049.最后一块石头的重量II.md b/problems/1049.最后一块石头的重量II.md
index 0d445a71..6dfba4ed 100644
--- a/problems/1049.最后一块石头的重量II.md
+++ b/problems/1049.最后一块石头的重量II.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/1143.最长公共子序列.md b/problems/1143.最长公共子序列.md
index 6d05ccf3..91c29b83 100644
--- a/problems/1143.最长公共子序列.md
+++ b/problems/1143.最长公共子序列.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/1207.独一无二的出现次数.md b/problems/1207.独一无二的出现次数.md
index 781badf5..fbb19af7 100644
--- a/problems/1207.独一无二的出现次数.md
+++ b/problems/1207.独一无二的出现次数.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/1221.分割平衡字符串.md b/problems/1221.分割平衡字符串.md
index a32ca98f..a9e275d9 100644
--- a/problems/1221.分割平衡字符串.md
+++ b/problems/1221.分割平衡字符串.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/1254.统计封闭岛屿的数目.md b/problems/1254.统计封闭岛屿的数目.md
index 3d7b9fe9..ebea30e3 100644
--- a/problems/1254.统计封闭岛屿的数目.md
+++ b/problems/1254.统计封闭岛屿的数目.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/1334.阈值距离内邻居最少的城市.md b/problems/1334.阈值距离内邻居最少的城市.md
index d8d8861f..bea47a2e 100644
--- a/problems/1334.阈值距离内邻居最少的城市.md
+++ b/problems/1334.阈值距离内邻居最少的城市.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/1356.根据数字二进制下1的数目排序.md b/problems/1356.根据数字二进制下1的数目排序.md
index 9cfb6743..0ae16034 100644
--- a/problems/1356.根据数字二进制下1的数目排序.md
+++ b/problems/1356.根据数字二进制下1的数目排序.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/1365.有多少小于当前数字的数字.md b/problems/1365.有多少小于当前数字的数字.md
index f0a77f55..2cb73f72 100644
--- a/problems/1365.有多少小于当前数字的数字.md
+++ b/problems/1365.有多少小于当前数字的数字.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/1382.将二叉搜索树变平衡.md b/problems/1382.将二叉搜索树变平衡.md
index 120cafff..7b0d3204 100644
--- a/problems/1382.将二叉搜索树变平衡.md
+++ b/problems/1382.将二叉搜索树变平衡.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/1791.找出星型图的中心节点.md b/problems/1791.找出星型图的中心节点.md
index e3db7947..5dd56c65 100644
--- a/problems/1791.找出星型图的中心节点.md
+++ b/problems/1791.找出星型图的中心节点.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/1971.寻找图中是否存在路径.md b/problems/1971.寻找图中是否存在路径.md
index 93e9b663..33b48698 100644
--- a/problems/1971.寻找图中是否存在路径.md
+++ b/problems/1971.寻找图中是否存在路径.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/O(n)的算法居然超时了,此时的n究竟是多大?.md b/problems/O(n)的算法居然超时了,此时的n究竟是多大?.md
index a5dab942..830bba7e 100644
--- a/problems/O(n)的算法居然超时了,此时的n究竟是多大?.md
+++ b/problems/O(n)的算法居然超时了,此时的n究竟是多大?.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/images/0110.字符串接龙-03.png b/problems/images/0110.字符串接龙-03.png
new file mode 100644
index 00000000..7ad2ced6
Binary files /dev/null and b/problems/images/0110.字符串接龙-03.png differ
diff --git a/problems/images/test b/problems/images/test
new file mode 100644
index 00000000..e69de29b
diff --git a/problems/kamacoder/0047.参会dijkstra堆.md b/problems/kamacoder/0047.参会dijkstra堆.md
index 75c12f8a..e361e8e0 100644
--- a/problems/kamacoder/0047.参会dijkstra堆.md
+++ b/problems/kamacoder/0047.参会dijkstra堆.md
@@ -46,13 +46,13 @@
如下图所示,起始车站为 1 号车站,终点车站为 7 号车站,绿色路线为最短的路线,路线总长度为 12,则输出 12。
-
+
不能到达的情况:
如下图所示,当从起始车站不能到达终点车站时,则输出 -1。
-
+
数据范围:
@@ -101,7 +101,7 @@
如图:
-
+
在一个 n (节点数)为8 的图中,就需要申请 8 * 8 这么大的空间,有一条双向边,即:grid[2][5] = 6,grid[5][2] = 6
@@ -125,7 +125,7 @@
邻接表的构造如图:
-
+
这里表达的图是:
@@ -210,7 +210,7 @@ vector> grid(n + 1);
不少录友,不知道 如何定义的数据结构,怎么表示邻接表的,我来给大家画一个图:
-
+
图中邻接表表示:
@@ -231,7 +231,7 @@ vector
>> grid(n + 1);
举例来给大家展示 该代码表达的数据 如下:
-
+
* 节点1 指向 节点3 权值为 1
* 节点1 指向 节点5 权值为 2
@@ -354,7 +354,7 @@ for (int v = 1; v <= n; v++) {
再回顾一下邻接表的构造(数组 + 链表):
-
+
假如 加入的cur 是节点 2, 那么 grid[2] 表示的就是图中第二行链表。 (grid数组的构造我们在 上面 「图的存储」中讲过)
diff --git a/problems/kamacoder/0047.参会dijkstra朴素.md b/problems/kamacoder/0047.参会dijkstra朴素.md
index e71e9d53..1ff9f1a8 100644
--- a/problems/kamacoder/0047.参会dijkstra朴素.md
+++ b/problems/kamacoder/0047.参会dijkstra朴素.md
@@ -46,13 +46,13 @@
如下图所示,起始车站为 1 号车站,终点车站为 7 号车站,绿色路线为最短的路线,路线总长度为 12,则输出 12。
-
+
不能到达的情况:
如下图所示,当从起始车站不能到达终点车站时,则输出 -1。
-
+
数据范围:
@@ -76,7 +76,7 @@ dijkstra算法:在有权图(权值非负数)中求从起点到其他节点
如本题示例中的图:
-
+
起点(节点1)到终点(节点7) 的最短路径是 图中 标记绿线的部分。
@@ -122,7 +122,7 @@ minDist数组数值初始化为int最大值。
这里在强点一下 **minDist数组的含义:记录所有节点到源点的最短路径**,那么初始化的时候就应该初始为最大值,这样才能在后续出现最短路径的时候及时更新。
-
+
(图中,max 表示默认值,节点0 不做处理,统一从下标1 开始计算,这样下标和节点数值统一, 方便大家理解,避免搞混)
@@ -144,7 +144,7 @@ minDist数组数值初始化为int最大值。
3、更新非访问节点到源点的距离(即更新minDist数组) ,如图:
-
+
更新 minDist数组,即:源点(节点1) 到 节点2 和 节点3的距离。
@@ -170,7 +170,7 @@ minDist数组数值初始化为int最大值。
3、更新非访问节点到源点的距离(即更新minDist数组) ,如图:
-
+
更新 minDist数组,即:源点(节点1) 到 节点6 、 节点3 和 节点4的距离。
@@ -204,7 +204,7 @@ minDist数组数值初始化为int最大值。
3、更新非访问节点到源点的距离(即更新minDist数组) ,如图:
-
+
由于节点3的加入,那么源点可以有新的路径链接到节点4 所以更新minDist数组:
@@ -224,7 +224,7 @@ minDist数组数值初始化为int最大值。
3、更新非访问节点到源点的距离(即更新minDist数组) ,如图:
-
+
由于节点4的加入,那么源点可以链接到节点5 所以更新minDist数组:
@@ -244,7 +244,7 @@ minDist数组数值初始化为int最大值。
3、更新非访问节点到源点的距离(即更新minDist数组) ,如图:
-
+
由于节点6的加入,那么源点可以链接到节点7 所以 更新minDist数组:
@@ -264,7 +264,7 @@ minDist数组数值初始化为int最大值。
3、更新非访问节点到源点的距离(即更新minDist数组) ,如图:
-
+
由于节点5的加入,那么源点有新的路径可以链接到节点7 所以 更新minDist数组:
@@ -282,7 +282,7 @@ minDist数组数值初始化为int最大值。
3、更新非访问节点到源点的距离(即更新minDist数组) ,如图:
-
+
节点7加入,但节点7到节点7的距离为0,所以 不用更新minDist数组
@@ -296,7 +296,7 @@ minDist数组数值初始化为int最大值。
路径如图:
-
+
在上面的讲解中,每一步 我都是按照 dijkstra 三部曲来讲解的,理解了这三部曲,代码也就好懂的。
@@ -541,7 +541,7 @@ int main() {
对应如图:
-
+
### 出现负数
@@ -549,7 +549,7 @@ int main() {
看一下这个图: (有负权值)
-
+
节点1 到 节点5 的最短路径 应该是 节点1 -> 节点2 -> 节点3 -> 节点4 -> 节点5
@@ -559,7 +559,7 @@ int main() {
初始化:
-
+
---------------
@@ -573,7 +573,7 @@ int main() {
3、更新非访问节点到源点的距离(即更新minDist数组) ,如图:
-
+
更新 minDist数组,即:源点(节点1) 到 节点2 和 节点3的距离。
@@ -592,7 +592,7 @@ int main() {
3、更新非访问节点到源点的距离(即更新minDist数组) ,如图:
-
+
由于节点3的加入,那么源点可以有新的路径链接到节点4 所以更新minDist数组:
@@ -610,7 +610,7 @@ int main() {
3、更新非访问节点到源点的距离(即更新minDist数组) ,如图:
-
+
由于节点4的加入,那么源点可以有新的路径链接到节点5 所以更新minDist数组:
@@ -628,7 +628,7 @@ int main() {
3、更新非访问节点到源点的距离(即更新minDist数组) ,如图:
-
+
节点5的加入,而节点5 没有链接其他节点, 所以不用更新minDist数组,仅标记节点5被访问过了
@@ -644,7 +644,7 @@ int main() {
3、更新非访问节点到源点的距离(即更新minDist数组) ,如图:
-
+
--------------
diff --git a/problems/kamacoder/0053.寻宝-Kruskal.md b/problems/kamacoder/0053.寻宝-Kruskal.md
index 861efe68..585fa476 100644
--- a/problems/kamacoder/0053.寻宝-Kruskal.md
+++ b/problems/kamacoder/0053.寻宝-Kruskal.md
@@ -63,7 +63,7 @@ kruscal的思路:
依然以示例中,如下这个图来举例。
-
+
将图中的边按照权值有小到大排序,这样从贪心的角度来说,优先选 权值小的边加入到 最小生成树中。
@@ -77,13 +77,13 @@ kruscal的思路:
选边(1,2),节点1 和 节点2 不在同一个集合,所以生成树可以添加边(1,2),并将 节点1,节点2 放在同一个集合。
-
+
--------
选边(4,5),节点4 和 节点 5 不在同一个集合,生成树可以添加边(4,5) ,并将节点4,节点5 放到同一个集合。
-
+
**大家判断两个节点是否在同一个集合,就看图中两个节点是否有绿色的粗线连着就行**
@@ -93,25 +93,25 @@ kruscal的思路:
选边(1,3),节点1 和 节点3 不在同一个集合,生成树添加边(1,3),并将节点1,节点3 放到同一个集合。
-
+
---------
选边(2,6),节点2 和 节点6 不在同一个集合,生成树添加边(2,6),并将节点2,节点6 放到同一个集合。
-
+
--------
选边(3,4),节点3 和 节点4 不在同一个集合,生成树添加边(3,4),并将节点3,节点4 放到同一个集合。
-
+
----------
选边(6,7),节点6 和 节点7 不在同一个集合,生成树添加边(6,7),并将 节点6,节点7 放到同一个集合。
-
+
-----------
@@ -126,7 +126,7 @@ kruscal的思路:
此时 我们就已经生成了一个最小生成树,即:
-
+
在上面的讲解中,看图的话 大家知道如何判断 两个节点 是否在同一个集合(是否有绿色的线连在一起),以及如何把两个节点加入集合(就在图中把两个节点连上)
@@ -346,7 +346,7 @@ int main() {
大家可能发现 怎么和我们 模拟画的图不一样,差别在于 代码生成的最小生成树中 节点5 和 节点7相连的。
-
+
其实造成这个差别 是对边排序的时候 权值相同的边先后顺序的问题导致的,无论相同权值边的顺序是什么样的,最后都能得出最小生成树。
@@ -366,7 +366,7 @@ Kruskal 与 prim 的关键区别在于,prim维护的是节点的集合,而 K
节点未必一定要连着边那, 例如 这个图,大家能明显感受到边没有那么多对吧,但节点数量 和 上述我们讲的例子是一样的。
-
+
为什么边少的话,使用 Kruskal 更优呢?
diff --git a/problems/kamacoder/0053.寻宝-prim.md b/problems/kamacoder/0053.寻宝-prim.md
index 8e26bea4..a7d35841 100644
--- a/problems/kamacoder/0053.寻宝-prim.md
+++ b/problems/kamacoder/0053.寻宝-prim.md
@@ -61,7 +61,7 @@
例如本题示例中的无向有权图为:
-
+
那么在这个图中,如何选取n-1条边使得图中所有节点连接到一起,并且边的权值和最小呢?
@@ -100,7 +100,7 @@ minDist数组里的数值初始化为最大数,因为本题节点距离不会
如图:
-
+
开始构造最小生成树
@@ -118,7 +118,7 @@ minDist数组里的数值初始化为最大数,因为本题节点距离不会
接下来,我们要更新所有节点距离最小生成树的距离,如图:
-
+
注意下标0,我们就不管它了,下标1与节点1对应,这样可以避免大家把节点搞混。
@@ -148,7 +148,7 @@ minDist数组里的数值初始化为最大数,因为本题节点距离不会
接下来,我们要更新节点距离最小生成树的距离,如图:
-
+
此时所有非生成树的节点距离最小生成树(节点1、节点2)的距离都已经跟新了。
@@ -172,7 +172,7 @@ minDist数组里的数值初始化为最大数,因为本题节点距离不会
接下来更新节点距离最小生成树的距离,如图:
-
+
所有非生成树的节点距离最小生成树(节点1、节点2、节点3)的距离都已经跟新了。
@@ -188,7 +188,7 @@ minDist数组里的数值初始化为最大数,因为本题节点距离不会
继续选择一个距离最小生成树(节点1、节点2、节点3)最近的非生成树里的节点,为了巩固大家对minDist数组的理解,这里我再啰嗦一遍:
-
+
**minDist数组是记录了所有非生成树节点距离生成树的最小距离**,所以从数组里我们能看出来,非生成树节点4和节点6距离生成树最近。
@@ -209,7 +209,7 @@ minDist数组里的数值初始化为最大数,因为本题节点距离不会
接下来更新节点距离最小生成树的距离,如图:
-
+
minDist数组已经更新了所有非生成树的节点距离最小生成树(节点1、节点2、节点3、节点4)的距离。
@@ -232,7 +232,7 @@ minDist数组已经更新了所有非生成树的节点距离最小生成树(
接下来更新节点距离最小生成树的距离,如图:
-
+
minDist数组已经更新了所有非生成树的节点距离最小生成树(节点1、节点2、节点3、节点4、节点5)的距离。
@@ -253,11 +253,11 @@ minDist数组已经更新了所有非生成树的节点距离最小生成树(
节点1、节点2、节点3、节点4、节点5、节点6算是最小生成树的节点,接下来更新节点距离最小生成树的距离,如图:
-
+
这里就不在重复描述了,大家类推,最后,节点7加入生成树,如图:
-
+
### 最后
@@ -478,7 +478,7 @@ int main() {
大家可以和我们本题最后生成的最小生成树的图去对比一下边的链接情况:
-
+
绿色的边是最小生成树,和我们的输出完全一致。
diff --git a/problems/kamacoder/0054.替换数字.md b/problems/kamacoder/0054.替换数字.md
index de0ab1a3..665e8ecb 100644
--- a/problems/kamacoder/0054.替换数字.md
+++ b/problems/kamacoder/0054.替换数字.md
@@ -21,7 +21,7 @@
## 思路
-如果想把这道题目做到极致,就不要只用额外的辅助空间了! (不过使用Java刷题的录友,一定要使用辅助空间,因为Java里的string不能修改)
+如果想把这道题目做到极致,就不要只用额外的辅助空间了! (不过使用Java和Python刷题的录友,一定要使用辅助空间,因为Java和Python里的string不能修改)
首先扩充数组到每个数字字符替换成 "number" 之后的大小。
@@ -29,11 +29,11 @@
如图:
-
+
然后从后向前替换数字字符,也就是双指针法,过程如下:i指向新长度的末尾,j指向旧长度的末尾。
-
+
有同学问了,为什么要从后向前填充,从前向后填充不行么?
@@ -215,6 +215,46 @@ public class Main {
}
```
+### Python:
+```python
+class Solution(object):
+ def subsitute_numbers(self, s):
+ """
+ :type s: str
+ :rtype: str
+ """
+
+ count = sum(1 for char in s if char.isdigit()) # 统计数字的个数
+ expand_len = len(s) + (count * 5) # 计算扩充后字符串的大小, x->number, 每有一个数字就要增加五个长度
+ res = [''] * expand_len
+
+ new_index = expand_len - 1 # 指向扩充后字符串末尾
+ old_index = len(s) - 1 # 指向原字符串末尾
+
+ while old_index >= 0: # 从后往前, 遇到数字替换成“number”
+ if s[old_index].isdigit():
+ res[new_index-5:new_index+1] = "number"
+ new_index -= 6
+ else:
+ res[new_index] = s[old_index]
+ new_index -= 1
+ old_index -= 1
+
+ return "".join(res)
+
+if __name__ == "__main__":
+ solution = Solution()
+
+ while True:
+ try:
+ s = input()
+ result = solution.subsitute_numbers(s)
+ print(result)
+ except EOFError:
+ break
+
+```
+
### Go:
````go
package main
diff --git a/problems/kamacoder/0055.右旋字符串.md b/problems/kamacoder/0055.右旋字符串.md
index 2b32cb44..48150222 100644
--- a/problems/kamacoder/0055.右旋字符串.md
+++ b/problems/kamacoder/0055.右旋字符串.md
@@ -40,16 +40,16 @@ fgabcde
本题中,我们需要将字符串右移n位,字符串相当于分成了两个部分,如果n为2,符串相当于分成了两个部分,如图: (length为字符串长度)
-
+
右移n位, 就是将第二段放在前面,第一段放在后面,先不考虑里面字符的顺序,是不是整体倒叙不就行了。如图:
-
+
此时第一段和第二段的顺序是我们想要的,但里面的字符位置被我们倒叙,那么此时我们在把 第一段和第二段里面的字符再倒叙一把,这样字符顺序不就正确了。 如果:
-
+
其实,思路就是 通过 整体倒叙,把两段子串顺序颠倒,两个段子串里的的字符在倒叙一把,**负负得正**,这样就不影响子串里面字符的顺序了。
@@ -80,7 +80,7 @@ int main() {
可以的,不过,要记得 控制好 局部反转的长度,如果先局部反转,那么先反转的子串长度就是 len - n,如图:
-
+
代码如下:
diff --git a/problems/kamacoder/0058.区间和.md b/problems/kamacoder/0058.区间和.md
index 23e7189a..8eaad9f0 100644
--- a/problems/kamacoder/0058.区间和.md
+++ b/problems/kamacoder/0058.区间和.md
@@ -93,7 +93,7 @@ int main() {
如图:
-
+
如果,我们想统计,在vec数组上 下标 2 到下标 5 之间的累加和,那是不是就用 p[5] - p[1] 就可以了。
@@ -109,7 +109,7 @@ int main() {
如图所示:
-
+
`p[5] - p[1]` 就是 红色部分的区间和。
@@ -357,3 +357,54 @@ int main(int argc, char *argv[])
```
+### Go
+
+```go
+package main
+
+import (
+ "fmt"
+ "bufio"
+ "strconv"
+ "os"
+)
+
+func main() {
+ // bufio中读取数据的接口,因为数据卡的比较严,导致使用fmt.Scan会超时
+ scanner := bufio.NewScanner(os.Stdin)
+
+ // 获取数组大小
+ scanner.Scan()
+ n, _ := strconv.Atoi(scanner.Text())
+
+ // 获取数组元素的同时计算前缀和,一般建议切片开大一点防止各种越界问题
+ arr := make([]int, n + 1)
+ for i := 0; i < n; i++ {
+ scanner.Scan()
+ arr[i], _ = strconv.Atoi(scanner.Text())
+ if i != 0 {
+ arr[i] += arr[i - 1]
+ }
+ }
+
+ /*
+ 区间[l, r]的和可以使用区间[0, r]和[0, l - 1]相减得到,
+ 在代码中即为arr[r]-arr[l-1]。这里需要注意l-1是否越界
+ */
+ for {
+ var l, r int
+ scanner.Scan()
+ _, err := fmt.Sscanf(scanner.Text(), "%d %d", &l, &r)
+ if err != nil {
+ return
+ }
+
+ if l > 0 {
+ fmt.Println(arr[r] - arr[l - 1])
+ } else {
+ fmt.Println(arr[r])
+ }
+ }
+}
+```
+
diff --git a/problems/kamacoder/0094.城市间货物运输I-SPFA.md b/problems/kamacoder/0094.城市间货物运输I-SPFA.md
index 99986aaa..b5920292 100644
--- a/problems/kamacoder/0094.城市间货物运输I-SPFA.md
+++ b/problems/kamacoder/0094.城市间货物运输I-SPFA.md
@@ -62,7 +62,7 @@
给大家举一个例子:
-
+
本图中,对所有边进行松弛,真正有效的松弛,只有松弛 边(节点1->节点2) 和 边(节点1->节点3) 。
@@ -97,7 +97,7 @@
初始化,起点为节点1, 起点到起点的最短距离为0,所以minDist[1] 为 0。 将节点1 加入队列 (下次松弛从节点1开始)
-
+
------------
@@ -109,7 +109,7 @@
将节点2、节点3 加入队列,如图:
-
+
-----------------
@@ -124,7 +124,7 @@
将节点4,节点5 加入队列,如图:
-
+
--------------------
@@ -134,7 +134,7 @@
因为没有从节点3作为出发点的边,所以这里就从队列里取出节点3就好,不用做其他操作,如图:
-
+
------------
@@ -147,7 +147,7 @@
如图:
-
+
---------------
@@ -160,7 +160,7 @@
如图,将节点3加入队列,因为节点6已经在队列里,所以不用重复添加
-
+
所以我们在加入队列的过程可以有一个优化,**用visited数组记录已经在队列里的元素,已经在队列的元素不用重复加入**
@@ -174,7 +174,7 @@
所以直接从队列中取出,如图:
-
+
----------
@@ -264,7 +264,7 @@ int main() {
至于为什么 双向图且每一个节点和所有其他节点都相连的话,每个节点 都有 n-1 条指向该节点的边, 我再来举个例子,如图:
-[](https://code-thinking-1253855093.file.myqcloud.com/pics/20240416104138.png)
+[](https://file.kamacoder.com/pics/20240416104138.png)
图中 每个节点都与其他所有节点相连,节点数n 为 4,每个节点都有3条指向该节点的边,即入度为3。
@@ -329,7 +329,7 @@ SPFA(队列优化版Bellman_ford) 在理论上 时间复杂度更胜一筹
如图:
-
+
正权回路 就是有环,但环的总权值为正数。
diff --git a/problems/kamacoder/0094.城市间货物运输I.md b/problems/kamacoder/0094.城市间货物运输I.md
index 2afc014b..9edde8ac 100644
--- a/problems/kamacoder/0094.城市间货物运输I.md
+++ b/problems/kamacoder/0094.城市间货物运输I.md
@@ -46,7 +46,7 @@
1 3 5
```
-
+
## 思路
@@ -78,7 +78,7 @@
这里我给大家举一个例子,每条边有起点、终点和边的权值。例如一条边,节点A 到 节点B 权值为value,如图:
-
+
minDist[B] 表示 到达B节点 最小权值,minDist[B] 有哪些状态可以推出来?
@@ -127,7 +127,7 @@ if (minDist[B] > minDist[A] + value) minDist[B] = minDist[A] + value
如图:
-
+
其他节点对应的minDist初始化为max,因为我们要求最小距离,那么还没有计算过的节点 默认是一个最大数,这样才能更新最小距离。
@@ -150,36 +150,36 @@ if (minDist[B] > minDist[A] + value) minDist[B] = minDist[A] + value
边:节点5 -> 节点6,权值为-2 ,minDist[5] 还是默认数值max,所以不能基于 节点5 去更新节点6,如图:
-
+
(在复习一下,minDist[5] 表示起点到节点5的最短距离)
边:节点1 -> 节点2,权值为1 ,minDist[2] > minDist[1] + 1 ,更新 minDist[2] = minDist[1] + 1 = 0 + 1 = 1 ,如图:
-
+
边:节点5 -> 节点3,权值为1 ,minDist[5] 还是默认数值max,所以不能基于节点5去更新节点3 如图:
-
+
边:节点2 -> 节点5,权值为2 ,minDist[5] > minDist[2] + 2 (经过上面的计算minDist[2]已经不是默认值,而是 1),更新 minDist[5] = minDist[2] + 2 = 1 + 2 = 3 ,如图:
-
+
边:节点2 -> 节点4,权值为-3 ,minDist[4] > minDist[2] + (-3),更新 minDist[4] = minDist[2] + (-3) = 1 + (-3) = -2 ,如图:
-
+
边:节点4 -> 节点6,权值为4 ,minDist[6] > minDist[4] + 4,更新 minDist[6] = minDist[4] + 4 = -2 + 4 = 2
-
+
边:节点1 -> 节点3,权值为5 ,minDist[3] > minDist[1] + 5,更新 minDist[3] = minDist[1] + 5 = 0 + 5 = 5 ,如图:
-
+
--------
diff --git a/problems/kamacoder/0095.城市间货物运输II.md b/problems/kamacoder/0095.城市间货物运输II.md
index a3896b88..5dddf450 100644
--- a/problems/kamacoder/0095.城市间货物运输II.md
+++ b/problems/kamacoder/0095.城市间货物运输II.md
@@ -78,7 +78,7 @@ circle
我们拿题目中示例来画一个图:
-
+
图中 节点1 到 节点4 的最短路径是多少(题目中的最低运输成本) (注意边可以为负数的)
@@ -86,7 +86,7 @@ circle
而图中有负权回路:
-
+
那么我们在负权回路中多绕一圈,我们的最短路径 是不是就更小了 (也就是更低的运输成本)
diff --git a/problems/kamacoder/0096.城市间货物运输III.md b/problems/kamacoder/0096.城市间货物运输III.md
index 0e13846d..37cfaee0 100644
--- a/problems/kamacoder/0096.城市间货物运输III.md
+++ b/problems/kamacoder/0096.城市间货物运输III.md
@@ -63,7 +63,7 @@
本题是最多经过 k 个城市, 那么是 k + 1条边相连的节点。 这里可能有录友想不懂为什么是k + 1,来看这个图:
-
+
图中,节点1 最多已经经过2个节点 到达节点4,那么中间是有多少条边呢,是 3 条边对吧。
@@ -195,7 +195,7 @@ int main() {
起点为节点1, 起点到起点的距离为0,所以 minDist[1] 初始化为0 ,如图:
-
+
其他节点对应的minDist初始化为max,因为我们要求最小距离,那么还没有计算过的节点 默认是一个最大数,这样才能更新最小距离。
@@ -203,21 +203,21 @@ int main() {
边:节点1 -> 节点2,权值为-1 ,minDist[2] > minDist[1] + (-1),更新 minDist[2] = minDist[1] + (-1) = 0 - 1 = -1 ,如图:
-
+
边:节点2 -> 节点3,权值为1 ,minDist[3] > minDist[2] + 1 ,更新 minDist[3] = minDist[2] + 1 = -1 + 1 = 0 ,如图:
-
+
边:节点3 -> 节点1,权值为-1 ,minDist[1] > minDist[3] + (-1),更新 minDist[1] = 0 + (-1) = -1 ,如图:
-
+
边:节点3 -> 节点4,权值为1 ,minDist[4] > minDist[3] + 1,更新 minDist[4] = 0 + 1 = 1 ,如图:
-
+
以上是对所有边进行的第一次松弛,最后 minDist数组为 :-1 -1 0 1 ,(从下标1算起)
@@ -244,7 +244,7 @@ int main() {
在上面画图距离中,对所有边进行第一次松弛,在计算 边(节点2 -> 节点3) 的时候,更新了 节点3。
-
+
理论上来说节点3 应该在对所有边第二次松弛的时候才更新。 这因为当时是基于已经计算好的 节点2(minDist[2])来做计算了。
@@ -331,11 +331,11 @@ int main() {
所构成是图是一样的,都是如下的这个图,但给出的边的顺序是不一样的。
-
+
再用版本一的代码是运行一下,发现结果输出是 1, 是对的。
-
+
分明刚刚输出的结果是 -2,是错误的,怎么 一样的图,这次输出的结果就对了呢?
@@ -345,7 +345,7 @@ int main() {
初始化:
-
+
边:节点3 -> 节点1,权值为-1 ,节点3还没有被计算过,节点1 不更新。
@@ -355,7 +355,7 @@ int main() {
边:节点1 -> 节点2,权值为 -1 ,minDist[2] > minDist[1] + (-1),更新 minDist[2] = 0 + (-1) = -1 ,如图:
-
+
以上是对所有边 松弛一次的状态。
@@ -387,8 +387,6 @@ int main() {
* 本题可以有负权回路,说明只要多做松弛,结果是会变的。
* 本题要求最多经过k个节点,对松弛次数是有限制的。
-如果本题中 没有负权回路的测试用例, 那版本一的代码就可以过了,也就不用我费这么大口舌去讲解的这个坑了。
-
## 拓展三(SPFA)
本题也可以用 SPFA来做,关于 SPFA ,已经在这里 [0094.城市间货物运输I-SPFA](./0094.城市间货物运输I-SPFA.md) 有详细讲解。
@@ -474,7 +472,7 @@ int main() {
但大家会发现,以上代码大家提交后,怎么耗时这么多?
-
+
理论上,SPFA的时间复杂度不是要比 bellman_ford 更优吗?
@@ -556,7 +554,7 @@ int main() {
以上代码提交后,耗时情况:
-
+
大家发现 依然远比 bellman_ford 的代码版本 耗时高。
@@ -581,11 +579,11 @@ dijkstra 是贪心的思路 每一次搜索都只会找距离源点最近的非
在以下这个图中,求节点1 到 节点7 最多经过2个节点 的最短路是多少呢?
-
+
最短路显然是:
-
+
最多经过2个节点,也就是3条边相连的路线:节点1 -> 节点2 -> 节点6-> 节点7
@@ -593,24 +591,24 @@ dijkstra 是贪心的思路 每一次搜索都只会找距离源点最近的非
初始化如图所示:
-
+
找距离源点最近且没有被访问过的节点,先找节点1
-
+
距离源点最近且没有被访问过的节点,找节点2:
-
+
距离源点最近且没有被访问过的节点,找到节点3:
-
+
距离源点最近且没有被访问过的节点,找到节点4:
-
+
此时最多经过2个节点的搜索就完毕了,但结果中minDist[7] (即节点7的结果)并没有被更。
diff --git a/problems/kamacoder/0097.小明逛公园.md b/problems/kamacoder/0097.小明逛公园.md
index dfbd6aa9..97765ebc 100644
--- a/problems/kamacoder/0097.小明逛公园.md
+++ b/problems/kamacoder/0097.小明逛公园.md
@@ -155,7 +155,7 @@ grid[i][j][k] = m,表示 节点i 到 节点j 以[1...k] 集合为中间节点
grid数组是一个三维数组,那么我们初始化的数据在 i 与 j 构成的平层,如图:
-
+
红色的 底部一层是我们初始化好的数据,注意:从三维角度去看初始化的数据很重要,下面我们在聊遍历顺序的时候还会再讲。
@@ -202,7 +202,7 @@ vector
+
现在有一个有向图,有向图是在有向树中的两个没有直接链接的节点中间添加一条有向边。如图:
-
+
输入一个有向图,该图由一个有着 n 个节点(节点编号 从 1 到 n),n 条边,请返回一条可以删除的边,使得删除该条边之后该有向图可以被当作一颗有向树。
@@ -42,7 +42,7 @@
提示信息
-
+
在删除 2 3 后有向图可以变为一棵合法的有向树,所以输出 2 3
@@ -64,13 +64,13 @@
如图:
-
+
找到了节点3 的入度为2,删 1 -> 3 或者 2 -> 3 。选择删顺序靠后便可。
但 入度为2 还有一种情况,情况二,只能删特定的一条边,如图:
-
+
节点3 的入度为 2,但在删除边的时候,只能删 这条边(节点1 -> 节点3),如果删这条边(节点4 -> 节点3),那么删后本图也不是有向树了(因为找不到根节点)。
@@ -81,7 +81,7 @@
如图:
-
+
对于情况三,删掉构成环的边就可以了。
diff --git a/problems/kamacoder/0110.字符串接龙.md b/problems/kamacoder/0110.字符串接龙.md
index 3b6c20ca..af343690 100644
--- a/problems/kamacoder/0110.字符串接龙.md
+++ b/problems/kamacoder/0110.字符串接龙.md
@@ -13,10 +13,14 @@
2. 序列中最后一个字符串是 endStr。
-3. 每次转换只能改变一个字符。
+3. **每次转换只能改变一个位置的字符**(例如 ftr 可以转化 fty ,但 ftr 不能转化 frx)。
4. 转换过程中的中间字符串必须是字典 strList 中的字符串。
+5. beginStr 和 endStr 不在 字典 strList 中
+
+6. 字符串中只有小写的26个字母
+
给你两个字符串 beginStr 和 endStr 和一个字典 strList,找到从 beginStr 到 endStr 的最短转换序列中的字符串数目。如果不存在这样的转换序列,返回 0。
输入描述
@@ -53,7 +57,7 @@ yhn
2 <= N <= 500
+


















































































' -cx $i
- ex -sc '1i|' -cx $i
- ex -sc '1i|
' -cx $i
+ # ex -sc '1i|' -cx $i
+ # ex -sc '1i|
' >> $i
- echo '' >> $i
+ # echo '
' >> $i
+ # echo '' >> $i
# echo '-----------------------' >> $i
diff --git a/problems/为了绝杀编辑距离,卡尔做了三步铺垫.md b/problems/为了绝杀编辑距离,卡尔做了三步铺垫.md
index c2f5efd9..69d6aa9c 100644
--- a/problems/为了绝杀编辑距离,卡尔做了三步铺垫.md
+++ b/problems/为了绝杀编辑距离,卡尔做了三步铺垫.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/二叉树中递归带着回溯.md b/problems/二叉树中递归带着回溯.md
index 42d78ae3..7fa2b6ec 100644
--- a/problems/二叉树中递归带着回溯.md
+++ b/problems/二叉树中递归带着回溯.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/二叉树总结篇.md b/problems/二叉树总结篇.md
index 8db40d65..a67cf5db 100644
--- a/problems/二叉树总结篇.md
+++ b/problems/二叉树总结篇.md
@@ -1,8 +1,6 @@
-
-
-
-
+
diff --git a/problems/二叉树理论基础.md b/problems/二叉树理论基础.md
index c6658277..1fbbc9d9 100644
--- a/problems/二叉树理论基础.md
+++ b/problems/二叉树理论基础.md
@@ -1,8 +1,6 @@
-
-
-
+
说到二叉树,大家对于二叉树其实都很熟悉了,本文呢我也不想教科书式的把二叉树的基础内容再啰嗦一遍,所以以下我讲的都是一些比较重点的内容。
@@ -33,7 +31,7 @@
如图所示:
-
+
这棵二叉树为满二叉树,也可以说深度为k,有2^k-1个节点的二叉树。
@@ -48,7 +46,7 @@
我来举一个典型的例子如题:
-
+
相信不少同学最后一个二叉树是不是完全二叉树都中招了。
@@ -65,7 +63,7 @@
下面这两棵树都是搜索树
-
+
### 平衡二叉搜索树
@@ -74,7 +72,7 @@
如图:
-
+
最后一棵 不是平衡二叉树,因为它的左右两个子树的高度差的绝对值超过了1。
@@ -93,13 +91,13 @@
链式存储如图:
-
+
链式存储是大家很熟悉的一种方式,那么我们来看看如何顺序存储呢?
其实就是用数组来存储二叉树,顺序存储的方式如图:
-
+
用数组来存储二叉树如何遍历的呢?
@@ -146,7 +144,7 @@
大家可以对着如下图,看看自己理解的前后中序有没有问题。
-
+
最后再说一说二叉树中深度优先和广度优先遍历实现方式,我们做二叉树相关题目,经常会使用递归的方式来实现深度优先遍历,也就是实现前中后序遍历,使用递归是比较方便的。
@@ -314,7 +312,3 @@ public class TreeNode
}
```
-
-
diff --git a/problems/二叉树的统一迭代法.md b/problems/二叉树的统一迭代法.md
index a6d4e3ff..d001e0f7 100644
--- a/problems/二叉树的统一迭代法.md
+++ b/problems/二叉树的统一迭代法.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/二叉树的迭代遍历.md b/problems/二叉树的迭代遍历.md
index a3c5b38f..e011612c 100644
--- a/problems/二叉树的迭代遍历.md
+++ b/problems/二叉树的迭代遍历.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/二叉树的递归遍历.md b/problems/二叉树的递归遍历.md
index 8f61b8c6..ffa3ff6c 100644
--- a/problems/二叉树的递归遍历.md
+++ b/problems/二叉树的递归遍历.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/前序/ACM模式.md b/problems/前序/ACM模式.md
index 313264fb..f1ff3a5f 100644
--- a/problems/前序/ACM模式.md
+++ b/problems/前序/ACM模式.md
@@ -5,15 +5,15 @@
平时大家在力扣上刷题,就是 核心代码模式,即给你一个函数,直接写函数实现,例如这样:
-
+
而ACM模式,是程序头文件,main函数,数据的输入输出都要自己处理,例如这样:
-
+
大家可以发现 右边代码框什么都没有,程序从头到尾都需要自己实现,本题如果写完代码是这样的: (细心的录友可以发现和力扣上刷题是不一样的)
-
+
**如果大家从一开始学习算法就一直在力扣上的话,突然切到ACM模式会非常不适应**。
@@ -21,15 +21,15 @@
知识星球里也有很多录友,因为不熟悉ACM模式在面试的过程中吃了不少亏。
-











-
-
-
diff --git a/problems/剑指Offer58-II.左旋转字符串.md b/problems/剑指Offer58-II.左旋转字符串.md
index e32f4ce1..4c62312c 100644
--- a/problems/剑指Offer58-II.左旋转字符串.md
+++ b/problems/剑指Offer58-II.左旋转字符串.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/动态规划-股票问题总结篇.md b/problems/动态规划-股票问题总结篇.md
index 7927deb7..314fb471 100644
--- a/problems/动态规划-股票问题总结篇.md
+++ b/problems/动态规划-股票问题总结篇.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/动态规划总结篇.md b/problems/动态规划总结篇.md
index dd1646d6..faca5ecb 100644
--- a/problems/动态规划总结篇.md
+++ b/problems/动态规划总结篇.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/动态规划理论基础.md b/problems/动态规划理论基础.md
index 9ffb4533..634f710f 100644
--- a/problems/动态规划理论基础.md
+++ b/problems/动态规划理论基础.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/双指针总结.md b/problems/双指针总结.md
index 409e80ab..9c92e3d6 100644
--- a/problems/双指针总结.md
+++ b/problems/双指针总结.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/周总结/20201003二叉树周末总结.md b/problems/周总结/20201003二叉树周末总结.md
index ea508224..3212ca56 100644
--- a/problems/周总结/20201003二叉树周末总结.md
+++ b/problems/周总结/20201003二叉树周末总结.md
@@ -254,5 +254,5 @@ traversal(cur->left, tmp, result);
* Github:[leetcode-master](https://github.com/youngyangyang04/leetcode-master)
* 知乎:[代码随想录](https://www.zhihu.com/people/sun-xiu-yang-64)
-
+
-
-
-
diff --git a/problems/哈希表理论基础.md b/problems/哈希表理论基础.md
index 825c4657..92b590bc 100644
--- a/problems/哈希表理论基础.md
+++ b/problems/哈希表理论基础.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/回溯总结.md b/problems/回溯总结.md
index 8d9b78c4..8fd69d51 100644
--- a/problems/回溯总结.md
+++ b/problems/回溯总结.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/回溯算法去重问题的另一种写法.md b/problems/回溯算法去重问题的另一种写法.md
index 96dfeffe..5c20f562 100644
--- a/problems/回溯算法去重问题的另一种写法.md
+++ b/problems/回溯算法去重问题的另一种写法.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/回溯算法理论基础.md b/problems/回溯算法理论基础.md
index 862fb101..d31e9651 100644
--- a/problems/回溯算法理论基础.md
+++ b/problems/回溯算法理论基础.md
@@ -1,14 +1,12 @@
-
-
-
+
## 算法公开课
@@ -116,7 +114,7 @@ if (终止条件) {
如图:
-
+
注意图中,我特意举例集合大小和孩子的数量是相等的!
@@ -176,7 +174,3 @@ void backtracking(参数) {
-
-
diff --git a/problems/字符串总结.md b/problems/字符串总结.md
index 7da97914..460944c5 100644
--- a/problems/字符串总结.md
+++ b/problems/字符串总结.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/数组总结篇.md b/problems/数组总结篇.md
index 7c2fd947..e29a7bd3 100644
--- a/problems/数组总结篇.md
+++ b/problems/数组总结篇.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/数组理论基础.md b/problems/数组理论基础.md
index e6d25c15..4000208a 100644
--- a/problems/数组理论基础.md
+++ b/problems/数组理论基础.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/栈与队列总结.md b/problems/栈与队列总结.md
index df022c77..2d09daeb 100644
--- a/problems/栈与队列总结.md
+++ b/problems/栈与队列总结.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/栈与队列理论基础.md b/problems/栈与队列理论基础.md
index 3ceb8690..eadd6f6a 100644
--- a/problems/栈与队列理论基础.md
+++ b/problems/栈与队列理论基础.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/根据身高重建队列(vector原理讲解).md b/problems/根据身高重建队列(vector原理讲解).md
index 70a9a97a..162ee273 100644
--- a/problems/根据身高重建队列(vector原理讲解).md
+++ b/problems/根据身高重建队列(vector原理讲解).md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/算法模板.md b/problems/算法模板.md
index 0d32cebb..068806d6 100644
--- a/problems/算法模板.md
+++ b/problems/算法模板.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/背包总结篇.md b/problems/背包总结篇.md
index 651a92a8..9ce3fdda 100644
--- a/problems/背包总结篇.md
+++ b/problems/背包总结篇.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/背包理论基础01背包-1.md b/problems/背包理论基础01背包-1.md
index d9b953c0..79751c89 100644
--- a/problems/背包理论基础01背包-1.md
+++ b/problems/背包理论基础01背包-1.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/背包理论基础01背包-2.md b/problems/背包理论基础01背包-2.md
index b5862bb5..b6a68960 100644
--- a/problems/背包理论基础01背包-2.md
+++ b/problems/背包理论基础01背包-2.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/背包问题完全背包一维.md b/problems/背包问题完全背包一维.md
index a8e241c3..be7a5d54 100644
--- a/problems/背包问题完全背包一维.md
+++ b/problems/背包问题完全背包一维.md
@@ -1,3 +1,6 @@
+* [做项目(多个C++、Java、Go、测开、前端项目)](https://www.programmercarl.com/other/kstar.html)
+* [刷算法(两个月高强度学算法)](https://www.programmercarl.com/xunlian/xunlianying.html)
+* [背八股(40天挑战高频面试题)](https://www.programmercarl.com/xunlian/bagu.html)
# 完全背包-一维数组
@@ -51,11 +54,11 @@ for (int i = 1; i < n; i++) { // 遍历物品
遍历物品在外层循环,遍历背包容量在内层循环,状态如图:
-
+
遍历背包容量在外层循环,遍历物品在内层循环,状态如图:
-
+
看了这两个图,大家就会理解,完全背包中,两个for循环的先后循序,都不影响计算dp[j]所需要的值(这个值就是下标j之前所对应的dp[j])。
diff --git a/problems/背包问题理论基础多重背包.md b/problems/背包问题理论基础多重背包.md
index 878efc12..39e7ebe3 100644
--- a/problems/背包问题理论基础多重背包.md
+++ b/problems/背包问题理论基础多重背包.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/背包问题理论基础完全背包.md b/problems/背包问题理论基础完全背包.md
index 0cc6e915..cb8db1e0 100644
--- a/problems/背包问题理论基础完全背包.md
+++ b/problems/背包问题理论基础完全背包.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/贪心算法总结篇.md b/problems/贪心算法总结篇.md
index 14d82151..4c67fb40 100644
--- a/problems/贪心算法总结篇.md
+++ b/problems/贪心算法总结篇.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/贪心算法理论基础.md b/problems/贪心算法理论基础.md
index 6fde2dbb..2d0af879 100644
--- a/problems/贪心算法理论基础.md
+++ b/problems/贪心算法理论基础.md
@@ -1,15 +1,13 @@
-
-
-
+
## 算法公开课
@@ -92,7 +90,3 @@
最后给出贪心的一般解题步骤,大家可以发现这个解题步骤也是比较抽象的,不像是二叉树,回溯算法,给出了那么具体的解题套路和模板。
-
-
diff --git a/problems/链表总结篇.md b/problems/链表总结篇.md
index 7da0d2de..99bb2abc 100644
--- a/problems/链表总结篇.md
+++ b/problems/链表总结篇.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/链表理论基础.md b/problems/链表理论基础.md
index d1313807..5305c9a9 100644
--- a/problems/链表理论基础.md
+++ b/problems/链表理论基础.md
@@ -1,8 +1,6 @@
-
-
-
-
diff --git a/problems/面试题02.07.链表相交.md b/problems/面试题02.07.链表相交.md
index 48944b5e..0207b71e 100644
--- a/problems/面试题02.07.链表相交.md
+++ b/problems/面试题02.07.链表相交.md
@@ -1,8 +1,6 @@
-
-
-
-