From 97cd84d47870a8ab2aad30838b9ebc1a9a450099 Mon Sep 17 00:00:00 2001 From: zcxzcxzcx <18810692826@163.com> Date: Sun, 2 Jan 2022 22:16:26 +0800 Subject: [PATCH 001/328] =?UTF-8?q?Create=200093.=E5=A4=8D=E5=8E=9FIP?= =?UTF-8?q?=E5=9C=B0=E5=9D=80.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 优化时间复杂度,更好地剪枝(java版本) --- problems/0093.复原IP地址.md | 42 +++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/problems/0093.复原IP地址.md b/problems/0093.复原IP地址.md index 3e7cd1ad..67bb1bbe 100644 --- a/problems/0093.复原IP地址.md +++ b/problems/0093.复原IP地址.md @@ -304,6 +304,48 @@ class Solution { return true; } } + +//方法二:比上面的方法时间复杂度低,更好地剪枝,优化时间复杂度 +class Solution { + List result = new ArrayList(); + StringBuilder stringBuilder = new StringBuilder(); + + public List restoreIpAddresses(String s) { + restoreIpAddressesHandler(s, 0, 0); + return result; + } + + // number表示stringbuilder中ip段的数量 + public void restoreIpAddressesHandler(String s, int start, int number) { + // 如果start等于s的长度并且ip段的数量是4,则加入结果集,并返回 + if (start == s.length() && number == 4) { + result.add(stringBuilder.toString()); + return; + } + // 如果start等于s的长度但是ip段的数量不为4,或者ip段的数量为4但是start小于s的长度,则直接返回 + if (start == s.length() || number == 4) { + return; + } + // 剪枝:ip段的长度最大是3,并且ip段处于[0,255] + for (int i = start; i < s.length() && i - start < 3 && Integer.parseInt(s.substring(start, i + 1)) >= 0 + && Integer.parseInt(s.substring(start, i + 1)) <= 255; i++) { + // 如果ip段的长度大于1,并且第一位为0的话,continue + if (i + 1 - start > 1 && s.charAt(start) - '0' == 0) { + continue; + } + stringBuilder.append(s.substring(start, i + 1)); + // 当stringBuilder里的网段数量小于3时,才会加点;如果等于3,说明已经有3段了,最后一段不需要再加点 + if (number < 3) { + stringBuilder.append("."); + } + number++; + restoreIpAddressesHandler(s, i + 1, number); + number--; + // 删除当前stringBuilder最后一个网段,注意考虑点的数量的问题 + stringBuilder.delete(start + number, i + number + 2); + } + } +} ``` ## python From 0b643bd27d71a2472ee1cf0bfa16cd7f99df0a4b Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Thu, 13 Jan 2022 15:00:39 +0800 Subject: [PATCH 002/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880349.?= =?UTF-8?q?=E4=B8=A4=E4=B8=AA=E6=95=B0=E7=BB=84=E7=9A=84=E4=BA=A4=E9=9B=86?= =?UTF-8?q?.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0349.两个数组的交集.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/problems/0349.两个数组的交集.md b/problems/0349.两个数组的交集.md index 812c4489..92342f17 100644 --- a/problems/0349.两个数组的交集.md +++ b/problems/0349.两个数组的交集.md @@ -190,7 +190,33 @@ var intersection = function(nums1, nums2) { }; ``` +TypeScript: + +版本一(正常解法): + +```typescript +function intersection(nums1: number[], nums2: number[]): number[] { + let resSet: Set = new Set(), + nums1Set: Set = new Set(nums1); + for (let i of nums2) { + if (nums1Set.has(i)) { + resSet.add(i); + } + } + return Array.from(resSet); +}; +``` + +版本二(秀操作): + +```typescript +function intersection(nums1: number[], nums2: number[]): number[] { + return Array.from(new Set(nums1.filter(i => nums2.includes(i)))) +}; +``` + Swift: + ```swift func intersection(_ nums1: [Int], _ nums2: [Int]) -> [Int] { var set1 = Set() From 391410a383f452c292a045e068b138295d4af7da Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Thu, 13 Jan 2022 15:29:20 +0800 Subject: [PATCH 003/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A00202.=E5=BF=AB?= =?UTF-8?q?=E4=B9=90=E6=95=B0.md=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0202.快乐数.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/problems/0202.快乐数.md b/problems/0202.快乐数.md index 2d678151..f0a46a40 100644 --- a/problems/0202.快乐数.md +++ b/problems/0202.快乐数.md @@ -232,7 +232,27 @@ var isHappy = function(n) { }; ``` +TypeScript: + +```typescript +function isHappy(n: number): boolean { + // Utils + // 计算val各位的平方和 + function calcSum(val: number): number { + return String(val).split("").reduce((pre, cur) => (pre + Number(cur) * Number(cur)), 0); + } + + let storeSet: Set = new Set(); + while (n !== 1 && !storeSet.has(n)) { + storeSet.add(n); + n = calcSum(n); + } + return n === 1; +}; +``` + Swift: + ```swift // number 每个位置上的数字的平方和 func getSum(_ number: Int) -> Int { From 6586f9a8299138d0e7fcb6135f68c75d67a36bdc Mon Sep 17 00:00:00 2001 From: weiting-cn <2254912@qq.com> Date: Thu, 13 Jan 2022 17:06:28 +0800 Subject: [PATCH 004/328] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=AE=8C=E5=85=A8?= =?UTF-8?q?=E8=83=8C=E5=8C=85=E9=81=8D=E5=8E=86=E8=83=8C=E5=8C=85=E5=AE=B9?= =?UTF-8?q?=E9=87=8F=E6=97=B6=E7=9A=84=E8=BE=B9=E7=95=8C=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/背包问题理论基础完全背包.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/背包问题理论基础完全背包.md b/problems/背包问题理论基础完全背包.md index 3cc8557c..f79310b8 100644 --- a/problems/背包问题理论基础完全背包.md +++ b/problems/背包问题理论基础完全背包.md @@ -52,7 +52,7 @@ for(int i = 0; i < weight.size(); i++) { // 遍历物品 ```CPP // 先遍历物品,再遍历背包 for(int i = 0; i < weight.size(); i++) { // 遍历物品 - for(int j = weight[i]; j < bagWeight ; j++) { // 遍历背包容量 + for(int j = weight[i]; j <= bagWeight ; j++) { // 遍历背包容量 dp[j] = max(dp[j], dp[j - weight[i]] + value[i]); } From 97a0b8d46b9ffaf1174cde3ea01d2d2afda6a9fc Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Thu, 13 Jan 2022 19:18:32 +0800 Subject: [PATCH 005/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880001.?= =?UTF-8?q?=E4=B8=A4=E6=95=B0=E4=B9=8B=E5=92=8C.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0001.两数之和.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/problems/0001.两数之和.md b/problems/0001.两数之和.md index 37c95736..b337d1e2 100644 --- a/problems/0001.两数之和.md +++ b/problems/0001.两数之和.md @@ -186,6 +186,24 @@ var twoSum = function (nums, target) { }; ``` +TypeScript: + +```typescript +function twoSum(nums: number[], target: number): number[] { + let helperMap: Map = new Map(); + let index: number | undefined; + let resArr: number[] = []; + for (let i = 0, length = nums.length; i < length; i++) { + index = helperMap.get(target - nums[i]); + if (index !== undefined) { + resArr = [i, index]; + } + helperMap.set(nums[i], i); + } + return resArr; +}; +``` + php ```php From ed2f56fa28817edbfccd3d3bc38f07eac71a5f2b Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Thu, 13 Jan 2022 20:32:18 +0800 Subject: [PATCH 006/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880454.?= =?UTF-8?q?=E5=9B=9B=E6=95=B0=E7=9B=B8=E5=8A=A0II.md=EF=BC=89:=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0454.四数相加II.md | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/problems/0454.四数相加II.md b/problems/0454.四数相加II.md index 6853354c..352f693b 100644 --- a/problems/0454.四数相加II.md +++ b/problems/0454.四数相加II.md @@ -139,7 +139,7 @@ class Solution(object): return count -``` +``` Go: ```go @@ -192,8 +192,33 @@ var fourSumCount = function(nums1, nums2, nums3, nums4) { }; ``` +TypeScript: + +```typescript +function fourSumCount(nums1: number[], nums2: number[], nums3: number[], nums4: number[]): number { + let helperMap: Map = new Map(); + let resNum: number = 0; + let tempVal: number | undefined; + for (let i of nums1) { + for (let j of nums2) { + tempVal = helperMap.get(i + j); + helperMap.set(i + j, tempVal ? tempVal + 1 : 1); + } + } + for (let k of nums3) { + for (let l of nums4) { + tempVal = helperMap.get(0 - (k + l)); + if (tempVal) { + resNum += tempVal; + } + } + } + return resNum; +}; +``` PHP: + ```php class Solution { /** From 7b785ab004eaa2635980a96ee543cbe65f4852de Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Thu, 13 Jan 2022 22:14:12 +0800 Subject: [PATCH 007/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880383.?= =?UTF-8?q?=E8=B5=8E=E9=87=91=E4=BF=A1.md=EF=BC=89=EF=BC=9A=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0383.赎金信.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/problems/0383.赎金信.md b/problems/0383.赎金信.md index 650f2a99..31e19b10 100644 --- a/problems/0383.赎金信.md +++ b/problems/0383.赎金信.md @@ -264,6 +264,27 @@ var canConstruct = function(ransomNote, magazine) { }; ``` +TypeScript: + +```typescript +function canConstruct(ransomNote: string, magazine: string): boolean { + let helperArr: number[] = new Array(26).fill(0); + let base: number = 'a'.charCodeAt(0); + let index: number; + for (let i = 0, length = magazine.length; i < length; i++) { + helperArr[magazine[i].charCodeAt(0) - base]++; + } + for (let i = 0, length = ransomNote.length; i < length; i++) { + index = ransomNote[i].charCodeAt(0) - base; + helperArr[index]--; + if (helperArr[index] < 0) { + return false; + } + } + return true; +}; +``` + PHP: ```php From 9d59aab89e5a61f752e67f3c969260a98a95fded Mon Sep 17 00:00:00 2001 From: bqlin Date: Mon, 20 Dec 2021 18:26:34 +0800 Subject: [PATCH 008/328] =?UTF-8?q?0028.=E5=AE=9E=E7=8E=B0strStr=EF=BC=9A?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=8E=92=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0028.实现strStr.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/problems/0028.实现strStr.md b/problems/0028.实现strStr.md index f0b56719..c23f5558 100644 --- a/problems/0028.实现strStr.md +++ b/problems/0028.实现strStr.md @@ -259,7 +259,7 @@ void getNext(int* next, const string& s) 然后还要对next数组进行初始化赋值,如下: -``` +```cpp int j = -1; next[0] = j; ``` @@ -278,8 +278,8 @@ next[i] 表示 i(包括i)之前最长相等的前后缀长度(其实就是 所以遍历模式串s的循环下标i 要从 1开始,代码如下: -``` -for(int i = 1; i < s.size(); i++) { +```cpp +for (int i = 1; i < s.size(); i++) { ``` 如果 s[i] 与 s[j+1]不相同,也就是遇到 前后缀末尾不相同的情况,就要向前回退。 @@ -292,7 +292,7 @@ next[j]就是记录着j(包括j)之前的子串的相同前后缀的长度 所以,处理前后缀不相同的情况代码如下: -``` +```cpp while (j >= 0 && s[i] != s[j + 1]) { // 前后缀不相同了     j = next[j]; // 向前回退 } @@ -300,7 +300,7 @@ while (j >= 0 && s[i] != s[j + 1]) { // 前后缀不相同了 3. 处理前后缀相同的情况 -如果s[i] 与 s[j + 1] 相同,那么就同时向后移动i 和j 说明找到了相同的前后缀,同时还要将j(前缀的长度)赋给next[i], 因为next[i]要记录相同前后缀的长度。 +如果 s[i] 与 s[j + 1] 相同,那么就同时向后移动i 和j 说明找到了相同的前后缀,同时还要将j(前缀的长度)赋给next[i], 因为next[i]要记录相同前后缀的长度。 代码如下: @@ -346,7 +346,7 @@ void getNext(int* next, const string& s){ i就从0开始,遍历文本串,代码如下: -``` +```cpp for (int i = 0; i < s.size(); i++)  ``` @@ -356,7 +356,7 @@ for (int i = 0; i < s.size(); i++)  代码如下: -``` +```cpp while(j >= 0 && s[i] != t[j + 1]) {     j = next[j]; } @@ -364,7 +364,7 @@ while(j >= 0 && s[i] != t[j + 1]) { 如果 s[i] 与 t[j + 1] 相同,那么i 和 j 同时向后移动, 代码如下: -``` +```cpp if (s[i] == t[j + 1]) {     j++; // i的增加在for循环里 } @@ -376,7 +376,7 @@ if (s[i] == t[j + 1]) { 代码如下: -``` +```cpp if (j == (t.size() - 1) ) {     return (i - t.size() + 1); } From 57af6f6a4b8941e5422c8387ab8591501c5f28f4 Mon Sep 17 00:00:00 2001 From: bqlin Date: Mon, 20 Dec 2021 19:53:51 +0800 Subject: [PATCH 009/328] =?UTF-8?q?0027.=E7=A7=BB=E9=99=A4=E5=85=83?= =?UTF-8?q?=E7=B4=A0=EF=BC=9A=E4=BC=98=E5=8C=96=E6=8E=92=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0027.移除元素.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/0027.移除元素.md b/problems/0027.移除元素.md index 99990302..d69f2bcf 100644 --- a/problems/0027.移除元素.md +++ b/problems/0027.移除元素.md @@ -42,7 +42,7 @@ ![27.移除元素-暴力解法](https://tva1.sinaimg.cn/large/008eGmZEly1gntrc7x9tjg30du09m1ky.gif) -很明显暴力解法的时间复杂度是O(n^2),这道题目暴力解法在leetcode上是可以过的。 +很明显暴力解法的时间复杂度是$O(n^2)$,这道题目暴力解法在leetcode上是可以过的。 代码如下: From 71ada4737a7cc00de5403c43f73a7d6c824eb7b2 Mon Sep 17 00:00:00 2001 From: bqlin Date: Mon, 20 Dec 2021 19:54:34 +0800 Subject: [PATCH 010/328] =?UTF-8?q?=E6=A0=88=E4=B8=8E=E9=98=9F=E5=88=97?= =?UTF-8?q?=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80=EF=BC=9A=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=8E=92=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/栈与队列理论基础.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/problems/栈与队列理论基础.md b/problems/栈与队列理论基础.md index b9811b29..44fcbdd5 100644 --- a/problems/栈与队列理论基础.md +++ b/problems/栈与队列理论基础.md @@ -67,7 +67,7 @@ deque是一个双向队列,只要封住一段,只开通另一端就可以实 我们也可以指定vector为栈的底层实现,初始化语句如下: -``` +```cpp std::stack > third; // 使用vector为底层容器的栈 ``` @@ -77,7 +77,7 @@ std::stack > third; // 使用vector为底层容器的栈 也可以指定list 为起底层实现,初始化queue的语句如下: -``` +```cpp std::queue> third; // 定义以list为底层容器的队列 ``` From 13601e89abdff1a8b196645f647db551d8f4154e Mon Sep 17 00:00:00 2001 From: bqlin Date: Mon, 20 Dec 2021 20:13:03 +0800 Subject: [PATCH 011/328] =?UTF-8?q?0225.=E7=94=A8=E9=98=9F=E5=88=97?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E6=A0=88=E3=80=810232.=E7=94=A8=E6=A0=88?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E9=98=9F=E5=88=97=EF=BC=9A=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=8E=92=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0225.用队列实现栈.md | 2 +- problems/0232.用栈实现队列.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/problems/0225.用队列实现栈.md b/problems/0225.用队列实现栈.md index fdb544a6..524ca329 100644 --- a/problems/0225.用队列实现栈.md +++ b/problems/0225.用队列实现栈.md @@ -46,7 +46,7 @@ 模拟的队列执行语句如下: -``` +```cpp queue.push(1); queue.push(2); queue.pop(); // 注意弹出的操作 diff --git a/problems/0232.用栈实现队列.md b/problems/0232.用栈实现队列.md index 4edba2f2..0e4fce28 100644 --- a/problems/0232.用栈实现队列.md +++ b/problems/0232.用栈实现队列.md @@ -21,7 +21,7 @@ empty() -- 返回队列是否为空。 示例: -``` +```cpp MyQueue queue = new MyQueue(); queue.push(1); queue.push(2); From cd4529c8ff7c4570a4541988c1cf3a76e3586150 Mon Sep 17 00:00:00 2001 From: bin3826246 <59920177+bin3826246@users.noreply.github.com> Date: Fri, 14 Jan 2022 19:15:00 +0800 Subject: [PATCH 012/328] =?UTF-8?q?Create=20=E9=9D=A2=E8=AF=95=E9=A2=98=20?= =?UTF-8?q?02.07.=20=E8=A7=A3=E6=B3=95=E6=9B=B4=E6=96=B0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/面试题 02.07. 解法更新.md | 41 ++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 problems/面试题 02.07. 解法更新.md diff --git a/problems/面试题 02.07. 解法更新.md b/problems/面试题 02.07. 解法更新.md new file mode 100644 index 00000000..119f875c --- /dev/null +++ b/problems/面试题 02.07. 解法更新.md @@ -0,0 +1,41 @@ +# 双指针,不计算链表长度 +设置指向headA和headB的指针pa、pb,分别遍历两个链表,每次循环同时更新pa和pb。 +* 当链表A遍历完之后,即pa为空时,将pa指向headB; +* 当链表B遍历完之后,即pa为空时,将pb指向headA; +* 当pa与pb相等时,即指向同一个节点,该节点即为相交起始节点。 +* 若链表不相交,则pa、pb同时为空时退出循环,即如果链表不相交,pa与pb在遍历过全部节点后同时指向结尾空节点,此时退出循环,返回空。 +# 证明思路 +设链表A不相交部分长度为a,链表B不相交部分长度为b,两个链表相交部分长度为c。
+在pa指向链表A时,即pa为空之前,pa经过链表A不相交部分和相交部分,走过的长度为a+c;
+pa指向链表B后,在移动相交节点之前经过链表B不相交部分,走过的长度为b,总合为a+c+b。
+同理,pb走过长度的总合为b+c+a。二者相等,即pa与pb可同时到达相交起始节点。
+该方法可避免计算具体链表长度。 +```cpp +class Solution { +public: + ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { + //链表为空时,返回空指针 + if(headA == nullptr || headB == nullptr) return nullptr; + ListNode* pa = headA; + ListNode* pb = headB; + //pa与pb在遍历过全部节点后,同时指向结尾空节点时退出循环 + while(pa != nullptr || pb != nullptr){ + //pa为空时,将pa指向headB + if(pa == nullptr){ + pa = headB; + } + //pa为空时,将pb指向headA + if(pb == nullptr){ + pb = headA; + } + //pa == pb时,返回相交起始节点 + if(pa == pb){ + return pa; + } + pa = pa->next; + pb = pb->next; + } + return nullptr; + } +}; +``` From 570022f6666b633891bb9e590488529d5238d254 Mon Sep 17 00:00:00 2001 From: bin3826246 <59920177+bin3826246@users.noreply.github.com> Date: Fri, 14 Jan 2022 19:20:36 +0800 Subject: [PATCH 013/328] =?UTF-8?q?=E9=9D=A2=E8=AF=95=E9=A2=9802.07=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0cpp=E5=8F=8C=E6=8C=87=E9=92=88=E6=96=B0?= =?UTF-8?q?=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 双指针新解法,不需计算链表长度 --- problems/面试题 02.07. 解法更新.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/面试题 02.07. 解法更新.md b/problems/面试题 02.07. 解法更新.md index 119f875c..6115d02e 100644 --- a/problems/面试题 02.07. 解法更新.md +++ b/problems/面试题 02.07. 解法更新.md @@ -28,7 +28,7 @@ public: if(pb == nullptr){ pb = headA; } - //pa == pb时,返回相交起始节点 + //pa与pb相等时,返回相交起始节点 if(pa == pb){ return pa; } From 2ea72e3e4345e0de2feed93b4a74dd9bbbc25b68 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 14 Jan 2022 21:59:34 +0800 Subject: [PATCH 014/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880015.?= =?UTF-8?q?=E4=B8=89=E6=95=B0=E4=B9=8B=E5=92=8C.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0015.三数之和.md | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/problems/0015.三数之和.md b/problems/0015.三数之和.md index c78ab06d..8992c5f4 100644 --- a/problems/0015.三数之和.md +++ b/problems/0015.三数之和.md @@ -332,7 +332,43 @@ var threeSum = function(nums) { return res; }; ``` +TypeScript: +```typescript +function threeSum(nums: number[]): number[][] { + nums.sort((a, b) => a - b); + let length = nums.length; + let left: number = 0, + right: number = length - 1; + let resArr: number[][] = []; + for (let i = 0; i < length; i++) { + if (i > 0 && nums[i] === nums[i - 1]) { + continue; + } + left = i + 1; + right = length - 1; + while (left < right) { + let total: number = nums[i] + nums[left] + nums[right]; + if (total === 0) { + resArr.push([nums[i], nums[left], nums[right]]); + left++; + right--; + while (nums[right] === nums[right + 1]) { + right--; + } + while (nums[left] === nums[left - 1]) { + left++; + } + } else if (total < 0) { + left++; + } else { + right--; + } + } + } + return resArr; +}; +``` ruby: ```ruby From 12bf8ae05b176816a21cfd741b2274bfada14aae Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 14 Jan 2022 22:36:55 +0800 Subject: [PATCH 015/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880018.?= =?UTF-8?q?=E5=9B=9B=E6=95=B0=E4=B9=8B=E5=92=8C.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0018.四数之和.md | 42 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/problems/0018.四数之和.md b/problems/0018.四数之和.md index b94ebeef..dae8636b 100644 --- a/problems/0018.四数之和.md +++ b/problems/0018.四数之和.md @@ -311,7 +311,49 @@ var fourSum = function(nums, target) { }; ``` +TypeScript: + +```typescript +function fourSum(nums: number[], target: number): number[][] { + nums.sort((a, b) => a - b); + let first: number = 0, + second: number, + third: number, + fourth: number; + let length: number = nums.length; + let resArr: number[][] = []; + for (; first < length; first++) { + if (first > 0 && nums[first] === nums[first - 1]) { + continue; + } + for (second = first + 1; second < length; second++) { + if ((second - first) > 1 && nums[second] === nums[second - 1]) { + continue; + } + third = second + 1; + fourth = length - 1; + while (third < fourth) { + let total: number = nums[first] + nums[second] + nums[third] + nums[fourth]; + if (total === target) { + resArr.push([nums[first], nums[second], nums[third], nums[fourth]]); + third++; + fourth--; + while (nums[third] === nums[third - 1]) third++; + while (nums[fourth] === nums[fourth + 1]) fourth--; + } else if (total < target) { + third++; + } else { + fourth--; + } + } + } + } + return resArr; +}; +``` + PHP: + ```php class Solution { /** From d9ffaec8a8e6b630f187ec662917b53d2878aee8 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sat, 15 Jan 2022 16:32:29 +0800 Subject: [PATCH 016/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880344.?= =?UTF-8?q?=E5=8F=8D=E8=BD=AC=E5=AD=97=E7=AC=A6=E4=B8=B2.md=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0344.反转字符串.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/problems/0344.反转字符串.md b/problems/0344.反转字符串.md index 28313839..e6a56ca5 100644 --- a/problems/0344.反转字符串.md +++ b/problems/0344.反转字符串.md @@ -201,6 +201,27 @@ var reverseString = function(s) { }; ``` +TypeScript: + +```typescript +/** + Do not return anything, modify s in-place instead. + */ +function reverseString(s: string[]): void { + let length: number = s.length; + let left: number = 0, + right: number = length - 1; + let tempStr: string; + while (left < right) { + tempStr = s[left]; + s[left] = s[right]; + s[right] = tempStr; + left++; + right--; + } +}; +``` + Swift: ```swift From 91807bfe9deb35788886786dd1590044dd707a36 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sat, 15 Jan 2022 17:32:13 +0800 Subject: [PATCH 017/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0(0541.=E5=8F=8D?= =?UTF-8?q?=E8=BD=AC=E5=AD=97=E7=AC=A6=E4=B8=B2II.md):=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0541.反转字符串II.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/problems/0541.反转字符串II.md b/problems/0541.反转字符串II.md index fb92b1e4..77558663 100644 --- a/problems/0541.反转字符串II.md +++ b/problems/0541.反转字符串II.md @@ -252,6 +252,28 @@ var reverseStr = function(s, k) { ``` +TypeScript: + +```typescript +function reverseStr(s: string, k: number): string { + let left: number, right: number; + let arr: string[] = s.split(''); + let temp: string; + for (let i = 0, length = arr.length; i < length; i += 2 * k) { + left = i; + right = (i + k - 1) >= length ? length - 1 : i + k - 1; + while (left < right) { + temp = arr[left]; + arr[left] = arr[right]; + arr[right] = temp; + left++; + right--; + } + } + return arr.join(''); +}; +``` + Swift: ```swift From 3d7ec66e21c511f5cd0440388de9075ac5d45155 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sat, 15 Jan 2022 17:59:35 +0800 Subject: [PATCH 018/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88=E5=89=91?= =?UTF-8?q?=E6=8C=87Offer05.=E6=9B=BF=E6=8D=A2=E7=A9=BA=E6=A0=BC.md?= =?UTF-8?q?=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/剑指Offer05.替换空格.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/problems/剑指Offer05.替换空格.md b/problems/剑指Offer05.替换空格.md index d0f382c8..530545fb 100644 --- a/problems/剑指Offer05.替换空格.md +++ b/problems/剑指Offer05.替换空格.md @@ -298,6 +298,33 @@ javaScript: }; ``` +TypeScript: + +```typescript +function replaceSpace(s: string): string { + let arr: string[] = s.split(''); + let spaceNum: number = 0; + let oldLength: number = arr.length; + for (let i = 0; i < oldLength; i++) { + if (arr[i] === ' ') { + spaceNum++; + } + } + arr.length = oldLength + 2 * spaceNum; + let cur: number = oldLength - 1; + for (let i = arr.length - 1; i >= 0; i--, cur--) { + if (arr[cur] !== ' ') { + arr[i] = arr[cur] + } else { + arr[i] = '0'; + arr[--i] = '2'; + arr[--i] = '%'; + } + } + return arr.join(''); +}; +``` + Swift: ```swift From d164c86ac418de56e18ab6edb7578e896d5cb892 Mon Sep 17 00:00:00 2001 From: zhangjiong Date: Mon, 17 Jan 2022 01:23:41 +0800 Subject: [PATCH 019/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200344.=E5=8F=8D?= =?UTF-8?q?=E8=BD=AC=E5=AD=97=E7=AC=A6=E4=B8=B2=20C#=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0344.反转字符串.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/problems/0344.反转字符串.md b/problems/0344.反转字符串.md index 9176c915..920cd86c 100644 --- a/problems/0344.反转字符串.md +++ b/problems/0344.反转字符串.md @@ -232,6 +232,19 @@ void reverseString(char* s, int sSize){ } ``` +C#: +```csharp +public class Solution +{ + public void ReverseString(char[] s) + { + for (int i = 0, j = s.Length - 1; i < j; i++, j--) + { + (s[i], s[j]) = (s[j], s[i]); + } + } +} +``` -----------------------
From 1f00889410d44ab517b7cdd76ace801b18ed7361 Mon Sep 17 00:00:00 2001 From: zhangjiong Date: Mon, 17 Jan 2022 01:30:46 +0800 Subject: [PATCH 020/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200541.=E5=8F=8D?= =?UTF-8?q?=E8=BD=AC=E5=AD=97=E7=AC=A6=E4=B8=B2II=20C#=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0541.反转字符串II.md | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/problems/0541.反转字符串II.md b/problems/0541.反转字符串II.md index fb92b1e4..1338cd0d 100644 --- a/problems/0541.反转字符串II.md +++ b/problems/0541.反转字符串II.md @@ -272,9 +272,21 @@ func reverseStr(_ s: String, _ k: Int) -> String { } ``` - - - +C#: +```csharp +public class Solution +{ + public string ReverseStr(string s, int k) + { + Span span = s.ToCharArray().AsSpan(); + for (int i = 0; i < span.Length; i += 2 * k) + { + span[i + k < span.Length ? i..(i + k) : i..].Reverse(); + } + return span.ToString(); + } +} +``` -----------------------
From b1a0fbad2b4799416bd45a297f67df93eca4612b Mon Sep 17 00:00:00 2001 From: zhangjiong Date: Mon, 17 Jan 2022 11:53:23 +0800 Subject: [PATCH 021/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200015.=E4=B8=89?= =?UTF-8?q?=E6=95=B0=E4=B9=8B=E5=92=8C=20C#=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0015.三数之和.md | 59 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/problems/0015.三数之和.md b/problems/0015.三数之和.md index c78ab06d..19e19e43 100644 --- a/problems/0015.三数之和.md +++ b/problems/0015.三数之和.md @@ -509,5 +509,64 @@ int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes } ``` +C#: +```csharp +public class Solution +{ + public IList> ThreeSum(int[] nums) + { + var result = new List>(); + + Array.Sort(nums); + + for (int i = 0; i < nums.Length - 2; i++) + { + int n1 = nums[i]; + + if (n1 > 0) + break; + + if (i > 0 && n1 == nums[i - 1]) + continue; + + int left = i + 1; + int right = nums.Length - 1; + + while (left < right) + { + int n2 = nums[left]; + int n3 = nums[right]; + int sum = n1 + n2 + n3; + + if (sum > 0) + { + right--; + } + else if (sum < 0) + { + left++; + } + else + { + result.Add(new List { n1, n2, n3 }); + + while (left < right && nums[left] == n2) + { + left++; + } + + while (left < right && nums[right] == n3) + { + right--; + } + } + } + } + + return result; + } +} +``` + -----------------------
From 35bbec3e298c03cc69582f486baa961102e0f583 Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Mon, 17 Jan 2022 12:36:22 +0800 Subject: [PATCH 022/328] Update --- problems/0063.不同路径II.md | 29 +++++----- problems/0096.不同的二叉搜索树.md | 10 ++-- problems/0343.整数拆分.md | 26 ++++----- problems/背包理论基础01背包-1.md | 88 +++++++++++++++---------------- 4 files changed, 75 insertions(+), 78 deletions(-) diff --git a/problems/0063.不同路径II.md b/problems/0063.不同路径II.md index 490b6b5c..1bcc11cd 100644 --- a/problems/0063.不同路径II.md +++ b/problems/0063.不同路径II.md @@ -4,7 +4,7 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

-## 63. 不同路径 II +# 63. 不同路径 II [力扣题目链接](https://leetcode-cn.com/problems/unique-paths-ii/) @@ -22,23 +22,22 @@ ![](https://img-blog.csdnimg.cn/20210111204939971.png) -输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]] -输出:2 +* 输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]] +* 输出:2 解释: -3x3 网格的正中间有一个障碍物。 -从左上角到右下角一共有 2 条不同的路径: -1. 向右 -> 向右 -> 向下 -> 向下 -2. 向下 -> 向下 -> 向右 -> 向右 +* 3x3 网格的正中间有一个障碍物。 +* 从左上角到右下角一共有 2 条不同的路径: + 1. 向右 -> 向右 -> 向下 -> 向下 + 2. 向下 -> 向下 -> 向右 -> 向右 示例 2: ![](https://img-blog.csdnimg.cn/20210111205857918.png) -输入:obstacleGrid = [[0,1],[0,0]] -输出:1 +* 输入:obstacleGrid = [[0,1],[0,0]] +* 输出:1 提示: - * m == obstacleGrid.length * n == obstacleGrid[i].length * 1 <= m, n <= 100 @@ -171,7 +170,7 @@ public: ## 其他语言版本 -Java: +### Java ```java class Solution { @@ -199,7 +198,7 @@ class Solution { ``` -Python: +### Python ```python class Solution: @@ -262,7 +261,7 @@ class Solution: ``` -Go: +### Go ```go func uniquePathsWithObstacles(obstacleGrid [][]int) int { @@ -308,8 +307,8 @@ func uniquePathsWithObstacles(obstacleGrid [][]int) int { ``` -Javascript -``` Javascript +### Javascript +```Javascript var uniquePathsWithObstacles = function(obstacleGrid) { const m = obstacleGrid.length const n = obstacleGrid[0].length diff --git a/problems/0096.不同的二叉搜索树.md b/problems/0096.不同的二叉搜索树.md index d4b8d024..48826697 100644 --- a/problems/0096.不同的二叉搜索树.md +++ b/problems/0096.不同的二叉搜索树.md @@ -4,7 +4,7 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

-## 96.不同的二叉搜索树 +# 96.不同的二叉搜索树 [力扣题目链接](https://leetcode-cn.com/problems/unique-binary-search-trees/) @@ -163,7 +163,7 @@ public: ## 其他语言版本 -Java: +### Java ```Java class Solution { public int numTrees(int n) { @@ -184,7 +184,7 @@ class Solution { } ``` -Python: +### Python ```python class Solution: def numTrees(self, n: int) -> int: @@ -196,7 +196,7 @@ class Solution: return dp[-1] ``` -Go: +### Go ```Go func numTrees(n int)int{ dp:=make([]int,n+1) @@ -210,7 +210,7 @@ func numTrees(n int)int{ } ``` -Javascript: +### Javascript ```Javascript const numTrees =(n) => { let dp = new Array(n+1).fill(0); diff --git a/problems/0343.整数拆分.md b/problems/0343.整数拆分.md index 5d11f670..471a7ab7 100644 --- a/problems/0343.整数拆分.md +++ b/problems/0343.整数拆分.md @@ -4,23 +4,22 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

-## 343. 整数拆分 +# 343. 整数拆分 [力扣题目链接](https://leetcode-cn.com/problems/integer-break/) 给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。 示例 1: -输入: 2 -输出: 1 - -\解释: 2 = 1 + 1, 1 × 1 = 1。 +* 输入: 2 +* 输出: 1 +* 解释: 2 = 1 + 1, 1 × 1 = 1。 示例 2: -输入: 10 -输出: 36 -解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。 -说明: 你可以假设 n 不小于 2 且不大于 58。 +* 输入: 10 +* 输出: 36 +* 解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。 +* 说明: 你可以假设 n 不小于 2 且不大于 58。 ## 思路 @@ -193,7 +192,7 @@ public: ## 其他语言版本 -Java: +### Java ```Java class Solution { public int integerBreak(int n) { @@ -212,7 +211,7 @@ class Solution { } ``` -Python: +### Python ```python class Solution: def integerBreak(self, n: int) -> int: @@ -226,7 +225,8 @@ class Solution: dp[i] = max(dp[i], max(j * (i - j), j * dp[i - j])) return dp[n] ``` -Go: + +### Go ```golang func integerBreak(n int) int { /** @@ -256,7 +256,7 @@ func max(a,b int) int{ } ``` -Javascript: +### Javascript ```Javascript var integerBreak = function(n) { let dp = new Array(n + 1).fill(0) diff --git a/problems/背包理论基础01背包-1.md b/problems/背包理论基础01背包-1.md index 4367aff9..6ff32017 100644 --- a/problems/背包理论基础01背包-1.md +++ b/problems/背包理论基础01背包-1.md @@ -3,11 +3,12 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ # 动态规划:关于01背包问题,你该了解这些! 这周我们正式开始讲解背包问题! -背包问题的经典资料当然是:背包九讲。在公众号「代码随想录」后台回复:背包九讲,就可以获得背包九讲的PDF。 +背包问题的经典资料当然是:背包九讲。在公众号「代码随想录」后台回复:背包九讲,就可以获得背包九讲的pdf。 但说实话,背包九讲对于小白来说确实不太友好,看起来还是有点费劲的,而且都是伪代码理解起来也吃力。 @@ -32,7 +33,7 @@ leetcode上没有纯01背包的问题,都是01背包应用方面的题目, ## 01 背包 -有N件物品和一个最多能背重量为W 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。**每件物品只能用一次**,求解将哪些物品装入背包里物品价值总和最大。 +有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。**每件物品只能用一次**,求解将哪些物品装入背包里物品价值总和最大。 ![动态规划-背包问题](https://img-blog.csdnimg.cn/20210117175428387.jpg) @@ -40,7 +41,7 @@ leetcode上没有纯01背包的问题,都是01背包应用方面的题目, 这样其实是没有从底向上去思考,而是习惯性想到了背包,那么暴力的解法应该是怎么样的呢? -每一件物品其实只有两个状态,取或者不取,所以可以使用回溯法搜索出所有的情况,那么时间复杂度就是$O(2^n)$,这里的n表示物品数量。 +每一件物品其实只有两个状态,取或者不取,所以可以使用回溯法搜索出所有的情况,那么时间复杂度就是$o(2^n)$,这里的n表示物品数量。 **所以暴力的解法是指数级别的时间复杂度。进而才需要动态规划的解法来进行优化!** @@ -109,7 +110,7 @@ for (int j = 0 ; j < weight[0]; j++) { // 当然这一步,如果把dp数组 dp[0][j] = 0; } // 正序遍历 -for (int j = weight[0]; j <= bagWeight; j++) { +for (int j = weight[0]; j <= bagweight; j++) { dp[0][j] = value[0]; } ``` @@ -135,8 +136,8 @@ dp[0][j] 和 dp[i][0] 都已经初始化了,那么其他下标应该初始化 ``` // 初始化 dp -vector> dp(weight.size(), vector(bagWeight + 1, 0)); -for (int j = weight[0]; j <= bagWeight; j++) { +vector> dp(weight.size(), vector(bagweight + 1, 0)); +for (int j = weight[0]; j <= bagweight; j++) { dp[0][j] = value[0]; } @@ -160,7 +161,7 @@ for (int j = weight[0]; j <= bagWeight; j++) { ``` // weight数组的大小 就是物品个数 for(int i = 1; i < weight.size(); i++) { // 遍历物品 - for(int j = 0; j <= bagWeight; j++) { // 遍历背包容量 + for(int j = 0; j <= bagweight; j++) { // 遍历背包容量 if (j < weight[i]) dp[i][j] = dp[i - 1][j]; else dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]); @@ -174,7 +175,7 @@ for(int i = 1; i < weight.size(); i++) { // 遍历物品 ``` // weight数组的大小 就是物品个数 -for(int j = 0; j <= bagWeight; j++) { // 遍历背包容量 +for(int j = 0; j <= bagweight; j++) { // 遍历背包容量 for(int i = 1; i < weight.size(); i++) { // 遍历物品 if (j < weight[i]) dp[i][j] = dp[i - 1][j]; else dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]); @@ -219,32 +220,32 @@ dp[i-1][j]和dp[i - 1][j - weight[i]] 都在dp[i][j]的左上角方向(包括 主要就是自己没有动手推导一下dp数组的演变过程,如果推导明白了,代码写出来就算有问题,只要把dp数组打印出来,对比一下和自己推导的有什么差异,很快就可以发现问题了。 -## 完整C++测试代码 +## 完整c++测试代码 -```CPP +```cpp void test_2_wei_bag_problem1() { vector weight = {1, 3, 4}; vector value = {15, 20, 30}; - int bagWeight = 4; + int bagweight = 4; // 二维数组 - vector> dp(weight.size(), vector(bagWeight + 1, 0)); + vector> dp(weight.size(), vector(bagweight + 1, 0)); // 初始化 - for (int j = weight[0]; j <= bagWeight; j++) { + for (int j = weight[0]; j <= bagweight; j++) { dp[0][j] = value[0]; } // weight数组的大小 就是物品个数 for(int i = 1; i < weight.size(); i++) { // 遍历物品 - for(int j = 0; j <= bagWeight; j++) { // 遍历背包容量 + for(int j = 0; j <= bagweight; j++) { // 遍历背包容量 if (j < weight[i]) dp[i][j] = dp[i - 1][j]; else dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]); } } - cout << dp[weight.size() - 1][bagWeight] << endl; + cout << dp[weight.size() - 1][bagweight] << endl; } int main() { @@ -267,48 +268,45 @@ int main() { ## 其他语言版本 -Java: +### java ```java - public static void main(String[] args) { + public static void main(string[] args) { int[] weight = {1, 3, 4}; int[] value = {15, 20, 30}; - int bagSize = 4; - testWeightBagProblem(weight, value, bagSize); + int bagsize = 4; + testweightbagproblem(weight, value, bagsize); } - public static void testWeightBagProblem(int[] weight, int[] value, int bagSize){ - int wLen = weight.length, value0 = 0; + public static void testweightbagproblem(int[] weight, int[] value, int bagsize){ + int wlen = weight.length, value0 = 0; //定义dp数组:dp[i][j]表示背包容量为j时,前i个物品能获得的最大价值 - int[][] dp = new int[wLen + 1][bagSize + 1]; + int[][] dp = new int[wlen + 1][bagsize + 1]; //初始化:背包容量为0时,能获得的价值都为0 - for (int i = 0; i <= wLen; i++){ + for (int i = 0; i <= wlen; i++){ dp[i][0] = value0; } //遍历顺序:先遍历物品,再遍历背包容量 - for (int i = 1; i <= wLen; i++){ - for (int j = 1; j <= bagSize; j++){ + for (int i = 1; i <= wlen; i++){ + for (int j = 1; j <= bagsize; j++){ if (j < weight[i - 1]){ dp[i][j] = dp[i - 1][j]; }else{ - dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight[i - 1]] + value[i - 1]); + dp[i][j] = math.max(dp[i - 1][j], dp[i - 1][j - weight[i - 1]] + value[i - 1]); } } } //打印dp数组 - for (int i = 0; i <= wLen; i++){ - for (int j = 0; j <= bagSize; j++){ - System.out.print(dp[i][j] + " "); + for (int i = 0; i <= wlen; i++){ + for (int j = 0; j <= bagsize; j++){ + system.out.print(dp[i][j] + " "); } - System.out.print("\n"); + system.out.print("\n"); } } ``` - - - -Python: +### python ```python def test_2_wei_bag_problem1(bag_size, weight, value) -> int: rows, cols = len(weight), bag_size + 1 @@ -343,26 +341,26 @@ if __name__ == "__main__": ``` -Go: +### go ```go -func test_2_wei_bag_problem1(weight, value []int, bagWeight int) int { +func test_2_wei_bag_problem1(weight, value []int, bagweight int) int { // 定义dp数组 dp := make([][]int, len(weight)) for i, _ := range dp { - dp[i] = make([]int, bagWeight+1) + dp[i] = make([]int, bagweight+1) } // 初始化 - for j := bagWeight; j >= weight[0]; j-- { + for j := bagweight; j >= weight[0]; j-- { dp[0][j] = dp[0][j-weight[0]] + value[0] } // 递推公式 for i := 1; i < len(weight); i++ { //正序,也可以倒序 - for j := weight[i];j<= bagWeight ; j++ { + for j := weight[i];j<= bagweight ; j++ { dp[i][j] = max(dp[i-1][j], dp[i-1][j-weight[i]]+value[i]) } } - return dp[len(weight)-1][bagWeight] + return dp[len(weight)-1][bagweight] } func max(a,b int) int { @@ -379,19 +377,19 @@ func main() { } ``` -javaScript: +### javascript ```js -function testWeightBagProblem (wight, value, size) { +function testweightbagproblem (wight, value, size) { const len = wight.length, - dp = Array.from({length: len + 1}).map( - () => Array(size + 1).fill(0) + dp = array.from({length: len + 1}).map( + () => array(size + 1).fill(0) ); for(let i = 1; i <= len; i++) { for(let j = 0; j <= size; j++) { if(wight[i - 1] <= j) { - dp[i][j] = Math.max( + dp[i][j] = math.max( dp[i - 1][j], value[i - 1] + dp[i - 1][j - wight[i - 1]] ) From e4537379854fc4943f7d0a48df9168dd647f8ba8 Mon Sep 17 00:00:00 2001 From: zhangjiong Date: Mon, 17 Jan 2022 15:17:23 +0800 Subject: [PATCH 023/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200018.=E5=9B=9B?= =?UTF-8?q?=E6=95=B0=E4=B9=8B=E5=92=8C=20C#=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0018.四数之和.md | 62 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/problems/0018.四数之和.md b/problems/0018.四数之和.md index b94ebeef..0a04cd68 100644 --- a/problems/0018.四数之和.md +++ b/problems/0018.四数之和.md @@ -403,5 +403,67 @@ func fourSum(_ nums: [Int], _ target: Int) -> [[Int]] { } ``` +C#: +```csharp +public class Solution +{ + public IList> FourSum(int[] nums, int target) + { + var result = new List>(); + + Array.Sort(nums); + + for (int i = 0; i < nums.Length - 3; i++) + { + int n1 = nums[i]; + if (i > 0 && n1 == nums[i - 1]) + continue; + + for (int j = i + 1; j < nums.Length - 2; j++) + { + int n2 = nums[j]; + if (j > i + 1 && n2 == nums[j - 1]) + continue; + + int left = j + 1; + int right = nums.Length - 1; + + while (left < right) + { + int n3 = nums[left]; + int n4 = nums[right]; + int sum = n1 + n2 + n3 + n4; + + if (sum > target) + { + right--; + } + else if (sum < target) + { + left++; + } + else + { + result.Add(new List { n1, n2, n3, n4 }); + + while (left < right && nums[left] == n3) + { + left++; + } + + while (left < right && nums[right] == n4) + { + right--; + } + } + } + } + } + + return result; + } +} +``` + -----------------------
From d941915829f122e717190d3712d1fba7b3fbde32 Mon Sep 17 00:00:00 2001 From: chengleqi Date: Mon, 17 Jan 2022 22:07:48 +0800 Subject: [PATCH 024/328] =?UTF-8?q?update=200051.N=E7=9A=87=E5=90=8E.md=20?= =?UTF-8?q?Go=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0051.N皇后.md | 109 ++++++++++++++++++----------------------- 1 file changed, 48 insertions(+), 61 deletions(-) diff --git a/problems/0051.N皇后.md b/problems/0051.N皇后.md index 51415e88..7eb0d7a0 100644 --- a/problems/0051.N皇后.md +++ b/problems/0051.N皇后.md @@ -346,69 +346,56 @@ class Solution { ### Go ```Go -import "strings" -var res [][]string - -func isValid(board [][]string, row, col int) (res bool){ - n := len(board) - for i:=0; i < row; i++ { - if board[i][col] == "Q" { - return false - } - } - for i := 0; i < n; i++{ - if board[row][i] == "Q" { - return false - } - } - - for i ,j := row, col; i >= 0 && j >=0 ; i, j = i - 1, j- 1{ - if board[i][j] == "Q"{ - return false - } - } - for i, j := row, col; i >=0 && j < n; i,j = i-1, j+1 { - if board[i][j] == "Q" { - return false - } - } - return true -} - -func backtrack(board [][]string, row int) { - size := len(board) - if row == size{ - temp := make([]string, size) - for i := 0; i= 0 && j >= 0; i, j = i-1, j-1 { + if chessboard[i][j] == "Q" { + return false + } + } + for i, j := row-1, col+1; i >= 0 && j < n; i, j = i-1, j+1 { + if chessboard[i][j] == "Q" { + return false + } + } + return true } ``` ### Javascript From a2ac3fa4310f001758f6e08d8874164932ca4f04 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Tue, 18 Jan 2022 13:00:33 +0800 Subject: [PATCH 025/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880151.?= =?UTF-8?q?=E7=BF=BB=E8=BD=AC=E5=AD=97=E7=AC=A6=E4=B8=B2=E9=87=8C=E7=9A=84?= =?UTF-8?q?=E5=8D=95=E8=AF=8D.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typesc?= =?UTF-8?q?ript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0151.翻转字符串里的单词.md | 59 +++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/problems/0151.翻转字符串里的单词.md b/problems/0151.翻转字符串里的单词.md index 48324cd9..fc25c718 100644 --- a/problems/0151.翻转字符串里的单词.md +++ b/problems/0151.翻转字符串里的单词.md @@ -553,6 +553,65 @@ function reverse(strArr, start, end) { } ``` +TypeScript: + +```typescript +function reverseWords(s: string): string { + /** Utils **/ + // 删除多余空格, 如' hello world ' => 'hello world' + function delExtraSpace(arr: string[]): void { + let left: number = 0, + right: number = 0, + length: number = arr.length; + while (right < length && arr[right] === ' ') { + right++; + } + while (right < length) { + if (arr[right] === ' ' && arr[right - 1] === ' ') { + right++; + continue; + } + arr[left++] = arr[right++]; + } + if (arr[left - 1] === ' ') { + arr.length = left - 1; + } else { + arr.length = left; + } + } + // 翻转字符串,如:'hello' => 'olleh' + function reverseWords(strArr: string[], start: number, end: number) { + let temp: string; + while (start < end) { + temp = strArr[start]; + strArr[start] = strArr[end]; + strArr[end] = temp; + start++; + end--; + } + } + + /** Main code **/ + let strArr: string[] = s.split(''); + delExtraSpace(strArr); + let length: number = strArr.length; + // 翻转整个字符串 + reverseWords(strArr, 0, length - 1); + let start: number = 0, + end: number = 0; + while (start < length) { + end = start; + while (strArr[end] !== ' ' && end < length) { + end++; + } + // 翻转单个单词 + reverseWords(strArr, start, end - 1); + start = end + 1; + } + return strArr.join(''); +}; +``` + Swift: ```swift From 3d0ce431d83ac814ab8479d9392c6a6e5e022366 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=81=E5=AE=A2=E5=AD=A6=E4=BC=9F?= Date: Tue, 18 Jan 2022 13:18:36 +0800 Subject: [PATCH 026/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20110.=E5=B9=B3?= =?UTF-8?q?=E8=A1=A1=E4=BA=8C=E5=8F=89=E6=A0=91=20Swift=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0110.平衡二叉树.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/problems/0110.平衡二叉树.md b/problems/0110.平衡二叉树.md index c0914f05..9d43407a 100644 --- a/problems/0110.平衡二叉树.md +++ b/problems/0110.平衡二叉树.md @@ -730,5 +730,33 @@ bool isBalanced(struct TreeNode* root){ } ``` +## Swift: + +>递归 +```swift +func isBalanced(_ root: TreeNode?) -> Bool { + // -1 已经不是平衡二叉树 + return getHeight(root) == -1 ? false : true +} +func getHeight(_ root: TreeNode?) -> Int { + guard let root = root else { + return 0 + } + let leftHeight = getHeight(root.left) + if leftHeight == -1 { + return -1 + } + let rightHeight = getHeight(root.right) + if rightHeight == -1 { + return -1 + } + if abs(leftHeight - rightHeight) > 1 { + return -1 + } else { + return 1 + max(leftHeight, rightHeight) + } +} +``` + -----------------------
From d1a5c9cc908e78ffdb82f5acf6a2ff297254e2fa Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Tue, 18 Jan 2022 13:25:50 +0800 Subject: [PATCH 027/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88=E5=89=91?= =?UTF-8?q?=E6=8C=87Offer58-II.=E5=B7=A6=E6=97=8B=E8=BD=AC=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E4=B8=B2.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typesc?= =?UTF-8?q?ript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/剑指Offer58-II.左旋转字符串.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/problems/剑指Offer58-II.左旋转字符串.md b/problems/剑指Offer58-II.左旋转字符串.md index c391d661..2fbd2888 100644 --- a/problems/剑指Offer58-II.左旋转字符串.md +++ b/problems/剑指Offer58-II.左旋转字符串.md @@ -209,6 +209,31 @@ var reverseLeftWords = function(s, n) { }; ``` +TypeScript: + +```typescript +function reverseLeftWords(s: string, n: number): string { + /** Utils */ + function reverseWords(strArr: string[], start: number, end: number): void { + let temp: string; + while (start < end) { + temp = strArr[start]; + strArr[start] = strArr[end]; + strArr[end] = temp; + start++; + end--; + } + } + /** Main code */ + let strArr: string[] = s.split(''); + let length: number = strArr.length; + reverseWords(strArr, 0, length - 1); + reverseWords(strArr, 0, length - n - 1); + reverseWords(strArr, length - n, length - 1); + return strArr.join(''); +}; +``` + Swift: ```swift From 76893360a9bc77a61ac0f620441680f4ba56a3d9 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Tue, 18 Jan 2022 13:30:39 +0800 Subject: [PATCH 028/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88=E5=89=91?= =?UTF-8?q?=E6=8C=87Offer58-II.=E5=B7=A6=E6=97=8B=E8=BD=AC=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E4=B8=B2.md=EF=BC=89=EF=BC=9AJS=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=96=B0=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/剑指Offer58-II.左旋转字符串.md | 30 +++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/problems/剑指Offer58-II.左旋转字符串.md b/problems/剑指Offer58-II.左旋转字符串.md index 2fbd2888..61391274 100644 --- a/problems/剑指Offer58-II.左旋转字符串.md +++ b/problems/剑指Offer58-II.左旋转字符串.md @@ -209,6 +209,36 @@ var reverseLeftWords = function(s, n) { }; ``` +版本二(在原字符串上操作): + +```js +/** + * @param {string} s + * @param {number} n + * @return {string} + */ +var reverseLeftWords = function (s, n) { + /** Utils */ + function reverseWords(strArr, start, end) { + let temp; + while (start < end) { + temp = strArr[start]; + strArr[start] = strArr[end]; + strArr[end] = temp; + start++; + end--; + } + } + /** Main code */ + let strArr = s.split(''); + let length = strArr.length; + reverseWords(strArr, 0, length - 1); + reverseWords(strArr, 0, length - n - 1); + reverseWords(strArr, length - n, length - 1); + return strArr.join(''); +}; +``` + TypeScript: ```typescript From 5a3be18f127f97bce75a45e473381d1fe3206a94 Mon Sep 17 00:00:00 2001 From: leeeeeeewii <54872662+leeeeeeewii@users.noreply.github.com> Date: Wed, 19 Jan 2022 22:18:56 +0800 Subject: [PATCH 029/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A00844.=E6=AF=94?= =?UTF-8?q?=E8=BE=83=E5=90=AB=E9=80=80=E6=A0=BC=E7=9A=84=E5=AD=97=E7=AC=A6?= =?UTF-8?q?=E4=B8=B2=20python=20go=E5=8F=8C=E6=8C=87=E9=92=88=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0844.比较含退格的字符串.md | 81 +++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/problems/0844.比较含退格的字符串.md b/problems/0844.比较含退格的字符串.md index 5d629a8c..00d52e42 100644 --- a/problems/0844.比较含退格的字符串.md +++ b/problems/0844.比较含退格的字符串.md @@ -205,6 +205,42 @@ class Solution: return self.get_string(s) == self.get_string(t) pass ``` +双指针 +```python +class Solution: + def backspaceCompare(self, s: str, t: str) -> bool: + s_index, t_index = len(s) - 1, len(t) - 1 + s_backspace, t_backspace = 0, 0 # 记录s,t的#数量 + while s_index >= 0 or t_index >= 0: # 使用or,以防长度不一致 + while s_index >= 0: # 从后向前,消除s的# + if s[s_index] == '#': + s_index -= 1 + s_backspace += 1 + else: + if s_backspace > 0: + s_index -= 1 + s_backspace -= 1 + else: + break + while t_index >= 0: # 从后向前,消除t的# + if t[t_index] == '#': + t_index -= 1 + t_backspace += 1 + else: + if t_backspace > 0: + t_index -= 1 + t_backspace -= 1 + else: + break + if s_index >= 0 and t_index >= 0: # 后半部分#消除完了,接下来比较当前位的值 + if s[s_index] != t[t_index]: + return False + elif s_index >= 0 or t_index >= 0: # 一个字符串找到了待比较的字符,另一个没有,返回False + return False + s_index -= 1 + t_index -= 1 + return True +``` ### Go @@ -226,6 +262,51 @@ func backspaceCompare(s string, t string) bool { return getString(s) == getString(t) } +``` +双指针 +```go +func backspaceCompare(s string, t string) bool { + s_index, t_index := len(s) - 1, len(t) - 1 + s_backspace, t_backspace := 0, 0 // 记录s,t的#数量 + for s_index >= 0 || t_index >= 0 { // 使用or,以防长度不一致 + for s_index >= 0 { // 从后向前,消除s的# + if s[s_index] == '#' { + s_index-- + s_backspace++ + } else { + if s_backspace > 0 { + s_index-- + s_backspace-- + } else { + break + } + } + } + for t_index >= 0 { // 从后向前,消除t的# + if t[t_index] == '#' { + t_index-- + t_backspace++ + } else { + if t_backspace > 0 { + t_index-- + t_backspace-- + } else { + break + } + } + } + if s_index >= 0 && t_index >= 0 { // 后半部分#消除完了,接下来比较当前位的值 + if s[s_index] != t[t_index] { + return false + } + } else if s_index >= 0 || t_index >= 0 { // 一个字符串找到了待比较的字符,另一个没有,返回false + return false + } + s_index-- + t_index-- + } + return true +} ``` ### JavaScript From da4f5de90905e87e6804ca6c172750c9fc5e4370 Mon Sep 17 00:00:00 2001 From: leeeeeeewii <54872662+leeeeeeewii@users.noreply.github.com> Date: Wed, 19 Jan 2022 22:32:28 +0800 Subject: [PATCH 030/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A00054.=E8=9E=BA?= =?UTF-8?q?=E6=97=8B=E7=9F=A9=E9=98=B5=20python=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0054.螺旋矩阵.md | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/problems/0054.螺旋矩阵.md b/problems/0054.螺旋矩阵.md index 3f85c607..ccf6f471 100644 --- a/problems/0054.螺旋矩阵.md +++ b/problems/0054.螺旋矩阵.md @@ -131,7 +131,46 @@ public: * [59.螺旋矩阵II](https://leetcode-cn.com/problems/spiral-matrix-ii/) * [剑指Offer 29.顺时针打印矩阵](https://leetcode-cn.com/problems/shun-shi-zhen-da-yin-ju-zhen-lcof/) +## 其他语言版本 +Python: +```python +class Solution: + def spiralOrder(self, matrix: List[List[int]]) -> List[int]: + m, n = len(matrix), len(matrix[0]) + left, right, up, down = 0, n - 1, 0, m - 1 # 定位四个方向的边界,闭区间 + res = [] + + while True: + for i in range(left, right + 1): # 上边,从左到右 + res.append(matrix[up][i]) + up += 1 # 上边界下移 + if len(res) >= m * n: # 判断是否已经遍历完 + break + + for i in range(up, down + 1): # 右边,从上到下 + res.append(matrix[i][right]) + right -= 1 # 右边界左移 + + if len(res) >= m * n: + break + + for i in range(right, left - 1, -1): # 下边,从右到左 + res.append(matrix[down][i]) + down -= 1 # 下边界上移 + + if len(res) >= m * n: + break + + for i in range(down, up - 1, -1): # 左边,从下到上 + res.append(matrix[i][left]) + left += 1 # 左边界右移 + + if len(res) >= m * n: + break + + return res +``` -----------------------
From 850939e40745fb6cf03c056caf0dbb88cae620ec Mon Sep 17 00:00:00 2001 From: leeeeeeewii <54872662+leeeeeeewii@users.noreply.github.com> Date: Wed, 19 Jan 2022 22:48:45 +0800 Subject: [PATCH 031/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=93=BE=E8=A1=A8?= =?UTF-8?q?=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80=20python=20go=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/链表理论基础.md | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/problems/链表理论基础.md b/problems/链表理论基础.md index 109aa1ed..a4fefa2b 100644 --- a/problems/链表理论基础.md +++ b/problems/链表理论基础.md @@ -195,10 +195,20 @@ class ListNode { ``` Python: - +```python +class ListNode: + def __init__(self, val, next=None): + self.val = val + self.next = next +``` Go: - +```go +type ListNode struct { + Val int + Next *ListNode +} +``` From b124befd1263689d1078a3417cd10cbf5ce2aebe Mon Sep 17 00:00:00 2001 From: chenhaoran14 <2718827494@qq.com> Date: Thu, 20 Jan 2022 01:15:23 +0800 Subject: [PATCH 032/328] =?UTF-8?q?=E5=AF=B9Java=E7=9A=84=E5=A4=A7?= =?UTF-8?q?=E9=A1=B6=E5=A0=86=E5=92=8C=E5=B0=8F=E9=A1=B6=E5=A0=86=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E8=BF=9B=E8=A1=8C=E4=BA=86=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0347.前K个高频元素.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/0347.前K个高频元素.md b/problems/0347.前K个高频元素.md index 0b8fd2d7..8bd774e9 100644 --- a/problems/0347.前K个高频元素.md +++ b/problems/0347.前K个高频元素.md @@ -142,7 +142,7 @@ class Solution { Set> entries = map.entrySet(); // 根据map的value值正序排,相当于一个小顶堆 - PriorityQueue> queue = new PriorityQueue<>((o1, o2) -> o2.getValue() - o1.getValue()); + PriorityQueue> queue = new PriorityQueue<>((o1, o2) -> o1.getValue() - o2.getValue()); for (Map.Entry entry : entries) { queue.offer(entry); if (queue.size() > k) { From baff8206d5a6bbb0a66b0db938fca36139bd0e10 Mon Sep 17 00:00:00 2001 From: weiting-cn <2254912@qq.com> Date: Thu, 20 Jan 2022 11:36:17 +0800 Subject: [PATCH 033/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20(0583.=E4=B8=A4?= =?UTF-8?q?=E4=B8=AA=E5=AD=97=E7=AC=A6=E4=B8=B2=E7=9A=84=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E6=93=8D=E4=BD=9C.md)=20:=20=E5=A2=9E=E5=8A=A0=E8=A7=A3?= =?UTF-8?q?=E9=A2=98=E6=80=9D=E8=B7=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0583.两个字符串的删除操作.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/problems/0583.两个字符串的删除操作.md b/problems/0583.两个字符串的删除操作.md index d2f7d84b..53c1a125 100644 --- a/problems/0583.两个字符串的删除操作.md +++ b/problems/0583.两个字符串的删除操作.md @@ -18,6 +18,8 @@ ## 思路 +### 动态规划一 + 本题和[动态规划:115.不同的子序列](https://programmercarl.com/0115.不同的子序列.html)相比,其实就是两个字符串都可以删除了,情况虽说复杂一些,但整体思路是不变的。 这次是两个字符串可以相互删了,这种题目也知道用动态规划的思路来解,动规五部曲,分析如下: @@ -98,6 +100,29 @@ public: ``` +### 动态规划二 + +本题和[动态规划:1143.最长公共子序列](https://programmercarl.com/1143.最长公共子序列.html)基本相同,只要求出两个字符串的最长公共子序列长度即可,那么除了最长公共子序列之外的字符都是必须删除的,最后用两个字符串的总长度减去两个最长公共子序列的长度就是删除的最少步数。 + +代码如下: + +```CPP +class Solution { +public: + int minDistance(string word1, string word2) { + vector> dp(word1.size()+1, vector(word2.size()+1, 0)); + for (int i=1; i<=word1.size(); i++){ + for (int j=1; j<=word2.size(); j++){ + if (word1[i-1] == word2[j-1]) dp[i][j] = dp[i-1][j-1] + 1; + else dp[i][j] = max(dp[i-1][j], dp[i][j-1]); + } + } + return word1.size()+word2.size()-dp[word1.size()][word2.size()]*2; + } +}; + +``` + ## 其他语言版本 From 43eb0269d3dbbf47794eeee8690bcebae3d523db Mon Sep 17 00:00:00 2001 From: chenhaoran14 <2718827494@qq.com> Date: Thu, 20 Jan 2022 12:04:49 +0800 Subject: [PATCH 034/328] =?UTF-8?q?=E5=AF=B9Java=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=89=8D=E5=BA=8F=E6=8E=92=E5=88=97=E7=9A=84=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/二叉树的递归遍历.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/problems/二叉树的递归遍历.md b/problems/二叉树的递归遍历.md index 45b576e7..4beed650 100644 --- a/problems/二叉树的递归遍历.md +++ b/problems/二叉树的递归遍历.md @@ -116,19 +116,19 @@ Java: ```Java // 前序遍历·递归·LC144_二叉树的前序遍历 class Solution { - ArrayList preOrderReverse(TreeNode root) { - ArrayList result = new ArrayList(); - preOrder(root, result); + public List preorderTraversal(TreeNode root) { + List result = new ArrayList(); + preorder(root, result); return result; } - void preOrder(TreeNode root, ArrayList result) { + public void preorder(TreeNode root, List result) { if (root == null) { return; } - result.add(root.val); // 注意这一句 - preOrder(root.left, result); - preOrder(root.right, result); + result.add(root.val); + preorder(root.left, result); + preorder(root.right, result); } } // 中序遍历·递归·LC94_二叉树的中序遍历 From e0c6492d6e141d8ff20a1bd2a2cc4d0337b88286 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Thu, 20 Jan 2022 14:56:16 +0800 Subject: [PATCH 035/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880028.?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0strStr.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0028.实现strStr.md | 77 +++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/problems/0028.实现strStr.md b/problems/0028.实现strStr.md index f0b56719..5f1fa137 100644 --- a/problems/0028.实现strStr.md +++ b/problems/0028.实现strStr.md @@ -929,6 +929,83 @@ var strStr = function (haystack, needle) { }; ``` +TypeScript版本: + +> 前缀表统一减一 + +```typescript +function strStr(haystack: string, needle: string): number { + function getNext(str: string): number[] { + let next: number[] = []; + let j: number = -1; + next[0] = j; + for (let i = 1, length = str.length; i < length; i++) { + while (j >= 0 && str[i] !== str[j + 1]) { + j = next[j]; + } + if (str[i] === str[j + 1]) { + j++; + } + next[i] = j; + } + return next; + } + if (needle.length === 0) return 0; + let next: number[] = getNext(needle); + let j: number = -1; + for (let i = 0, length = haystack.length; i < length; i++) { + while (j >= 0 && haystack[i] !== needle[j + 1]) { + j = next[j]; + } + if (haystack[i] === needle[j + 1]) { + if (j === needle.length - 2) { + return i - j - 1; + } + j++; + } + } + return -1; +}; +``` + +> 前缀表不减一 + +```typescript +// 不减一版本 +function strStr(haystack: string, needle: string): number { + function getNext(str: string): number[] { + let next: number[] = []; + let j: number = 0; + next[0] = j; + for (let i = 1, length = str.length; i < length; i++) { + while (j > 0 && str[i] !== str[j]) { + j = next[j - 1]; + } + if (str[i] === str[j]) { + j++; + } + next[i] = j; + } + return next; + } + if (needle.length === 0) return 0; + let next: number[] = getNext(needle); + let j: number = 0; + for (let i = 0, length = haystack.length; i < length; i++) { + while (j > 0 && haystack[i] !== needle[j]) { + j = next[j - 1]; + } + if (haystack[i] === needle[j]) { + if (j === needle.length - 1) { + return i - j; + } + j++; + } + } + return -1; +} +``` + Swift 版本 > 前缀表统一减一 From 59c95ff24d60ec7809aa80c632b3728291892077 Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Thu, 20 Jan 2022 08:29:02 +0000 Subject: [PATCH 036/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200343.=E6=95=B4?= =?UTF-8?q?=E6=95=B0=E6=8B=86=E5=88=86.md=20C=E8=AF=AD=E8=A8=80=E8=A7=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0343.整数拆分.md | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/problems/0343.整数拆分.md b/problems/0343.整数拆分.md index 5d11f670..9882c6ea 100644 --- a/problems/0343.整数拆分.md +++ b/problems/0343.整数拆分.md @@ -271,5 +271,40 @@ var integerBreak = function(n) { }; ``` +C: +```c +//初始化DP数组 +int *initDP(int num) { + int* dp = (int*)malloc(sizeof(int) * (num + 1)); + int i; + for(i = 0; i < num + 1; ++i) { + dp[i] = 0; + } + return dp; +} + +//取三数最大值 +int max(int num1, int num2, int num3) { + int tempMax = num1 > num2 ? num1 : num2; + return tempMax > num3 ? tempMax : num3; +} + +int integerBreak(int n){ + int *dp = initDP(n); + //初始化dp[2]为1 + dp[2] = 1; + + int i; + for(i = 3; i <= n; ++i) { + int j; + for(j = 1; j < i - 1; ++j) { + //取得上次循环:dp[i],原数相乘,或j*dp[]i-j] 三数中的最大值 + dp[i] = max(dp[i], j * (i - j), j * dp[i - j]); + } + } + return dp[n]; +} +``` + -----------------------
From 7aba93c8e1bbb3f623c1f67f9f2d7f794aaefd78 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Thu, 20 Jan 2022 17:15:09 +0800 Subject: [PATCH 037/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880459.?= =?UTF-8?q?=E9=87=8D=E5=A4=8D=E7=9A=84=E5=AD=90=E5=AD=97=E7=AC=A6=E4=B8=B2?= =?UTF-8?q?.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0459.重复的子字符串.md | 58 +++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/problems/0459.重复的子字符串.md b/problems/0459.重复的子字符串.md index 9c74f4a7..ccfb485c 100644 --- a/problems/0459.重复的子字符串.md +++ b/problems/0459.重复的子字符串.md @@ -361,7 +361,65 @@ var repeatedSubstringPattern = function (s) { }; ``` +TypeScript: +> 前缀表统一减一 + +```typescript +function repeatedSubstringPattern(s: string): boolean { + function getNext(str: string): number[] { + let next: number[] = []; + let j: number = -1; + next[0] = j; + for (let i = 1, length = str.length; i < length; i++) { + while (j >= 0 && str[i] !== str[j + 1]) { + j = next[j]; + } + if (str[i] === str[j + 1]) { + j++; + } + next[i] = j; + } + return next; + } + + let next: number[] = getNext(s); + let sLength: number = s.length; + let nextLength: number = next.length; + let suffixLength: number = next[nextLength - 1] + 1; + if (suffixLength > 0 && sLength % (sLength - suffixLength) === 0) return true; + return false; +}; +``` + +> 前缀表不减一 + +```typescript +function repeatedSubstringPattern(s: string): boolean { + function getNext(str: string): number[] { + let next: number[] = []; + let j: number = 0; + next[0] = j; + for (let i = 1, length = str.length; i < length; i++) { + while (j > 0 && str[i] !== str[j]) { + j = next[j - 1]; + } + if (str[i] === str[j]) { + j++; + } + next[i] = j; + } + return next; + } + + let next: number[] = getNext(s); + let sLength: number = s.length; + let nextLength: number = next.length; + let suffixLength: number = next[nextLength - 1]; + if (suffixLength > 0 && sLength % (sLength - suffixLength) === 0) return true; + return false; +}; +``` -----------------------
From 0e75c5d92e619bffb60a63db4d606a492045b732 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=81=E5=AE=A2=E5=AD=A6=E4=BC=9F?= Date: Thu, 20 Jan 2022 20:32:17 +0800 Subject: [PATCH 038/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20257.=20=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=E7=9A=84=E6=89=80=E6=9C=89=E8=B7=AF=E5=BE=84?= =?UTF-8?q?=20Swift=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0257.二叉树的所有路径.md | 65 +++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/problems/0257.二叉树的所有路径.md b/problems/0257.二叉树的所有路径.md index cb837d87..7b5fc2e9 100644 --- a/problems/0257.二叉树的所有路径.md +++ b/problems/0257.二叉树的所有路径.md @@ -581,7 +581,72 @@ var binaryTreePaths = function(root) { }; ``` +Swift: +> 递归/回溯 +```swift +func binaryTreePaths(_ root: TreeNode?) -> [String] { + var res = [String]() + guard let root = root else { + return res + } + var path = [Int]() + _binaryTreePaths(root, path: &path, res: &res) + return res +} +func _binaryTreePaths(_ root: TreeNode, path: inout [Int], res: inout [String]) { + path.append(root.val) + if root.left == nil && root.right == nil { + var str = "" + for i in 0 ..< path.count - 1 { + str.append("\(path[i])->") + } + str.append("\(path.last!)") + res.append(str) + return + } + if let left = root.left { + _binaryTreePaths(left, path: &path, res: &res) + path.removeLast() + } + if let right = root.right { + _binaryTreePaths(right, path: &path, res: &res) + path.removeLast() + } +} +``` + +> 迭代 +```swift +func binaryTreePaths(_ root: TreeNode?) -> [String] { + var res = [String]() + guard let root = root else { + return res + } + var stackNode = [TreeNode]() + stackNode.append(root) + + var stackStr = [String]() + stackStr.append("\(root.val)") + + while !stackNode.isEmpty { + let node = stackNode.popLast()! + let str = stackStr.popLast()! + if node.left == nil && node.right == nil { + res.append(str) + } + if let left = node.left { + stackNode.append(left) + stackStr.append("\(str)->\(left.val)") + } + if let right = node.right { + stackNode.append(right) + stackStr.append("\(str)->\(right.val)") + } + } + return res +} +``` -----------------------
From 02fd6b8f9a9dc49af1612762c80a439e0a1f5e04 Mon Sep 17 00:00:00 2001 From: YDLIN <1924723909@qq.com> Date: Fri, 21 Jan 2022 10:45:10 +0800 Subject: [PATCH 039/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0257.=20=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=E7=9A=84=E6=89=80=E6=9C=89=E8=B7=AF=E5=BE=84?= =?UTF-8?q?=20Swift=20=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0257.二叉树的所有路径.md | 91 +++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) diff --git a/problems/0257.二叉树的所有路径.md b/problems/0257.二叉树的所有路径.md index cb837d87..9ccd81d8 100644 --- a/problems/0257.二叉树的所有路径.md +++ b/problems/0257.二叉树的所有路径.md @@ -581,6 +581,97 @@ var binaryTreePaths = function(root) { }; ``` +Swift: + +递归法: + +```swift +func binaryTreePaths(_ root: TreeNode?) -> [String] { + var result = Array() + var path = Array() + guard let root = root else { + return result + } + traversal(root, &path, &result) + return result + } + + func traversal(_ cur: TreeNode, _ path: inout Array, _ result: inout Array) { + path.append(cur.val) + // 递归终止条件:到达叶子节点 + if cur.left == nil && cur.right == nil { + var pathString = "" + // 处理 path 前面的元素 + for i in 0.. [String] { + // 保存树的遍历节点 + var treeStack = [TreeNode]() + // 保存遍历路径的节点 + var pathStack = [String]() + // 保存最终路径集合 + var result = [String]() + guard let root = root else { + return result + } + treeStack.append(root) + pathStack.append(String(root.val)) + while !treeStack.isEmpty { + let node = treeStack.removeLast() + let path = pathStack.removeLast() + + // 遇到叶子节点 + if node.left == nil && node.right == nil { + result.append(path) + } + + if let rightNode = node.right { + treeStack.append(rightNode) + let tmp = path + "->" + String(rightNode.val) + pathStack.append(tmp) + } + + if let leftNode = node.left { + treeStack.append(leftNode) + let tmp = path + "->" + String(leftNode.val) + pathStack.append(tmp) + } + } + + return result + } +``` + ----------------------- From d29fa29a87e8e5b2739f5033423cc6666d1ced42 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 21 Jan 2022 14:16:33 +0800 Subject: [PATCH 040/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880232.?= =?UTF-8?q?=E7=94=A8=E6=A0=88=E5=AE=9E=E7=8E=B0=E9=98=9F=E5=88=97.md?= =?UTF-8?q?=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0232.用栈实现队列.md | 37 +++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/problems/0232.用栈实现队列.md b/problems/0232.用栈实现队列.md index 4edba2f2..33ce8114 100644 --- a/problems/0232.用栈实现队列.md +++ b/problems/0232.用栈实现队列.md @@ -348,7 +348,44 @@ MyQueue.prototype.empty = function() { }; ``` +TypeScript: + +```typescript +class MyQueue { + private stackIn: number[] + private stackOut: number[] + constructor() { + this.stackIn = []; + this.stackOut = []; + } + + push(x: number): void { + this.stackIn.push(x); + } + + pop(): number { + if (this.stackOut.length === 0) { + while (this.stackIn.length > 0) { + this.stackOut.push(this.stackIn.pop()!); + } + } + return this.stackOut.pop()!; + } + + peek(): number { + let temp: number = this.pop(); + this.stackOut.push(temp); + return temp; + } + + empty(): boolean { + return this.stackIn.length === 0 && this.stackOut.length === 0; + } +} +``` + Swift: + ```swift class MyQueue { From 1264fa87ac45c189ed9cc9caee88ef627c352e05 Mon Sep 17 00:00:00 2001 From: chengleqi Date: Fri, 21 Jan 2022 14:38:11 +0800 Subject: [PATCH 041/328] =?UTF-8?q?update=200063.=E4=B8=8D=E5=90=8C?= =?UTF-8?q?=E8=B7=AF=E5=BE=84II.md=20Go=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0063.不同路径II.md | 43 +++++++++++++------------------------ 1 file changed, 15 insertions(+), 28 deletions(-) diff --git a/problems/0063.不同路径II.md b/problems/0063.不同路径II.md index 6f405d6a..105b6402 100644 --- a/problems/0063.不同路径II.md +++ b/problems/0063.不同路径II.md @@ -266,46 +266,33 @@ Go: ```go func uniquePathsWithObstacles(obstacleGrid [][]int) int { - m,n:= len(obstacleGrid),len(obstacleGrid[0]) + m, n := len(obstacleGrid), len(obstacleGrid[0]) // 定义一个dp数组 - dp := make([][]int,m) - for i,_ := range dp { - dp[i] = make([]int,n) + dp := make([][]int, m) + for i, _ := range dp { + dp[i] = make([]int, n) } - // 初始化 - for i:=0;i Date: Fri, 21 Jan 2022 17:25:00 +0800 Subject: [PATCH 042/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880225.?= =?UTF-8?q?=E7=94=A8=E9=98=9F=E5=88=97=E5=AE=9E=E7=8E=B0=E6=A0=88.md?= =?UTF-8?q?=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0225.用队列实现栈.md | 73 +++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/problems/0225.用队列实现栈.md b/problems/0225.用队列实现栈.md index fdb544a6..961fad38 100644 --- a/problems/0225.用队列实现栈.md +++ b/problems/0225.用队列实现栈.md @@ -598,7 +598,80 @@ MyStack.prototype.empty = function() { ``` +TypeScript: + +版本一:使用两个队列模拟栈 + +```typescript +class MyStack { + private queue: number[]; + private tempQueue: number[]; + constructor() { + this.queue = []; + this.tempQueue = []; + } + + push(x: number): void { + this.queue.push(x); + } + + pop(): number { + for (let i = 0, length = this.queue.length - 1; i < length; i++) { + this.tempQueue.push(this.queue.shift()!); + } + let res: number = this.queue.pop()!; + let temp: number[] = this.queue; + this.queue = this.tempQueue; + this.tempQueue = temp; + return res; + } + + top(): number { + let res: number = this.pop(); + this.push(res); + return res; + } + + empty(): boolean { + return this.queue.length === 0; + } +} +``` + +版本二:使用一个队列模拟栈 + +```typescript +class MyStack { + private queue: number[]; + constructor() { + this.queue = []; + } + + push(x: number): void { + this.queue.push(x); + } + + pop(): number { + for (let i = 0, length = this.queue.length - 1; i < length; i++) { + this.queue.push(this.queue.shift()!); + } + return this.queue.shift()!; + } + + top(): number { + let res: number = this.pop(); + this.push(res); + return res; + } + + empty(): boolean { + return this.queue.length === 0; + } +} +``` + Swift + ```Swift // 定义一个队列数据结构 class Queue { From f54af7ff39bb3c2d268eb1daff3bd2f5c8ca8b72 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 21 Jan 2022 20:57:58 +0800 Subject: [PATCH 043/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880020.?= =?UTF-8?q?=E6=9C=89=E6=95=88=E7=9A=84=E6=8B=AC=E5=8F=B7.md=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0020.有效的括号.md | 52 +++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/problems/0020.有效的括号.md b/problems/0020.有效的括号.md index 9e4046d4..95d62e42 100644 --- a/problems/0020.有效的括号.md +++ b/problems/0020.有效的括号.md @@ -283,8 +283,60 @@ var isValid = function(s) { }; ``` +TypeScript: + +版本一:普通版 + +```typescript +function isValid(s: string): boolean { + let helperStack: string[] = []; + for (let i = 0, length = s.length; i < length; i++) { + let x: string = s[i]; + switch (x) { + case '(': + helperStack.push(')'); + break; + case '[': + helperStack.push(']'); + break; + case '{': + helperStack.push('}'); + break; + default: + if (helperStack.pop() !== x) return false; + break; + } + } + return helperStack.length === 0; +}; +``` + +版本二:优化版 + +```typescript +function isValid(s: string): boolean { + type BracketMap = { + [index: string]: string; + } + let helperStack: string[] = []; + let bracketMap: BracketMap = { + '(': ')', + '[': ']', + '{': '}' + } + for (let i of s) { + if (bracketMap.hasOwnProperty(i)) { + helperStack.push(bracketMap[i]); + } else if (i !== helperStack.pop()) { + return false; + } + } + return helperStack.length === 0; +}; +``` Swift + ```swift func isValid(_ s: String) -> Bool { var stack = [String.Element]() From 61b0ddef35b07f7b459d9bfac774691bcf6cec98 Mon Sep 17 00:00:00 2001 From: coolcty Date: Fri, 21 Jan 2022 17:52:43 +0100 Subject: [PATCH 044/328] =?UTF-8?q?Update=200031.=E4=B8=8B=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E6=8E=92=E5=88=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0031.下一个排列.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/0031.下一个排列.md b/problems/0031.下一个排列.md index 84bf3e60..2219e24d 100644 --- a/problems/0031.下一个排列.md +++ b/problems/0031.下一个排列.md @@ -81,7 +81,7 @@ public: for (int j = nums.size() - 1; j > i; j--) { if (nums[j] > nums[i]) { swap(nums[j], nums[i]); - sort(nums.begin() + i + 1, nums.end()); + reverse(nums.begin() + i + 1, nums.end()); return; } } From 2ec4867125e60381b9ded470a59ad89d0b8401d1 Mon Sep 17 00:00:00 2001 From: YDLIN <1924723909@qq.com> Date: Sat, 22 Jan 2022 10:26:18 +0800 Subject: [PATCH 045/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20404.=20=E5=B7=A6?= =?UTF-8?q?=E5=8F=B6=E5=AD=90=E4=B9=8B=E5=92=8C=20Swift=20=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0404.左叶子之和.md | 48 +++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/problems/0404.左叶子之和.md b/problems/0404.左叶子之和.md index ddbd100e..09272052 100644 --- a/problems/0404.左叶子之和.md +++ b/problems/0404.左叶子之和.md @@ -373,6 +373,54 @@ var sumOfLeftLeaves = function(root) { ``` +## Swift + +**递归法** +```swift +func sumOfLeftLeaves(_ root: TreeNode?) -> Int { + guard let root = root else { + return 0 + } + + let leftValue = sumOfLeftLeaves(root.left) + let rightValue = sumOfLeftLeaves(root.right) + + var midValue: Int = 0 + if root.left != nil && root.left?.left == nil && root.left?.right == nil { + midValue = root.left!.val + } + + let sum = midValue + leftValue + rightValue + return sum +} +``` +**迭代法** +```swift +func sumOfLeftLeaves(_ root: TreeNode?) -> Int { + guard let root = root else { + return 0 + } + + var stack = Array() + stack.append(root) + var sum = 0 + + while !stack.isEmpty { + let lastNode = stack.removeLast() + + if lastNode.left != nil && lastNode.left?.left == nil && lastNode.left?.right == nil { + sum += lastNode.left!.val + } + if let right = lastNode.right { + stack.append(right) + } + if let left = lastNode.left { + stack.append(left) + } + } + return sum +} +``` From 26c7fd202afc2aac492c2db589a3c4af5af3fcf3 Mon Sep 17 00:00:00 2001 From: YDLIN <1924723909@qq.com> Date: Sat, 22 Jan 2022 11:38:28 +0800 Subject: [PATCH 046/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20513.=20=E6=89=BE?= =?UTF-8?q?=E6=A0=91=E5=B7=A6=E4=B8=8B=E8=A7=92=E7=9A=84=E5=80=BC=20Swift?= =?UTF-8?q?=20=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0513.找树左下角的值.md | 68 +++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/problems/0513.找树左下角的值.md b/problems/0513.找树左下角的值.md index 99f42d34..84ed3932 100644 --- a/problems/0513.找树左下角的值.md +++ b/problems/0513.找树左下角的值.md @@ -433,6 +433,74 @@ var findBottomLeftValue = function(root) { }; ``` +## Swift + +递归版本: + +```swift +var maxLen = -1 +var maxLeftValue = 0 +func findBottomLeftValue_2(_ root: TreeNode?) -> Int { + traversal(root, 0) + return maxLeftValue +} + +func traversal(_ root: TreeNode?, _ deep: Int) { + guard let root = root else { + return + } + + if root.left == nil && root.right == nil { + if deep > maxLen { + maxLen = deep + maxLeftValue = root.val + } + return + } + + if root.left != nil { + traversal(root.left, deep + 1) + } + + if root.right != nil { + traversal(root.right, deep + 1) + } + return +} +``` +层序遍历: + +```swift +func findBottomLeftValue(_ root: TreeNode?) -> Int { + guard let root = root else { + return 0 + } + + var queue = [root] + var result = 0 + + while !queue.isEmpty { + let size = queue.count + for i in 0.. Date: Sat, 22 Jan 2022 17:45:40 +0800 Subject: [PATCH 047/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=881047.?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=AD=97=E7=AC=A6=E4=B8=B2=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E6=89=80=E6=9C=89=E7=9B=B8=E9=82=BB=E9=87=8D=E5=A4=8D=E9=A1=B9?= =?UTF-8?q?.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/1047.删除字符串中的所有相邻重复项.md | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/problems/1047.删除字符串中的所有相邻重复项.md b/problems/1047.删除字符串中的所有相邻重复项.md index d6eefd07..9a0bb1c1 100644 --- a/problems/1047.删除字符串中的所有相邻重复项.md +++ b/problems/1047.删除字符串中的所有相邻重复项.md @@ -267,8 +267,32 @@ var removeDuplicates = function(s) { }; ``` +TypeScript: + +```typescript +function removeDuplicates(s: string): string { + const helperStack: string[] = []; + let i: number = 0; + while (i < s.length) { + let top: string = helperStack[helperStack.length - 1]; + if (top === s[i]) { + helperStack.pop(); + } else { + helperStack.push(s[i]); + } + i++; + } + let res: string = ''; + while (helperStack.length > 0) { + res = helperStack.pop() + res; + } + return res; +}; +``` + C: 方法一:使用栈 + ```c char * removeDuplicates(char * s){ //求出字符串长度 From 2b33b45170c22eb4b900bc85ff04ad5ce0a5c2e2 Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Sat, 22 Jan 2022 10:39:07 +0000 Subject: [PATCH 048/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200096.=E4=B8=8D?= =?UTF-8?q?=E5=90=8C=E7=9A=84=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91?= =?UTF-8?q?.md=20C=E8=AF=AD=E8=A8=80=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0096.不同的二叉搜索树.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/problems/0096.不同的二叉搜索树.md b/problems/0096.不同的二叉搜索树.md index d4b8d024..d6f7aca7 100644 --- a/problems/0096.不同的二叉搜索树.md +++ b/problems/0096.不同的二叉搜索树.md @@ -227,7 +227,34 @@ const numTrees =(n) => { }; ``` +C: +```c +//开辟dp数组 +int *initDP(int n) { + int *dp = (int *)malloc(sizeof(int) * (n + 1)); + int i; + for(i = 0; i <= n; ++i) + dp[i] = 0; + return dp; +} +int numTrees(int n){ + //开辟dp数组 + int *dp = initDP(n); + //将dp[0]设为1 + dp[0] = 1; + + int i, j; + for(i = 1; i <= n; ++i) { + for(j = 1; j <= i; ++j) { + //递推公式:dp[i] = d[i] + 根为j时左子树种类个数 * 根为j时右子树种类个数 + dp[i] += dp[j - 1] * dp[i - j]; + } + } + + return dp[n]; +} +``` -----------------------
From 718e67acef29a7f21f7914d0b1e175b2b52a4063 Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Sat, 22 Jan 2022 10:41:09 +0000 Subject: [PATCH 049/328] =?UTF-8?q?=E4=BF=AE=E6=94=B9=200096.=E4=B8=8D?= =?UTF-8?q?=E5=90=8C=E7=9A=84=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91?= =?UTF-8?q?.md=20C=E8=AF=AD=E8=A8=80=E8=A7=A3=E6=B3=95=E6=B3=A8=E9=87=8A?= =?UTF-8?q?=E9=94=99=E5=88=AB=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0096.不同的二叉搜索树.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/0096.不同的二叉搜索树.md b/problems/0096.不同的二叉搜索树.md index d6f7aca7..d334a29c 100644 --- a/problems/0096.不同的二叉搜索树.md +++ b/problems/0096.不同的二叉搜索树.md @@ -247,7 +247,7 @@ int numTrees(int n){ int i, j; for(i = 1; i <= n; ++i) { for(j = 1; j <= i; ++j) { - //递推公式:dp[i] = d[i] + 根为j时左子树种类个数 * 根为j时右子树种类个数 + //递推公式:dp[i] = dp[i] + 根为j时左子树种类个数 * 根为j时右子树种类个数 dp[i] += dp[j - 1] * dp[i - j]; } } From 3fb923694db6cdd6a1b38f16cfcc294bfa415876 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sat, 22 Jan 2022 22:20:24 +0800 Subject: [PATCH 050/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880150.?= =?UTF-8?q?=E9=80=86=E6=B3=A2=E5=85=B0=E8=A1=A8=E8=BE=BE=E5=BC=8F=E6=B1=82?= =?UTF-8?q?=E5=80=BC.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0150.逆波兰表达式求值.md | 65 +++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/problems/0150.逆波兰表达式求值.md b/problems/0150.逆波兰表达式求值.md index f44703f1..f4dad823 100644 --- a/problems/0150.逆波兰表达式求值.md +++ b/problems/0150.逆波兰表达式求值.md @@ -210,6 +210,71 @@ var evalRPN = function(tokens) { }; ``` +TypeScript: + +普通版: + +```typescript +function evalRPN(tokens: string[]): number { + let helperStack: number[] = []; + let temp: number; + let i: number = 0; + while (i < tokens.length) { + let t: string = tokens[i]; + switch (t) { + case '+': + temp = helperStack.pop()! + helperStack.pop()!; + helperStack.push(temp); + break; + case '-': + temp = helperStack.pop()!; + temp = helperStack.pop()! - temp; + helperStack.push(temp); + break; + case '*': + temp = helperStack.pop()! * helperStack.pop()!; + helperStack.push(temp); + break; + case '/': + temp = helperStack.pop()!; + temp = Math.trunc(helperStack.pop()! / temp); + helperStack.push(temp); + break; + default: + helperStack.push(Number(t)); + break; + } + i++; + } + return helperStack.pop()!; +}; +``` + +优化版: + +```typescript +function evalRPN(tokens: string[]): number { + const helperStack: number[] = []; + const operatorMap: Map number> = new Map([ + ['+', (a, b) => a + b], + ['-', (a, b) => a - b], + ['/', (a, b) => Math.trunc(a / b)], + ['*', (a, b) => a * b], + ]); + let a: number, b: number; + for (let t of tokens) { + if (operatorMap.has(t)) { + b = helperStack.pop()!; + a = helperStack.pop()!; + helperStack.push(operatorMap.get(t)!(a, b)); + } else { + helperStack.push(Number(t)); + } + } + return helperStack.pop()!; +}; +``` + python3 ```python From b5becb3291def44a5ddbccda6f6be7ae3266f634 Mon Sep 17 00:00:00 2001 From: chengleqi Date: Sun, 23 Jan 2022 17:23:36 +0800 Subject: [PATCH 051/328] =?UTF-8?q?bug-fix=200494.=E7=9B=AE=E6=A0=87?= =?UTF-8?q?=E5=92=8C.md=20Go=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0494.目标和.md | 43 +++-------------------------------------- 1 file changed, 3 insertions(+), 40 deletions(-) diff --git a/problems/0494.目标和.md b/problems/0494.目标和.md index 1835f498..0faef4a5 100644 --- a/problems/0494.目标和.md +++ b/problems/0494.目标和.md @@ -289,7 +289,7 @@ func findTargetSumWays(nums []int, target int) int { for _, v := range nums { sum += v } - if target > sum { + if abs(target) > sum { return 0 } if (sum+target)%2 == 1 { @@ -311,49 +311,12 @@ func findTargetSumWays(nums []int, target int) int { } return dp[bag] } -``` -> 更新版,上一个跑不通了,因为会存在bag 小于0的情况 -```go -func findTargetSumWays(nums []int, target int) int { - //先转化为数学问题 - //a-b=target - //a+b=sum - //a=(target+sum)/2 - //求出sum - var sum int - for _,value:=range nums{ - sum+=value - } - //如果sum { From b3078ef51c321e386f5900e4f43c3b2c68dd0ca0 Mon Sep 17 00:00:00 2001 From: zhicheng lee <904688436@qq.com> Date: Sun, 23 Jan 2022 22:59:59 +0800 Subject: [PATCH 052/328] =?UTF-8?q?Update=200435.=E6=97=A0=E9=87=8D?= =?UTF-8?q?=E5=8F=A0=E5=8C=BA=E9=97=B4.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新Java版本代码 --- problems/0435.无重叠区间.md | 28 +++++++++++----------------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/problems/0435.无重叠区间.md b/problems/0435.无重叠区间.md index 118360bc..389443d1 100644 --- a/problems/0435.无重叠区间.md +++ b/problems/0435.无重叠区间.md @@ -183,28 +183,22 @@ public: ```java class Solution { public int eraseOverlapIntervals(int[][] intervals) { - if (intervals.length < 2) return 0; - - Arrays.sort(intervals, new Comparator() { - @Override - public int compare(int[] o1, int[] o2) { - if (o1[1] != o2[1]) { - return Integer.compare(o1[1],o2[1]); - } else { - return Integer.compare(o1[0],o2[0]); - } - } + Arrays.sort(intervals, (a, b) -> { + if (a[0] == a[0]) return a[1] - b[1]; + return a[0] - b[0]; }); - int count = 1; - int edge = intervals[0][1]; - for (int i = 1; i < intervals.length; i++) { - if (edge <= intervals[i][0]){ - count ++; //non overlap + 1 + int count = 0; + int edge = Integer.MIN_VALUE; + for (int i = 0; i < intervals.length; i++) { + if (edge <= intervals[i][0]) { edge = intervals[i][1]; + } else { + count++; } } - return intervals.length - count; + + return count; } } ``` From 00728847e17558cda0d76ff87e544b5a0a5e2dfb Mon Sep 17 00:00:00 2001 From: YDLIN <1924723909@qq.com> Date: Mon, 24 Jan 2022 11:36:06 +0800 Subject: [PATCH 053/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200112.=E8=B7=AF?= =?UTF-8?q?=E5=BE=84=E6=80=BB=E5=92=8C=E3=80=810113.=E8=B7=AF=E5=BE=84?= =?UTF-8?q?=E6=80=BB=E5=92=8C=20II=20Swift=20=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0112.路径总和.md | 117 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) diff --git a/problems/0112.路径总和.md b/problems/0112.路径总和.md index 910e57c8..5ec8ffd0 100644 --- a/problems/0112.路径总和.md +++ b/problems/0112.路径总和.md @@ -766,7 +766,124 @@ let pathSum = function(root, targetSum) { }; ``` +## Swift +0112.路径总和 + +**递归** +```swift +func hasPathSum(_ root: TreeNode?, _ targetSum: Int) -> Bool { + guard let root = root else { + return false + } + + return traversal(root, targetSum - root.val) +} + +func traversal(_ cur: TreeNode?, _ count: Int) -> Bool { + if cur?.left == nil && cur?.right == nil && count == 0 { + return true + } + + if cur?.left == nil && cur?.right == nil { + return false + } + + if let leftNode = cur?.left { + if traversal(leftNode, count - leftNode.val) { + return true + } + } + + if let rightNode = cur?.right { + if traversal(rightNode, count - rightNode.val) { + return true + } + } + + return false +} +``` +**迭代** +```swift +func hasPathSum(_ root: TreeNode?, _ targetSum: Int) -> Bool { + guard let root = root else { + return false + } + + var stack = Array<(TreeNode, Int)>() + stack.append((root, root.val)) + + while !stack.isEmpty { + let node = stack.removeLast() + + if node.0.left == nil && node.0.right == nil && targetSum == node.1 { + return true + } + + if let rightNode = node.0.right { + stack.append((rightNode, node.1 + rightNode.val)) + } + + if let leftNode = node.0.left { + stack.append((leftNode, node.1 + leftNode.val)) + } + } + + return false +} +``` + +0113.路径总和 II + +**递归** + +```swift +var result = [[Int]]() +var path = [Int]() +func pathSum(_ root: TreeNode?, _ targetSum: Int) -> [[Int]] { + result.removeAll() + path.removeAll() + guard let root = root else { + return result + } + path.append(root.val) + traversal(root, count: targetSum - root.val) + return result + +} + +func traversal(_ cur: TreeNode?, count: Int) { + var count = count + // 遇到了叶子节点且找到了和为targetSum的路径 + if cur?.left == nil && cur?.right == nil && count == 0 { + result.append(path) + return + } + + // 遇到叶子节点而没有找到合适的边,直接返回 + if cur?.left == nil && cur?.right == nil{ + return + } + + if let leftNode = cur?.left { + path.append(leftNode.val) + count -= leftNode.val + traversal(leftNode, count: count)// 递归 + count += leftNode.val// 回溯 + path.removeLast()// 回溯 + } + + if let rightNode = cur?.right { + path.append(rightNode.val) + count -= rightNode.val + traversal(rightNode, count: count)// 递归 + count += rightNode.val// 回溯 + path.removeLast()// 回溯 + } + return +} +``` From ac9f8c612033d87221e1fc79ce093211a1f5570b Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Mon, 24 Jan 2022 15:51:26 +0800 Subject: [PATCH 054/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880239.?= =?UTF-8?q?=E6=BB=91=E5=8A=A8=E7=AA=97=E5=8F=A3=E6=9C=80=E5=A4=A7=E5=80=BC?= =?UTF-8?q?.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0239.滑动窗口最大值.md | 49 +++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/problems/0239.滑动窗口最大值.md b/problems/0239.滑动窗口最大值.md index d9788f63..6e8039f4 100644 --- a/problems/0239.滑动窗口最大值.md +++ b/problems/0239.滑动窗口最大值.md @@ -418,7 +418,56 @@ var maxSlidingWindow = function (nums, k) { }; ``` +TypeScript: + +```typescript +function maxSlidingWindow(nums: number[], k: number): number[] { + /** 单调递减队列 */ + class MonoQueue { + private queue: number[]; + constructor() { + this.queue = []; + }; + /** 入队:value如果大于队尾元素,则将队尾元素删除,直至队尾元素大于value,或者队列为空 */ + public enqueue(value: number): void { + let back: number | undefined = this.queue[this.queue.length - 1]; + while (back !== undefined && back < value) { + this.queue.pop(); + back = this.queue[this.queue.length - 1]; + } + this.queue.push(value); + }; + /** 出队:只有当队头元素等于value,才出队 */ + public dequeue(value: number): void { + let top: number | undefined = this.top(); + if (top !== undefined && top === value) { + this.queue.shift(); + } + } + public top(): number | undefined { + return this.queue[0]; + } + } + const helperQueue: MonoQueue = new MonoQueue(); + let i: number = 0, + j: number = 0; + let resArr: number[] = []; + while (j < k) { + helperQueue.enqueue(nums[j++]); + } + resArr.push(helperQueue.top()!); + while (j < nums.length) { + helperQueue.enqueue(nums[j]); + helperQueue.dequeue(nums[i]); + resArr.push(helperQueue.top()!); + j++, i++; + } + return resArr; +}; +``` + Swift: + ```Swift /// 双向链表 class DoublyListNode { From a12ad31f46c082f35a88441d65ef322740d12520 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Mon, 24 Jan 2022 16:03:36 +0800 Subject: [PATCH 055/328] =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=880239.?= =?UTF-8?q?=E6=BB=91=E5=8A=A8=E7=AA=97=E5=8F=A3=E6=9C=80=E5=A4=A7=E5=80=BC?= =?UTF-8?q?.md=EF=BC=89=EF=BC=9A=E8=A7=84=E8=8C=83=E5=8C=96js=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0239.滑动窗口最大值.md | 57 +++++++++++++++++++++++---------- 1 file changed, 40 insertions(+), 17 deletions(-) diff --git a/problems/0239.滑动窗口最大值.md b/problems/0239.滑动窗口最大值.md index 6e8039f4..adf3548c 100644 --- a/problems/0239.滑动窗口最大值.md +++ b/problems/0239.滑动窗口最大值.md @@ -395,26 +395,49 @@ func maxSlidingWindow(nums []int, k int) []int { Javascript: ```javascript +/** + * @param {number[]} nums + * @param {number} k + * @return {number[]} + */ var maxSlidingWindow = function (nums, k) { - // 队列数组(存放的是元素下标,为了取值方便) - const q = []; - // 结果数组 - const ans = []; - for (let i = 0; i < nums.length; i++) { - // 若队列不为空,且当前元素大于等于队尾所存下标的元素,则弹出队尾 - while (q.length && nums[i] >= nums[q[q.length - 1]]) { - q.pop(); + class MonoQueue { + queue; + constructor() { + this.queue = []; + } + enqueue(value) { + let back = this.queue[this.queue.length - 1]; + while (back !== undefined && back < value) { + this.queue.pop(); + back = this.queue[this.queue.length - 1]; + } + this.queue.push(value); + } + dequeue(value) { + let front = this.front(); + if (front === value) { + this.queue.shift(); + } + } + front() { + return this.queue[0]; + } } - // 入队当前元素下标 - q.push(i); - // 判断当前最大值(即队首元素)是否在窗口中,若不在便将其出队 - if (q[0] <= i - k) { - q.shift(); + let helperQueue = new MonoQueue(); + let i = 0, j = 0; + let resArr = []; + while (j < k) { + helperQueue.enqueue(nums[j++]); } - // 当达到窗口大小时便开始向结果中添加数据 - if (i >= k - 1) ans.push(nums[q[0]]); - } - return ans; + resArr.push(helperQueue.front()); + while (j < nums.length) { + helperQueue.enqueue(nums[j]); + helperQueue.dequeue(nums[i]); + resArr.push(helperQueue.front()); + i++, j++; + } + return resArr; }; ``` From 9272063cf2627a6334cea807cd3de2e7166da1af Mon Sep 17 00:00:00 2001 From: YDLIN <1924723909@qq.com> Date: Mon, 24 Jan 2022 16:42:47 +0800 Subject: [PATCH 056/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200654.=20=E6=9C=80?= =?UTF-8?q?=E5=A4=A7=E4=BA=8C=E5=8F=89=E6=A0=91=20Swift=20=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0654.最大二叉树.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/problems/0654.最大二叉树.md b/problems/0654.最大二叉树.md index b4679c7d..44c74f89 100644 --- a/problems/0654.最大二叉树.md +++ b/problems/0654.最大二叉树.md @@ -401,6 +401,33 @@ struct TreeNode* constructMaximumBinaryTree(int* nums, int numsSize){ } ``` +## Swift +```swift +func constructMaximumBinaryTree(_ nums: inout [Int]) -> TreeNode? { + return traversal(&nums, 0, nums.count) +} + +func traversal(_ nums: inout [Int], _ left: Int, _ right: Int) -> TreeNode? { + if left >= right { + return nil + } + + var maxValueIndex = left + for i in (left + 1).. nums[maxValueIndex] { + maxValueIndex = i + } + } + + let root = TreeNode(nums[maxValueIndex]) + + root.left = traversal(&nums, left, maxValueIndex) + root.right = traversal(&nums, maxValueIndex + 1, right) + return root +} +``` + + -----------------------
From fee948b2af53b7bfc583fbbe5c43cd98c04e462f Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Mon, 24 Jan 2022 08:57:02 +0000 Subject: [PATCH 057/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200005.=E6=9C=80?= =?UTF-8?q?=E9=95=BF=E5=9B=9E=E6=96=87=E5=AD=90=E4=B8=B2.md=20C=E8=AF=AD?= =?UTF-8?q?=E8=A8=80=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0005.最长回文子串.md | 49 +++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/problems/0005.最长回文子串.md b/problems/0005.最长回文子串.md index f204a607..588afc22 100644 --- a/problems/0005.最长回文子串.md +++ b/problems/0005.最长回文子串.md @@ -462,7 +462,56 @@ var longestPalindrome = function(s) { }; ``` +## C +动态规划: +```c +//初始化dp数组,全部初始为false +bool **initDP(int strLen) { + bool **dp = (bool **)malloc(sizeof(bool *) * strLen); + int i, j; + for(i = 0; i < strLen; ++i) { + dp[i] = (bool *)malloc(sizeof(bool) * strLen); + for(j = 0; j < strLen; ++j) + dp[i][j] = false; + } + return dp; +} +char * longestPalindrome(char * s){ + //求出字符串长度 + int strLen = strlen(s); + //初始化dp数组,元素初始化为false + bool **dp = initDP(strLen); + int maxLength = 0, left = 0, right = 0; + + //从下到上,从左到右遍历 + int i, j; + for(i = strLen - 1; i >= 0; --i) { + for(j = i; j < strLen; ++j) { + //若当前i与j所指字符一样 + if(s[i] == s[j]) { + //若i、j指向相邻字符或同一字符,则为回文字符串 + if(j - i <= 1) + dp[i][j] = true; + //若i+1与j-1所指字符串为回文字符串,则i、j所指字符串为回文字符串 + else if(dp[i + 1][j - 1]) + dp[i][j] = true; + } + //若新的字符串的长度大于之前的最大长度,进行更新 + if(dp[i][j] && j - i + 1 > maxLength) { + maxLength = j - i + 1; + left = i; + right = j; + } + } + } + //复制回文字符串,并返回 + char *ret = (char*)malloc(sizeof(char) * (maxLength + 1)); + memcpy(ret, s + left, maxLength); + ret[maxLength] = 0; + return ret; +} +``` -----------------------
From 60c3a27ce9537d7361e4927b21129bf77be507ba Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Mon, 24 Jan 2022 17:39:34 +0800 Subject: [PATCH 058/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880347.?= =?UTF-8?q?=E5=89=8DK=E4=B8=AA=E9=AB=98=E9=A2=91=E5=85=83=E7=B4=A0.md?= =?UTF-8?q?=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0347.前K个高频元素.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/problems/0347.前K个高频元素.md b/problems/0347.前K个高频元素.md index 8bd774e9..1d6a358b 100644 --- a/problems/0347.前K个高频元素.md +++ b/problems/0347.前K个高频元素.md @@ -358,6 +358,22 @@ PriorityQueue.prototype.compare = function(index1, index2) { } ``` +TypeScript: + +```typescript +function topKFrequent(nums: number[], k: number): number[] { + const countMap: Map = new Map(); + for (let num of nums) { + countMap.set(num, (countMap.get(num) || 0) + 1); + } + // tS没有最小堆的数据结构,所以直接对整个数组进行排序,取前k个元素 + return [...countMap.entries()] + .sort((a, b) => b[1] - a[1]) + .slice(0, k) + .map(i => i[0]); +}; +``` + ----------------------- From de37c44f4fbc6b368f1afe6a51e508c949ff9271 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Mon, 24 Jan 2022 19:41:17 +0800 Subject: [PATCH 059/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80.md?= =?UTF-8?q?=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/二叉树理论基础.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/problems/二叉树理论基础.md b/problems/二叉树理论基础.md index cc899850..009e8276 100644 --- a/problems/二叉树理论基础.md +++ b/problems/二叉树理论基础.md @@ -227,7 +227,23 @@ function TreeNode(val, left, right) { } ``` +TypeScript: + +```typescript +class TreeNode { + public val: number; + public left: TreeNode | null; + public right: TreeNode | null; + constructor(val?: number, left?: TreeNode, right?: TreeNode) { + this.val = val === undefined ? 0 : val; + this.left = left === undefined ? null : left; + this.right = right === undefined ? null : right; + } +} +``` + Swift: + ```Swift class TreeNode { var value: T From a488a3414a8c0e3408678f8393b116837e6240ea Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Mon, 24 Jan 2022 20:25:45 +0800 Subject: [PATCH 060/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=E7=9A=84=E9=80=92=E5=BD=92=E9=81=8D=E5=8E=86?= =?UTF-8?q?.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/二叉树的递归遍历.md | 44 ++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/problems/二叉树的递归遍历.md b/problems/二叉树的递归遍历.md index 4beed650..ba13fc74 100644 --- a/problems/二叉树的递归遍历.md +++ b/problems/二叉树的递归遍历.md @@ -358,7 +358,51 @@ var postorderTraversal = function(root) { }; ``` +TypeScript: + +```typescript +// 前序遍历 +function preorderTraversal(node: TreeNode | null): number[] { + function traverse(node: TreeNode | null, res: number[]): void { + if (node === null) return; + res.push(node.val); + traverse(node.left, res); + traverse(node.right, res); + } + const res: number[] = []; + traverse(node, res); + return res; +} + +// 中序遍历 +function inorderTraversal(node: TreeNode | null): number[] { + function traverse(node: TreeNode | null, res: number[]): void { + if (node === null) return; + traverse(node.left, res); + res.push(node.val); + traverse(node.right, res); + } + const res: number[] = []; + traverse(node, res); + return res; +} + +// 后序遍历 +function postorderTraversal(node: TreeNode | null): number[] { + function traverse(node: TreeNode | null, res: number[]): void { + if (node === null) return; + traverse(node.left, res); + traverse(node.right, res); + res.push(node.val); + } + const res: number[] = []; + traverse(node, res); + return res; +} +``` + C: + ```c //前序遍历: void preOrderTraversal(struct TreeNode* root, int* ret, int* returnSize) { From fec8e0882a771ea5866e0611c01874d6850654e6 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Mon, 24 Jan 2022 20:27:15 +0800 Subject: [PATCH 061/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=E7=9A=84=E9=80=92=E5=BD=92=E9=81=8D=E5=8E=86?= =?UTF-8?q?.md=EF=BC=89=EF=BC=9A=E5=88=A0=E9=99=A4=E5=A4=9A=E4=BD=99?= =?UTF-8?q?=E7=9A=84js=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/二叉树的递归遍历.md | 34 ---------------------------------- 1 file changed, 34 deletions(-) diff --git a/problems/二叉树的递归遍历.md b/problems/二叉树的递归遍历.md index ba13fc74..c481fd11 100644 --- a/problems/二叉树的递归遍历.md +++ b/problems/二叉树的递归遍历.md @@ -270,40 +270,6 @@ func postorderTraversal(root *TreeNode) (res []int) { } ``` -javaScript: - -```js - -前序遍历: - -var preorderTraversal = function(root, res = []) { - if (!root) return res; - res.push(root.val); - preorderTraversal(root.left, res) - preorderTraversal(root.right, res) - return res; -}; - -中序遍历: - -var inorderTraversal = function(root, res = []) { - if (!root) return res; - inorderTraversal(root.left, res); - res.push(root.val); - inorderTraversal(root.right, res); - return res; -}; - -后序遍历: - -var postorderTraversal = function(root, res = []) { - if (!root) return res; - postorderTraversal(root.left, res); - postorderTraversal(root.right, res); - res.push(root.val); - return res; -}; -``` Javascript版本: 前序遍历: From 1efb77e96310d884eb2b8647232dd1586f4f0afb Mon Sep 17 00:00:00 2001 From: zucong Date: Tue, 25 Jan 2022 14:33:12 +0800 Subject: [PATCH 062/328] =?UTF-8?q?=E4=BC=98=E5=8C=96=200112.=E8=B7=AF?= =?UTF-8?q?=E5=BE=84=E6=80=BB=E5=92=8C=20Go=E7=89=88=E6=9C=AC=E8=A7=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0112.路径总和.md | 101 ++++++++++++++++---------------------- 1 file changed, 41 insertions(+), 60 deletions(-) diff --git a/problems/0112.路径总和.md b/problems/0112.路径总和.md index 910e57c8..b3e121ba 100644 --- a/problems/0112.路径总和.md +++ b/problems/0112.路径总和.md @@ -531,82 +531,63 @@ class solution: ```go //递归法 /** - * definition for a binary tree node. - * type treenode struct { - * val int - * left *treenode - * right *treenode + * Definition for a binary tree node. + * type TreeNode struct { + * Val int + * Left *TreeNode + * Right *TreeNode * } */ -func haspathsum(root *treenode, targetsum int) bool { - var flage bool //找没找到的标志 - if root==nil{ - return flage +func hasPathSum(root *TreeNode, targetSum int) bool { + if root == nil { + return false } - pathsum(root,0,targetsum,&flage) - return flage -} -func pathsum(root *treenode, sum int,targetsum int,flage *bool){ - sum+=root.val - if root.left==nil&&root.right==nil&&sum==targetsum{ - *flage=true - return - } - if root.left!=nil&&!(*flage){//左节点不为空且还没找到 - pathsum(root.left,sum,targetsum,flage) - } - if root.right!=nil&&!(*flage){//右节点不为空且没找到 - pathsum(root.right,sum,targetsum,flage) + + targetSum -= root.Val // 将targetSum在遍历每层的时候都减去本层节点的值 + if root.Left == nil && root.Right == nil && targetSum == 0 { // 如果剩余的targetSum为0, 则正好就是符合的结果 + return true } + return hasPathSum(root.Left, targetSum) || hasPathSum(root.Right, targetSum) // 否则递归找 } ``` -113 递归法 +113. 路径总和 II ```go /** - * definition for a binary tree node. - * type treenode struct { - * val int - * left *treenode - * right *treenode + * Definition for a binary tree node. + * type TreeNode struct { + * Val int + * Left *TreeNode + * Right *TreeNode * } */ -func pathsum(root *treenode, targetsum int) [][]int { - var result [][]int//最终结果 - if root==nil{ - return result - } - var sumnodes []int//经过路径的节点集合 - haspathsum(root,&sumnodes,targetsum,&result) +func pathSum(root *TreeNode, targetSum int) [][]int { + result := make([][]int, 0) + traverse(root, &result, new([]int), targetSum) return result } -func haspathsum(root *treenode,sumnodes *[]int,targetsum int,result *[][]int){ - *sumnodes=append(*sumnodes,root.val) - if root.left==nil&&root.right==nil{//叶子节点 - fmt.println(*sumnodes) - var sum int - var number int - for k,v:=range *sumnodes{//求该路径节点的和 - sum+=v - number=k - } - tempnodes:=make([]int,number+1)//新的nodes接受指针里的值,防止最终指针里的值发生变动,导致最后的结果都是最后一个sumnodes的值 - for k,v:=range *sumnodes{ - tempnodes[k]=v - } - if sum==targetsum{ - *result=append(*result,tempnodes) - } + +func traverse(node *TreeNode, result *[][]int, currPath *[]int, targetSum int) { + if node == nil { // 这个判空也可以挪到递归遍历左右子树时去判断 + return } - if root.left!=nil{ - haspathsum(root.left,sumnodes,targetsum,result) - *sumnodes=(*sumnodes)[:len(*sumnodes)-1]//回溯 - } - if root.right!=nil{ - haspathsum(root.right,sumnodes,targetsum,result) - *sumnodes=(*sumnodes)[:len(*sumnodes)-1]//回溯 + + targetSum -= node.Val // 将targetSum在遍历每层的时候都减去本层节点的值 + *currPath = append(*currPath, node.Val) // 把当前节点放到路径记录里 + + if node.Left == nil && node.Right == nil && targetSum == 0 { // 如果剩余的targetSum为0, 则正好就是符合的结果 + // 不能直接将currPath放到result里面, 因为currPath是共享的, 每次遍历子树时都会被修改 + pathCopy := make([]int, len(*currPath)) + for i, element := range *currPath { + pathCopy[i] = element + } + *result = append(*result, pathCopy) // 将副本放到结果集里 } + + traverse(node.Left, result, currPath, targetSum) + traverse(node.Right, result, currPath, targetSum) + *currPath = (*currPath)[:len(*currPath)-1] // 当前节点遍历完成, 从路径记录里删除掉 } ``` From 3a46ffdad4cfcc2bc3695db93f4760b9ae70b4d2 Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Tue, 25 Jan 2022 12:54:50 +0000 Subject: [PATCH 063/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200005.=E6=9C=80?= =?UTF-8?q?=E9=95=BF=E5=9B=9E=E6=96=87=E5=AD=90=E4=B8=B2.md=20C=E8=AF=AD?= =?UTF-8?q?=E8=A8=80=E5=8F=8C=E6=8C=87=E9=92=88=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0005.最长回文子串.md | 36 +++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/problems/0005.最长回文子串.md b/problems/0005.最长回文子串.md index 588afc22..99458825 100644 --- a/problems/0005.最长回文子串.md +++ b/problems/0005.最长回文子串.md @@ -513,5 +513,41 @@ char * longestPalindrome(char * s){ } ``` +双指针: +```c +int left, maxLength; +void extend(char *str, int i, int j, int size) { + while(i >= 0 && j < size && str[i] == str[j]) { + //若当前子字符串长度大于最长的字符串长度,进行更新 + if(j - i + 1 > maxLength) { + maxLength = j - i + 1; + left = i; + } + //左指针左移,右指针右移。扩大搜索范围 + ++j, --i; + } +} + +char * longestPalindrome(char * s){ + left = right = maxLength = 0; + int size = strlen(s); + + int i; + for(i = 0; i < size; ++i) { + //长度为单数的子字符串 + extend(s, i, i, size); + //长度为双数的子字符串 + extend(s, i, i + 1, size); + } + + //复制子字符串 + char *subStr = (char *)malloc(sizeof(char) * (maxLength + 1)); + memcpy(subStr, s + left, maxLength); + subStr[maxLength] = 0; + + return subStr; +} +``` + -----------------------
From d40a15eccca9212f701c4602a514168ab52fecf6 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Wed, 26 Jan 2022 10:40:30 +0800 Subject: [PATCH 064/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=E7=9A=84=E8=BF=AD=E4=BB=A3=E9=81=8D=E5=8E=86?= =?UTF-8?q?.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/二叉树的迭代遍历.md | 55 ++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/problems/二叉树的迭代遍历.md b/problems/二叉树的迭代遍历.md index 4cb94cb5..ba38726b 100644 --- a/problems/二叉树的迭代遍历.md +++ b/problems/二叉树的迭代遍历.md @@ -454,6 +454,61 @@ var postorderTraversal = function(root, res = []) { }; ``` +TypeScript: + +```typescript +// 前序遍历(迭代法) +function preorderTraversal(root: TreeNode | null): number[] { + if (root === null) return []; + let res: number[] = []; + let helperStack: TreeNode[] = []; + let curNode: TreeNode = root; + helperStack.push(curNode); + while (helperStack.length > 0) { + curNode = helperStack.pop()!; + res.push(curNode.val); + if (curNode.right !== null) helperStack.push(curNode.right); + if (curNode.left !== null) helperStack.push(curNode.left); + } + return res; +}; + +// 中序遍历(迭代法) +function inorderTraversal(root: TreeNode | null): number[] { + let helperStack: TreeNode[] = []; + let res: number[] = []; + if (root === null) return res; + let curNode: TreeNode | null = root; + while (curNode !== null || helperStack.length > 0) { + if (curNode !== null) { + helperStack.push(curNode); + curNode = curNode.left; + } else { + curNode = helperStack.pop()!; + res.push(curNode.val); + curNode = curNode.right; + } + } + return res; +}; + +// 后序遍历(迭代法) +function postorderTraversal(root: TreeNode | null): number[] { + let helperStack: TreeNode[] = []; + let res: number[] = []; + let curNode: TreeNode; + if (root === null) return res; + helperStack.push(root); + while (helperStack.length > 0) { + curNode = helperStack.pop()!; + res.push(curNode.val); + if (curNode.left !== null) helperStack.push(curNode.left); + if (curNode.right !== null) helperStack.push(curNode.right); + } + return res.reverse(); +}; +``` + Swift: > 迭代法前序遍历 From 9d09b11d56722748e00d3647cdcd228793baaa66 Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Wed, 26 Jan 2022 09:26:03 +0000 Subject: [PATCH 065/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200143.=E9=87=8D?= =?UTF-8?q?=E6=8E=92=E9=93=BE=E8=A1=A8.md=20C=E8=AF=AD=E8=A8=80=E8=A7=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0143.重排链表.md | 68 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/problems/0143.重排链表.md b/problems/0143.重排链表.md index 4ea9cb97..00622623 100644 --- a/problems/0143.重排链表.md +++ b/problems/0143.重排链表.md @@ -439,7 +439,75 @@ var reorderList = function(head, s = [], tmp) { } ``` +### C +方法三:反转链表 +```c +//翻转链表 +struct ListNode *reverseList(struct ListNode *head) { + if(!head) + return NULL; + struct ListNode *preNode = NULL, *curNode = head; + while(curNode) { + //创建tempNode记录curNode->next(即将被更新) + struct ListNode* tempNode = curNode->next; + //将curNode->next指向preNode + curNode->next = preNode; + //更新preNode为curNode + preNode = curNode; + //curNode更新为原链表中下一个元素 + curNode = tempNode; + } + return preNode; +} +void reorderList(struct ListNode* head){ + //slow用来截取到链表的中间节点(第一个链表的最后节点),每次循环跳一个节点。fast用来辅助,每次循环跳两个节点 + struct ListNode *fast = head, *slow = head; + while(fast && fast->next && fast->next->next) { + //fast每次跳两个节点 + fast = fast->next->next; + //slow每次跳一个节点 + slow = slow->next; + } + //将slow->next后的节点翻转 + struct ListNode *sndLst = reverseList(slow->next); + //将第一个链表与第二个链表断开 + slow->next = NULL; + //因为插入从curNode->next开始,curNode刚开始已经head。所以fstList要从head->next开始 + struct ListNode *fstLst = head->next; + struct ListNode *curNode = head; + + int count = 0; + //当第一个链表和第二个链表中都有节点时循环 + while(sndLst && fstLst) { + //count为奇数,插入fstLst中的节点 + if(count % 2) { + curNode->next = fstLst; + fstLst = fstLst->next; + } + //count为偶数,插入sndList的节点 + else { + curNode->next = sndLst; + sndLst = sndLst->next; + } + //设置下一个节点 + curNode = curNode->next; + //更新count + ++count; + } + + //若两个链表fstList和sndLst中还有节点,将其放入链表 + if(fstLst) { + curNode->next = fstLst; + } + if(sndLst) { + curNode->next = sndLst; + } + + //返回链表 + return head; +} +``` ----------------------- From 7ed2a3aef7b10b48fe7f8127f185f4a6efc9952c Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Wed, 26 Jan 2022 19:18:23 +0800 Subject: [PATCH 066/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=E7=9A=84=E7=BB=9F=E4=B8=80=E8=BF=AD=E4=BB=A3?= =?UTF-8?q?=E6=B3=95.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/二叉树的统一迭代法.md | 68 ++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/problems/二叉树的统一迭代法.md b/problems/二叉树的统一迭代法.md index 2ff84817..f6edf586 100644 --- a/problems/二叉树的统一迭代法.md +++ b/problems/二叉树的统一迭代法.md @@ -522,7 +522,75 @@ var postorderTraversal = function(root, res = []) { ``` +TypeScript: +```typescript +// 前序遍历(迭代法) +function preorderTraversal(root: TreeNode | null): number[] { + let helperStack: (TreeNode | null)[] = []; + let res: number[] = []; + let curNode: TreeNode | null; + if (root === null) return res; + helperStack.push(root); + while (helperStack.length > 0) { + curNode = helperStack.pop()!; + if (curNode !== null) { + if (curNode.right !== null) helperStack.push(curNode.right); + helperStack.push(curNode); + helperStack.push(null); + if (curNode.left !== null) helperStack.push(curNode.left); + } else { + curNode = helperStack.pop()!; + res.push(curNode.val); + } + } + return res; +}; + +// 中序遍历(迭代法) +function inorderTraversal(root: TreeNode | null): number[] { + let helperStack: (TreeNode | null)[] = []; + let res: number[] = []; + let curNode: TreeNode | null; + if (root === null) return res; + helperStack.push(root); + while (helperStack.length > 0) { + curNode = helperStack.pop()!; + if (curNode !== null) { + if (curNode.right !== null) helperStack.push(curNode.right); + helperStack.push(curNode); + helperStack.push(null); + if (curNode.left !== null) helperStack.push(curNode.left); + } else { + curNode = helperStack.pop()!; + res.push(curNode.val); + } + } + return res; +}; + +// 后序遍历(迭代法) +function postorderTraversal(root: TreeNode | null): number[] { + let helperStack: (TreeNode | null)[] = []; + let res: number[] = []; + let curNode: TreeNode | null; + if (root === null) return res; + helperStack.push(root); + while (helperStack.length > 0) { + curNode = helperStack.pop()!; + if (curNode !== null) { + if (curNode.right !== null) helperStack.push(curNode.right); + helperStack.push(curNode); + helperStack.push(null); + if (curNode.left !== null) helperStack.push(curNode.left); + } else { + curNode = helperStack.pop()!; + res.push(curNode.val); + } + } + return res; +}; +``` -----------------------
From 878231551829fdd9deea2f2457eb09b794d7ed65 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Wed, 26 Jan 2022 21:20:36 +0800 Subject: [PATCH 067/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880102.?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D?= =?UTF-8?q?=E5=8E=86.md=20&=20107.=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84?= =?UTF-8?q?=E5=B1=82=E6=AC=A1=E9=81=8D=E5=8E=86=20II=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0102.二叉树的层序遍历.md | 52 +++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/problems/0102.二叉树的层序遍历.md b/problems/0102.二叉树的层序遍历.md index 1fb9b633..b108c8f0 100644 --- a/problems/0102.二叉树的层序遍历.md +++ b/problems/0102.二叉树的层序遍历.md @@ -246,7 +246,35 @@ var levelOrder = function(root) { ``` +TypeScript: + +```typescript +function levelOrder(root: TreeNode | null): number[][] { + let helperQueue: TreeNode[] = []; + let res: number[][] = []; + let tempArr: number[] = []; + if (root !== null) helperQueue.push(root); + let curNode: TreeNode; + while (helperQueue.length > 0) { + for (let i = 0, length = helperQueue.length; i < length; i++) { + curNode = helperQueue.shift()!; + tempArr.push(curNode.val); + if (curNode.left !== null) { + helperQueue.push(curNode.left); + } + if (curNode.right !== null) { + helperQueue.push(curNode.right); + } + } + res.push(tempArr); + tempArr = []; + } + return res; +}; +``` + Swift: + ```swift func levelOrder(_ root: TreeNode?) -> [[Int]] { var res = [[Int]]() @@ -454,7 +482,31 @@ var levelOrderBottom = function(root) { }; ``` +TypeScript: + +```typescript +function levelOrderBottom(root: TreeNode | null): number[][] { + let helperQueue: TreeNode[] = []; + let resArr: number[][] = []; + let tempArr: number[] = []; + let tempNode: TreeNode; + if (root !== null) helperQueue.push(root); + while (helperQueue.length > 0) { + for (let i = 0, length = helperQueue.length; i < length; i++) { + tempNode = helperQueue.shift()!; + tempArr.push(tempNode.val); + if (tempNode.left !== null) helperQueue.push(tempNode.left); + if (tempNode.right !== null) helperQueue.push(tempNode.right); + } + resArr.push(tempArr); + tempArr = []; + } + return resArr.reverse(); +}; +``` + Swift: + ```swift func levelOrderBottom(_ root: TreeNode?) -> [[Int]] { var res = [[Int]]() From bb02fb957bfef34ffc7270e70b4cf41b829ed3a6 Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Wed, 26 Jan 2022 23:13:07 +0000 Subject: [PATCH 068/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200052.N=E7=9A=87?= =?UTF-8?q?=E5=90=8EII.md=20C=E8=AF=AD=E8=A8=80=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0052.N皇后II.md | 60 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/problems/0052.N皇后II.md b/problems/0052.N皇后II.md index 78531798..67e439ca 100644 --- a/problems/0052.N皇后II.md +++ b/problems/0052.N皇后II.md @@ -143,5 +143,65 @@ var totalNQueens = function(n) { return count; }; ``` + +C +```c +//path[i]为在i行,path[i]列上存在皇后 +int *path; +int pathTop; +int answer; +//检查当前level行index列放置皇后是否合法 +int isValid(int index, int level) { + int i; + //updater为若斜角存在皇后,其所应在的列 + //用来检查左上45度是否存在皇后 + int lCornerUpdater = index - level; + //用来检查右上135度是否存在皇后 + int rCornerUpdater = index + level; + for(i = 0; i < pathTop; ++i) { + //path[i] == index检查index列是否存在皇后 + //检查斜角皇后:只要path[i] == updater,就说明当前位置不可放置皇后。 + //path[i] == lCornerUpdater检查左上角45度是否有皇后 + //path[i] == rCornerUpdater检查右上角135度是否有皇后 + if(path[i] == index || path[i] == lCornerUpdater || path[i] == rCornerUpdater) + return 0; + //更新updater指向下一行对应的位置 + ++lCornerUpdater; + --rCornerUpdater; + } + return 1; +} + +//回溯算法:level为当前皇后行数 +void backTracking(int n, int level) { + //若path中元素个数已经为n,则证明有一种解法。answer+1 + if(pathTop == n) { + ++answer; + return; + } + + int i; + for(i = 0; i < n; ++i) { + //若当前level行,i列是合法的放置位置。就将i放入path中 + if(isValid(i, level)) { + path[pathTop++] = i; + backTracking(n, level + 1); + //回溯 + --pathTop; + } + } +} + +int totalNQueens(int n){ + answer = 0; + pathTop = 0; + path = (int *)malloc(sizeof(int) * n); + + backTracking(n, 0); + + return answer; +} +``` + -----------------------
From 023ec6900a759e030712edf5362b65569935df75 Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Thu, 27 Jan 2022 13:43:43 +0000 Subject: [PATCH 069/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200129.=E6=B1=82?= =?UTF-8?q?=E6=A0=B9=E5=88=B0=E5=8F=B6=E5=AD=90=E8=8A=82=E7=82=B9=E6=95=B0?= =?UTF-8?q?=E5=AD=97=E4=B9=8B=E5=92=8C.md=20C=E8=AF=AD=E8=A8=80=E8=A7=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0129.求根到叶子节点数字之和.md | 26 +++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/problems/0129.求根到叶子节点数字之和.md b/problems/0129.求根到叶子节点数字之和.md index d07d5244..980779c2 100644 --- a/problems/0129.求根到叶子节点数字之和.md +++ b/problems/0129.求根到叶子节点数字之和.md @@ -289,7 +289,33 @@ var sumNumbers = function(root) { }; ``` +C: +```c +//sum记录总和 +int sum; +void traverse(struct TreeNode *node, int val) { + //更新val为根节点到当前节点的和 + val = val * 10 + node->val; + //若当前节点为叶子节点,记录val + if(!node->left && !node->right) { + sum+=val; + return; + } + //若有左/右节点,遍历左/右节点 + if(node->left) + traverse(node->left, val); + if(node->right) + traverse(node->right, val); +} +int sumNumbers(struct TreeNode* root){ + sum = 0; + + traverse(root, 0); + + return sum; +} +``` -----------------------
From 7fe4ea3fbc3d93665e2ed5663a1c41c6f21d5874 Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Thu, 27 Jan 2022 19:32:30 +0000 Subject: [PATCH 070/328] =?UTF-8?q?Add=200209.=E9=95=BF=E5=BA=A6=E6=9C=80?= =?UTF-8?q?=E5=B0=8F=E7=9A=84=E5=AD=90=E6=95=B0=E7=BB=84.md=20C=E8=AF=AD?= =?UTF-8?q?=E8=A8=80=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0209.长度最小的子数组.md | 50 +++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/problems/0209.长度最小的子数组.md b/problems/0209.长度最小的子数组.md index 17422ca0..dc1d9f18 100644 --- a/problems/0209.长度最小的子数组.md +++ b/problems/0209.长度最小的子数组.md @@ -330,5 +330,55 @@ def min_sub_array_len(target, nums) end ``` +C: +暴力解法: +```c +int minSubArrayLen(int target, int* nums, int numsSize){ + //初始化最小长度为INT_MAX + int minLength = INT_MAX; + int sum; + + int left, right; + for(left = 0; left < numsSize; ++left) { + //每次遍历都清零sum,计算当前位置后和>=target的子数组的长度 + sum = 0; + //从left开始,sum中添加元素 + for(right = left; right < numsSize; ++right) { + sum += nums[right]; + //若加入当前元素后,和大于target,则更新minLength + if(sum >= target) { + int subLength = right - left + 1; + minLength = minLength < subLength ? minLength : subLength; + } + } + } + //若minLength不为INT_MAX,则返回minLnegth + return minLength == INT_MAX ? 0 : minLength; +} +``` + +滑动窗口: +```c +int minSubArrayLen(int target, int* nums, int numsSize){ + //初始化最小长度为INT_MAX + int minLength = INT_MAX; + int sum = 0; + + int left = 0, right = 0; + //右边界向右扩展 + for(; right < numsSize; ++right) { + sum += nums[right]; + //当sum的值大于等于target时,保存长度,并且收缩左边界 + while(sum >= target) { + int subLength = right - left + 1; + minLength = minLength < subLength ? minLength : subLength; + sum -= nums[left++]; + } + } + //若minLength不为INT_MAX,则返回minLnegth + return minLength == INT_MAX ? 0 : minLength; +} +``` + -----------------------
From e177bca526cd33ff4dce70b188f2214598941b0e Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Thu, 27 Jan 2022 22:35:30 +0800 Subject: [PATCH 071/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88199.?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84=E5=8F=B3=E8=A7=86=E5=9B=BE?= =?UTF-8?q?=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0102.二叉树的层序遍历.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/problems/0102.二叉树的层序遍历.md b/problems/0102.二叉树的层序遍历.md index b108c8f0..18e19227 100644 --- a/problems/0102.二叉树的层序遍历.md +++ b/problems/0102.二叉树的层序遍历.md @@ -709,7 +709,28 @@ var rightSideView = function(root) { }; ``` +TypeScript: + +```typescript +function rightSideView(root: TreeNode | null): number[] { + let helperQueue: TreeNode[] = []; + let resArr: number[] = []; + let tempNode: TreeNode; + if (root !== null) helperQueue.push(root); + while (helperQueue.length > 0) { + for (let i = 0, length = helperQueue.length; i < length; i++) { + tempNode = helperQueue.shift()!; + if (i === length - 1) resArr.push(tempNode.val); + if (tempNode.left !== null) helperQueue.push(tempNode.left); + if (tempNode.right !== null) helperQueue.push(tempNode.right); + } + } + return resArr; +}; +``` + Swift: + ```swift func rightSideView(_ root: TreeNode?) -> [Int] { var res = [Int]() From daf710bde6eb82f2c5b2a87254ca9860d79af80e Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 28 Jan 2022 11:32:57 +0800 Subject: [PATCH 072/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88637.?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84=E5=B1=82=E5=B9=B3=E5=9D=87?= =?UTF-8?q?=E5=80=BC=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0102.二叉树的层序遍历.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/problems/0102.二叉树的层序遍历.md b/problems/0102.二叉树的层序遍历.md index 18e19227..9ff4f2e9 100644 --- a/problems/0102.二叉树的层序遍历.md +++ b/problems/0102.二叉树的层序遍历.md @@ -941,7 +941,32 @@ var averageOfLevels = function(root) { }; ``` +TypeScript: + +```typescript +function averageOfLevels(root: TreeNode | null): number[] { + let helperQueue: TreeNode[] = []; + let resArr: number[] = []; + let total: number = 0; + let tempNode: TreeNode; + if (root !== null) helperQueue.push(root); + while (helperQueue.length > 0) { + let length = helperQueue.length; + for (let i = 0; i < length; i++) { + tempNode = helperQueue.shift()!; + total += tempNode.val; + if (tempNode.left) helperQueue.push(tempNode.left); + if (tempNode.right) helperQueue.push(tempNode.right); + } + resArr.push(total / length); + total = 0; + } + return resArr; +}; +``` + Swift: + ```swift func averageOfLevels(_ root: TreeNode?) -> [Double] { var res = [Double]() From 2862d47368512a9cbc7e7184775d99d8e53f72df Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 28 Jan 2022 11:44:49 +0800 Subject: [PATCH 073/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88429.N?= =?UTF-8?q?=E5=8F=89=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86?= =?UTF-8?q?=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0102.二叉树的层序遍历.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/problems/0102.二叉树的层序遍历.md b/problems/0102.二叉树的层序遍历.md index 9ff4f2e9..5dd448b7 100644 --- a/problems/0102.二叉树的层序遍历.md +++ b/problems/0102.二叉树的层序遍历.md @@ -1190,7 +1190,30 @@ var levelOrder = function(root) { }; ``` +TypeScript: + +```typescript +function levelOrder(root: Node | null): number[][] { + let helperQueue: Node[] = []; + let resArr: number[][] = []; + let tempArr: number[] = []; + if (root !== null) helperQueue.push(root); + let curNode: Node; + while (helperQueue.length > 0) { + for (let i = 0, length = helperQueue.length; i < length; i++) { + curNode = helperQueue.shift()!; + tempArr.push(curNode.val); + helperQueue.push(...curNode.children); + } + resArr.push(tempArr); + tempArr = []; + } + return resArr; +}; +``` + Swift: + ```swift func levelOrder(_ root: Node?) -> [[Int]] { var res = [[Int]]() From 9329ecff5e95e5bc1e8cb17fbba1135765fd3286 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 28 Jan 2022 12:02:15 +0800 Subject: [PATCH 074/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88515.?= =?UTF-8?q?=E5=9C=A8=E6=AF=8F=E4=B8=AA=E6=A0=91=E8=A1=8C=E4=B8=AD=E6=89=BE?= =?UTF-8?q?=E6=9C=80=E5=A4=A7=E5=80=BC=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0102.二叉树的层序遍历.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/problems/0102.二叉树的层序遍历.md b/problems/0102.二叉树的层序遍历.md index 5dd448b7..6f90cb75 100644 --- a/problems/0102.二叉树的层序遍历.md +++ b/problems/0102.二叉树的层序遍历.md @@ -1393,7 +1393,34 @@ var largestValues = function(root) { }; ``` +TypeScript: + +```typescript +function largestValues(root: TreeNode | null): number[] { + let helperQueue: TreeNode[] = []; + let resArr: number[] = []; + let tempNode: TreeNode; + let max: number = 0; + if (root !== null) helperQueue.push(root); + while (helperQueue.length > 0) { + for (let i = 0, length = helperQueue.length; i < length; i++) { + tempNode = helperQueue.shift()!; + if (i === 0) { + max = tempNode.val; + } else { + max = max > tempNode.val ? max : tempNode.val; + } + if (tempNode.left) helperQueue.push(tempNode.left); + if (tempNode.right) helperQueue.push(tempNode.right); + } + resArr.push(max); + } + return resArr; +}; +``` + Swift: + ```swift func largestValues(_ root: TreeNode?) -> [Int] { var res = [Int]() From 992cd6d7f3bc2b0065bf8f3f3ff064a13c66dde3 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 28 Jan 2022 16:10:56 +0800 Subject: [PATCH 075/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88116.?= =?UTF-8?q?=E5=A1=AB=E5=85=85=E6=AF=8F=E4=B8=AA=E8=8A=82=E7=82=B9=E7=9A=84?= =?UTF-8?q?=E4=B8=8B=E4=B8=80=E4=B8=AA=E5=8F=B3=E4=BE=A7=E8=8A=82=E7=82=B9?= =?UTF-8?q?=E6=8C=87=E9=92=88=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescrip?= =?UTF-8?q?t=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0102.二叉树的层序遍历.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/problems/0102.二叉树的层序遍历.md b/problems/0102.二叉树的层序遍历.md index 6f90cb75..12f96469 100644 --- a/problems/0102.二叉树的层序遍历.md +++ b/problems/0102.二叉树的层序遍历.md @@ -1611,6 +1611,31 @@ var connect = function(root) { }; ``` +TypeScript: + +```typescript +function connect(root: Node | null): Node | null { + let helperQueue: Node[] = []; + let preNode: Node, curNode: Node; + if (root !== null) helperQueue.push(root); + while (helperQueue.length > 0) { + for (let i = 0, length = helperQueue.length; i < length; i++) { + if (i === 0) { + preNode = helperQueue.shift()!; + } else { + curNode = helperQueue.shift()!; + preNode.next = curNode; + preNode = curNode; + } + if (preNode.left) helperQueue.push(preNode.left); + if (preNode.right) helperQueue.push(preNode.right); + } + preNode.next = null; + } + return root; +}; +``` + go: ```GO From d1abb0cbb4397a950479788497e3ec21adbcea22 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 28 Jan 2022 16:21:25 +0800 Subject: [PATCH 076/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88117.?= =?UTF-8?q?=E5=A1=AB=E5=85=85=E6=AF=8F=E4=B8=AA=E8=8A=82=E7=82=B9=E7=9A=84?= =?UTF-8?q?=E4=B8=8B=E4=B8=80=E4=B8=AA=E5=8F=B3=E4=BE=A7=E8=8A=82=E7=82=B9?= =?UTF-8?q?=E6=8C=87=E9=92=88II=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescr?= =?UTF-8?q?ipt=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0102.二叉树的层序遍历.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/problems/0102.二叉树的层序遍历.md b/problems/0102.二叉树的层序遍历.md index 12f96469..a7716d92 100644 --- a/problems/0102.二叉树的层序遍历.md +++ b/problems/0102.二叉树的层序遍历.md @@ -1862,6 +1862,31 @@ var connect = function(root) { return root; }; ``` +TypeScript: + +```typescript +function connect(root: Node | null): Node | null { + let helperQueue: Node[] = []; + let preNode: Node, curNode: Node; + if (root !== null) helperQueue.push(root); + while (helperQueue.length > 0) { + for (let i = 0, length = helperQueue.length; i < length; i++) { + if (i === 0) { + preNode = helperQueue.shift()!; + } else { + curNode = helperQueue.shift()!; + preNode.next = curNode; + preNode = curNode; + } + if (preNode.left) helperQueue.push(preNode.left); + if (preNode.right) helperQueue.push(preNode.right); + } + preNode.next = null; + } + return root; +}; +``` + go: ```GO From bdb0954e32976832b9bd99dd2dcb2744d55e665b Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 28 Jan 2022 17:11:11 +0800 Subject: [PATCH 077/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88104.?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84=E6=9C=80=E5=A4=A7=E6=B7=B1?= =?UTF-8?q?=E5=BA=A6=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0102.二叉树的层序遍历.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/problems/0102.二叉树的层序遍历.md b/problems/0102.二叉树的层序遍历.md index a7716d92..9ac23fdf 100644 --- a/problems/0102.二叉树的层序遍历.md +++ b/problems/0102.二叉树的层序遍历.md @@ -2131,7 +2131,28 @@ var maxDepth = function(root) { }; ``` +TypeScript: + +```typescript +function maxDepth(root: TreeNode | null): number { + let helperQueue: TreeNode[] = []; + let resDepth: number = 0; + let tempNode: TreeNode; + if (root !== null) helperQueue.push(root); + while (helperQueue.length > 0) { + resDepth++; + for (let i = 0, length = helperQueue.length; i < length; i++) { + tempNode = helperQueue.shift()!; + if (tempNode.left) helperQueue.push(tempNode.left); + if (tempNode.right) helperQueue.push(tempNode.right); + } + } + return resDepth; +}; +``` + Swift: + ```swift func maxDepth(_ root: TreeNode?) -> Int { guard let root = root else { From 626db3fc67ba0a478f39331c4788bca15314a720 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 28 Jan 2022 20:33:04 +0800 Subject: [PATCH 078/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88111.?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84=E6=9C=80=E5=B0=8F=E6=B7=B1?= =?UTF-8?q?=E5=BA=A6=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0102.二叉树的层序遍历.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/problems/0102.二叉树的层序遍历.md b/problems/0102.二叉树的层序遍历.md index 9ac23fdf..1a92d42f 100644 --- a/problems/0102.二叉树的层序遍历.md +++ b/problems/0102.二叉树的层序遍历.md @@ -2349,7 +2349,29 @@ var minDepth = function(root) { }; ``` +TypeScript: + +```typescript +function minDepth(root: TreeNode | null): number { + let helperQueue: TreeNode[] = []; + let resMin: number = 0; + let tempNode: TreeNode; + if (root !== null) helperQueue.push(root); + while (helperQueue.length > 0) { + resMin++; + for (let i = 0, length = helperQueue.length; i < length; i++) { + tempNode = helperQueue.shift()!; + if (tempNode.left === null && tempNode.right === null) return resMin; + if (tempNode.left !== null) helperQueue.push(tempNode.left); + if (tempNode.right !== null) helperQueue.push(tempNode.right); + } + } + return resMin; +}; +``` + Swift: + ```swift func minDepth(_ root: TreeNode?) -> Int { guard let root = root else { From 653d645dabd54c9b2d94afc27dc3cb308f82b519 Mon Sep 17 00:00:00 2001 From: Younglesszzz <571688981@qq.com> Date: Sat, 29 Jan 2022 13:29:28 +0800 Subject: [PATCH 079/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E4=BA=8C?= =?UTF-8?q?=E7=BB=B4=E6=95=B0=E7=BB=84=E7=89=88=E6=9C=AC=EF=BC=8C=E7=9B=B8?= =?UTF-8?q?=E6=AF=94=E4=BA=8E=E4=B8=80=E7=BB=B4=E5=A5=BD=E7=90=86=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/1049.最后一块石头的重量II.md | 37 +++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/problems/1049.最后一块石头的重量II.md b/problems/1049.最后一块石头的重量II.md index d64e7e56..7b67b1ac 100644 --- a/problems/1049.最后一块石头的重量II.md +++ b/problems/1049.最后一块石头的重量II.md @@ -153,6 +153,8 @@ public: Java: + +一维数组版本 ```Java class Solution { public int lastStoneWeightII(int[] stones) { @@ -173,6 +175,41 @@ class Solution { return sum - 2 * dp[target]; } } +``` +二维数组版本(便于理解) +```Java +class Solution { + public int lastStoneWeightII(int[] stones) { + int sum = 0; + for (int s : stones) { + sum += s; + } + + int target = sum / 2; + //初始化,dp[i][j]为可以放0-i物品,背包容量为j的情况下背包中的最大价值 + int[][] dp = new int[stones.length][target + 1]; + //dp[i][0]默认初始化为0 + //dp[0][j]取决于stones[0] + for (int j = stones[0]; j <= target; j++) { + dp[0][j] = stones[0]; + } + + for (int i = 1; i < stones.length; i++) { + for (int j = 1; j <= target; j++) {//注意是等于 + if (j >= stones[i]) { + //不放:dp[i - 1][j] 放:dp[i - 1][j - stones[i]] + stones[i] + dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - stones[i]] + stones[i]); + } else { + dp[i][j] = dp[i - 1][j]; + } + } + } + + System.out.println(dp[stones.length - 1][target]); + return (sum - dp[stones.length - 1][target]) - dp[stones.length - 1][target]; + } +} + ``` Python: From b1c3d5c4f9db71676ebc44f9c41a10778dfea1c5 Mon Sep 17 00:00:00 2001 From: Younglesszzz <571688981@qq.com> Date: Sat, 29 Jan 2022 13:39:27 +0800 Subject: [PATCH 080/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E4=BA=8C?= =?UTF-8?q?=E7=BB=B4=E6=95=B0=E7=BB=84=E7=89=88=E6=9C=AC=EF=BC=8C=E7=9B=B8?= =?UTF-8?q?=E6=AF=94=E4=BA=8E=E4=B8=80=E7=BB=B4=E5=A5=BD=E7=90=86=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0416.分割等和子集.md | 39 +++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/problems/0416.分割等和子集.md b/problems/0416.分割等和子集.md index 45b8b416..9da1f8d5 100644 --- a/problems/0416.分割等和子集.md +++ b/problems/0416.分割等和子集.md @@ -210,6 +210,45 @@ class Solution { } ``` +二维数组版本(易于理解): +```Java +class Solution { + public boolean canPartition(int[] nums) { + int sum = 0; + for (int i = 0; i < nums.length; i++) { + sum += nums[i]; + } + + if (sum % 2 == 1) + return false; + int target = sum / 2; + + //dp[i][j]代表可装物品为0-i,背包容量为j的情况下,背包内容量的最大价值 + int[][] dp = new int[nums.length][target + 1]; + + //初始化,dp[0][j]的最大价值nums[0](if j > weight[i]) + //dp[i][0]均为0,不用初始化 + for (int j = nums[0]; j <= target; j++) { + dp[0][j] = nums[0]; + } + + //遍历物品,遍历背包 + //递推公式: + for (int i = 1; i < nums.length; i++) { + for (int j = 0; j <= target; j++) { + //背包容量可以容纳nums[i] + if (j >= nums[i]) { + dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - nums[i]] + nums[i]); + } else { + dp[i][j] = dp[i - 1][j]; + } + } + } + + return dp[nums.length - 1][target] == target; + } +} +``` Python: ```python class Solution: From be3f2cfc8a6e0abc3fbbefb3d7d2967b686e96e2 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sat, 29 Jan 2022 22:12:49 +0800 Subject: [PATCH 081/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880226.?= =?UTF-8?q?=E7=BF=BB=E8=BD=AC=E4=BA=8C=E5=8F=89=E6=A0=91.md=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0226.翻转二叉树.md | 128 ++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) diff --git a/problems/0226.翻转二叉树.md b/problems/0226.翻转二叉树.md index e6dbb709..8108e7ad 100644 --- a/problems/0226.翻转二叉树.md +++ b/problems/0226.翻转二叉树.md @@ -563,7 +563,135 @@ var invertTree = function(root) { }; ``` +### TypeScript: + +递归法: + +```typescript +// 递归法(前序遍历) +function invertTree(root: TreeNode | null): TreeNode | null { + if (root === null) return root; + let tempNode: TreeNode | null = root.left; + root.left = root.right; + root.right = tempNode; + invertTree(root.left); + invertTree(root.right); + return root; +}; + +// 递归法(后序遍历) +function invertTree(root: TreeNode | null): TreeNode | null { + if (root === null) return root; + invertTree(root.left); + invertTree(root.right); + let tempNode: TreeNode | null = root.left; + root.left = root.right; + root.right = tempNode; + return root; +}; + +// 递归法(中序遍历) +function invertTree(root: TreeNode | null): TreeNode | null { + if (root === null) return root; + invertTree(root.left); + let tempNode: TreeNode | null = root.left; + root.left = root.right; + root.right = tempNode; + // 因为左右节点已经进行交换,此时的root.left 是原先的root.right + invertTree(root.left); + return root; +}; +``` + +迭代法: + +```typescript +// 迭代法(栈模拟前序遍历) +function invertTree(root: TreeNode | null): TreeNode | null { + let helperStack: TreeNode[] = []; + let curNode: TreeNode, + tempNode: TreeNode | null; + if (root !== null) helperStack.push(root); + while (helperStack.length > 0) { + curNode = helperStack.pop()!; + // 入栈操作最好在交换节点之前进行,便于理解 + if (curNode.right) helperStack.push(curNode.right); + if (curNode.left) helperStack.push(curNode.left); + tempNode = curNode.left; + curNode.left = curNode.right; + curNode.right = tempNode; + } + return root; +}; + +// 迭代法(栈模拟中序遍历-统一写法形式) +function invertTree(root: TreeNode | null): TreeNode | null { + let helperStack: (TreeNode | null)[] = []; + let curNode: TreeNode | null, + tempNode: TreeNode | null; + if (root !== null) helperStack.push(root); + while (helperStack.length > 0) { + curNode = helperStack.pop(); + if (curNode !== null) { + if (curNode.right !== null) helperStack.push(curNode.right); + helperStack.push(curNode); + helperStack.push(null); + if (curNode.left !== null) helperStack.push(curNode.left); + } else { + curNode = helperStack.pop()!; + tempNode = curNode.left; + curNode.left = curNode.right; + curNode.right = tempNode; + } + } + return root; +}; + +// 迭代法(栈模拟后序遍历-统一写法形式) +function invertTree(root: TreeNode | null): TreeNode | null { + let helperStack: (TreeNode | null)[] = []; + let curNode: TreeNode | null, + tempNode: TreeNode | null; + if (root !== null) helperStack.push(root); + while (helperStack.length > 0) { + curNode = helperStack.pop(); + if (curNode !== null) { + helperStack.push(curNode); + helperStack.push(null); + if (curNode.right !== null) helperStack.push(curNode.right); + if (curNode.left !== null) helperStack.push(curNode.left); + } else { + curNode = helperStack.pop()!; + tempNode = curNode.left; + curNode.left = curNode.right; + curNode.right = tempNode; + } + } + return root; +}; + +// 迭代法(队列模拟层序遍历) +function invertTree(root: TreeNode | null): TreeNode | null { + const helperQueue: TreeNode[] = []; + let curNode: TreeNode, + tempNode: TreeNode | null; + if (root !== null) helperQueue.push(root); + while (helperQueue.length > 0) { + for (let i = 0, length = helperQueue.length; i < length; i++) { + curNode = helperQueue.shift()!; + tempNode = curNode.left; + curNode.left = curNode.right; + curNode.right = tempNode; + if (curNode.left !== null) helperQueue.push(curNode.left); + if (curNode.right !== null) helperQueue.push(curNode.right); + } + } + return root; +}; +``` + ### C: + 递归法 ```c struct TreeNode* invertTree(struct TreeNode* root){ From cee8536fa671b635f74edb1f7d296a5f2efc1bde Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sun, 30 Jan 2022 13:17:47 +0800 Subject: [PATCH 082/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880101.?= =?UTF-8?q?=E5=AF=B9=E7=A7=B0=E4=BA=8C=E5=8F=89=E6=A0=91.md=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0101.对称二叉树.md | 69 +++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/problems/0101.对称二叉树.md b/problems/0101.对称二叉树.md index 69bc41d3..e4e232c8 100644 --- a/problems/0101.对称二叉树.md +++ b/problems/0101.对称二叉树.md @@ -574,6 +574,75 @@ var isSymmetric = function(root) { }; ``` +## TypeScript: + +> 递归法 + +```typescript +function isSymmetric(root: TreeNode | null): boolean { + function recur(node1: TreeNode | null, node2: TreeNode | null): boolean { + if (node1 === null && node2 === null) return true; + if (node1 === null || node2 === null) return false; + if (node1.val !== node2.val) return false + let isSym1: boolean = recur(node1.left, node2.right); + let isSym2: boolean = recur(node1.right, node2.left); + return isSym1 && isSym2 + } + if (root === null) return true; + return recur(root.left, root.right); +}; +``` + +> 迭代法 + +```typescript +// 迭代法(队列) +function isSymmetric(root: TreeNode | null): boolean { + let helperQueue: (TreeNode | null)[] = []; + let tempNode1: TreeNode | null, + tempNode2: TreeNode | null; + if (root !== null) { + helperQueue.push(root.left); + helperQueue.push(root.right); + } + while (helperQueue.length > 0) { + tempNode1 = helperQueue.shift()!; + tempNode2 = helperQueue.shift()!; + if (tempNode1 === null && tempNode2 === null) continue; + if (tempNode1 === null || tempNode2 === null) return false; + if (tempNode1.val !== tempNode2.val) return false; + helperQueue.push(tempNode1.left); + helperQueue.push(tempNode2.right); + helperQueue.push(tempNode1.right); + helperQueue.push(tempNode2.left); + } + return true; +} + +// 迭代法(栈) +function isSymmetric(root: TreeNode | null): boolean { + let helperStack: (TreeNode | null)[] = []; + let tempNode1: TreeNode | null, + tempNode2: TreeNode | null; + if (root !== null) { + helperStack.push(root.left); + helperStack.push(root.right); + } + while (helperStack.length > 0) { + tempNode1 = helperStack.pop()!; + tempNode2 = helperStack.pop()!; + if (tempNode1 === null && tempNode2 === null) continue; + if (tempNode1 === null || tempNode2 === null) return false; + if (tempNode1.val !== tempNode2.val) return false; + helperStack.push(tempNode1.left); + helperStack.push(tempNode2.right); + helperStack.push(tempNode1.right); + helperStack.push(tempNode2.left); + } + return true; +}; +``` + ## Swift: > 递归 From 067f71cdf03858645ba70c5151a1d26f16d91928 Mon Sep 17 00:00:00 2001 From: zhicheng lee <904688436@qq.com> Date: Mon, 31 Jan 2022 11:54:59 +0800 Subject: [PATCH 083/328] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20=E8=83=8C=E5=8C=85?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80=E5=AE=8C?= =?UTF-8?q?=E5=85=A8=E8=83=8C=E5=8C=85.md=20Java=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加注释,去掉一个不必要的if语句 --- problems/背包问题理论基础完全背包.md | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/problems/背包问题理论基础完全背包.md b/problems/背包问题理论基础完全背包.md index f79310b8..cea69c72 100644 --- a/problems/背包问题理论基础完全背包.md +++ b/problems/背包问题理论基础完全背包.md @@ -183,11 +183,9 @@ private static void testCompletePack(){ int[] value = {15, 20, 30}; int bagWeight = 4; int[] dp = new int[bagWeight + 1]; - for (int i = 0; i < weight.length; i++){ - for (int j = 1; j <= bagWeight; j++){ - if (j - weight[i] >= 0){ - dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i]); - } + for (int i = 0; i < weight.length; i++){ // 遍历物品 + for (int j = weight[i]; j <= bagWeight; j++){ // 遍历背包容量 + dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i]); } } for (int maxValue : dp){ @@ -201,8 +199,8 @@ private static void testCompletePackAnotherWay(){ int[] value = {15, 20, 30}; int bagWeight = 4; int[] dp = new int[bagWeight + 1]; - for (int i = 1; i <= bagWeight; i++){ - for (int j = 0; j < weight.length; j++){ + for (int i = 1; i <= bagWeight; i++){ // 遍历背包容量 + for (int j = 0; j < weight.length; j++){ // 遍历物品 if (i - weight[j] >= 0){ dp[i] = Math.max(dp[i], dp[i - weight[j]] + value[j]); } From 46571a3b9c619ac39c93becab1c1325fe211b545 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Mon, 31 Jan 2022 14:51:28 +0800 Subject: [PATCH 084/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880104.?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84=E6=9C=80=E5=A4=A7=E6=B7=B1?= =?UTF-8?q?=E5=BA=A6.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0104.二叉树的最大深度.md | 48 +++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/problems/0104.二叉树的最大深度.md b/problems/0104.二叉树的最大深度.md index 7038598b..6875ec74 100644 --- a/problems/0104.二叉树的最大深度.md +++ b/problems/0104.二叉树的最大深度.md @@ -598,7 +598,55 @@ var maxDepth = function(root) { }; ``` +## TypeScript: + +> 二叉树的最大深度: + +```typescript +// 后续遍历(自下而上) +function maxDepth(root: TreeNode | null): number { + if (root === null) return 0; + return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1; +}; + +// 前序遍历(自上而下) +function maxDepth(root: TreeNode | null): number { + function recur(node: TreeNode | null, count: number) { + if (node === null) { + resMax = resMax > count ? resMax : count; + return; + } + recur(node.left, count + 1); + recur(node.right, count + 1); + } + let resMax: number = 0; + let count: number = 0; + recur(root, count); + return resMax; +}; + +// 层序遍历(迭代法) +function maxDepth(root: TreeNode | null): number { + let helperQueue: TreeNode[] = []; + let resDepth: number = 0; + let tempNode: TreeNode; + if (root !== null) helperQueue.push(root); + while (helperQueue.length > 0) { + resDepth++; + for (let i = 0, length = helperQueue.length; i < length; i++) { + tempNode = helperQueue.shift()!; + if (tempNode.left) helperQueue.push(tempNode.left); + if (tempNode.right) helperQueue.push(tempNode.right); + } + } + return resDepth; +}; +``` + + + ## C + 二叉树最大深度递归 ```c int maxDepth(struct TreeNode* root){ From 463f142f05d5759c8dfaa5f17dbebfa9ddf580f5 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Mon, 31 Jan 2022 16:07:01 +0800 Subject: [PATCH 085/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88559.n?= =?UTF-8?q?=E5=8F=89=E6=A0=91=E7=9A=84=E6=9C=80=E5=A4=A7=E6=B7=B1=E5=BA=A6?= =?UTF-8?q?=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0104.二叉树的最大深度.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/problems/0104.二叉树的最大深度.md b/problems/0104.二叉树的最大深度.md index 6875ec74..3eecdc92 100644 --- a/problems/0104.二叉树的最大深度.md +++ b/problems/0104.二叉树的最大深度.md @@ -643,7 +643,33 @@ function maxDepth(root: TreeNode | null): number { }; ``` +> N叉树的最大深度 +```typescript +// 后续遍历(自下而上) +function maxDepth(root: TreeNode | null): number { + if (root === null) return 0; + return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1; +}; + +// 前序遍历(自上而下) +function maxDepth(root: TreeNode | null): number { + function recur(node: TreeNode | null, count: number) { + if (node === null) { + resMax = resMax > count ? resMax : count; + return; + } + recur(node.left, count + 1); + recur(node.right, count + 1); + } + let resMax: number = 0; + let count: number = 0; + recur(root, count); + return resMax; +}; + + +``` ## C From e4f674c61e71a7b33ec97e22acc6b7a44e075b6e Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Tue, 1 Feb 2022 20:04:51 +0800 Subject: [PATCH 086/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880111.?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84=E6=9C=80=E5=B0=8F=E6=B7=B1?= =?UTF-8?q?=E5=BA=A6.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0111.二叉树的最小深度.md | 38 +++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/problems/0111.二叉树的最小深度.md b/problems/0111.二叉树的最小深度.md index a439322a..224caa5e 100644 --- a/problems/0111.二叉树的最小深度.md +++ b/problems/0111.二叉树的最小深度.md @@ -404,6 +404,44 @@ var minDepth = function(root) { }; ``` +## TypeScript + +> 递归法 + +```typescript +function minDepth(root: TreeNode | null): number { + if (root === null) return 0; + if (root.left !== null && root.right === null) { + return 1 + minDepth(root.left); + } + if (root.left === null && root.right !== null) { + return 1 + minDepth(root.right); + } + return 1 + Math.min(minDepth(root.left), minDepth(root.right)); +} +``` + +> 迭代法 + +```typescript +function minDepth(root: TreeNode | null): number { + let helperQueue: TreeNode[] = []; + let resMin: number = 0; + let tempNode: TreeNode; + if (root !== null) helperQueue.push(root); + while (helperQueue.length > 0) { + resMin++; + for (let i = 0, length = helperQueue.length; i < length; i++) { + tempNode = helperQueue.shift()!; + if (tempNode.left === null && tempNode.right === null) return resMin; + if (tempNode.left !== null) helperQueue.push(tempNode.left); + if (tempNode.right !== null) helperQueue.push(tempNode.right); + } + } + return resMin; +}; +``` + ## Swift > 递归 From 8ac7cdce22a6f350ec57627e474bd482f5d041b3 Mon Sep 17 00:00:00 2001 From: hutbzc <3260189532@qq.com> Date: Tue, 1 Feb 2022 23:01:36 +0800 Subject: [PATCH 087/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880045.?= =?UTF-8?q?=E8=B7=B3=E8=B7=83=E6=B8=B8=E6=88=8FII.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E8=A1=A5=E5=85=85Java=E7=89=88=E6=9C=AC2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0045.跳跃游戏II.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/problems/0045.跳跃游戏II.md b/problems/0045.跳跃游戏II.md index a39c064a..7a3f048c 100644 --- a/problems/0045.跳跃游戏II.md +++ b/problems/0045.跳跃游戏II.md @@ -142,6 +142,7 @@ public: ### Java ```Java +// 版本一 class Solution { public int jump(int[] nums) { if (nums == null || nums.length == 0 || nums.length == 1) { @@ -172,7 +173,30 @@ class Solution { } ``` +```java +// 版本二 +class Solution { + public int jump(int[] nums) { + int result = 0; + // 当前覆盖的最远距离下标 + int end = 0; + // 下一步覆盖的最远距离下标 + int temp = 0; + for (int i = 0; i <= end && end < nums.length - 1; ++i) { + temp = Math.max(temp, i + nums[i]); + // 可达位置的改变次数就是跳跃次数 + if (i == end) { + end = temp; + result++; + } + } + return result; + } +} +``` + ### Python + ```python class Solution: def jump(self, nums: List[int]) -> int: From 40c06155f9e65e3525100ac6aff6f3ce6aeb8dac Mon Sep 17 00:00:00 2001 From: hutbzc <3260189532@qq.com> Date: Tue, 1 Feb 2022 23:04:07 +0800 Subject: [PATCH 088/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880139.?= =?UTF-8?q?=E5=8D=95=E8=AF=8D=E6=8B=86=E5=88=86.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0Java=E5=9B=9E=E5=9B=9E=E6=BA=AF+=E8=AE=B0?= =?UTF-8?q?=E5=BF=86=E5=8C=96=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0139.单词拆分.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/problems/0139.单词拆分.md b/problems/0139.单词拆分.md index e24ffc1a..1653a81a 100644 --- a/problems/0139.单词拆分.md +++ b/problems/0139.单词拆分.md @@ -248,6 +248,36 @@ class Solution { return valid[s.length()]; } } + +// 回溯法+记忆化 +class Solution { + public boolean wordBreak(String s, List wordDict) { + Set wordDictSet = new HashSet(wordDict); + int[] memory = new int[s.length()]; + return backTrack(s, wordDictSet, 0, memory); + } + + public boolean backTrack(String s, Set wordDictSet, int startIndex, int[] memory) { + // 结束条件 + if (startIndex >= s.length()) { + return true; + } + if (memory[startIndex] != 0) { + // 此处认为:memory[i] = 1 表示可以拼出i 及以后的字符子串, memory[i] = -1 表示不能 + return memory[startIndex] == 1 ? true : false; + } + for (int i = startIndex; i < s.length(); ++i) { + // 处理 递归 回溯 循环不变量:[startIndex, i + 1) + String word = s.substring(startIndex, i + 1); + if (wordDictSet.contains(word) && backTrack(s, wordDictSet, i + 1, memory)) { + memory[startIndex] = 1; + return true; + } + } + memory[startIndex] = -1; + return false; + } +} ``` Python: From 5a2ff02b94d417a7a51d44998e212913afeba48b Mon Sep 17 00:00:00 2001 From: hutbzc <3260189532@qq.com> Date: Tue, 1 Feb 2022 23:08:56 +0800 Subject: [PATCH 089/328] =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=880376.?= =?UTF-8?q?=E6=91=86=E5=8A=A8=E5=BA=8F=E5=88=97.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86=E9=80=BB=E8=BE=91=E5=B0=8F=E9=94=99?= =?UTF-8?q?=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0376.摆动序列.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/0376.摆动序列.md b/problems/0376.摆动序列.md index 2bc23182..d75311eb 100644 --- a/problems/0376.摆动序列.md +++ b/problems/0376.摆动序列.md @@ -174,7 +174,7 @@ public: ```Java class Solution { public int wiggleMaxLength(int[] nums) { - if (nums == null || nums.length <= 1) { + if (nums.length <= 1) { return nums.length; } //当前差值 From 2f1c56e6dd34a5a8ae89a8401219a0ce2dd623f3 Mon Sep 17 00:00:00 2001 From: Xiaofei-fei Date: Wed, 2 Feb 2022 18:47:01 +0800 Subject: [PATCH 090/328] =?UTF-8?q?494=E9=A2=98python=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 0 -> 8196 bytes problems/0494.目标和.md | 3 ++- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..7794435bd6714aed6095604325ab6ffe84221748 GIT binary patch literal 8196 zcmeHMU2GIp6u#fIv@>*|1GG|b$8K6szzU`1r~D<`KM+bOc3ZkFVA<^sbYMDDcV^o{ zC8_Z*g7~0DeNjN;ix1VP7!wtvi3asattOIaj7FnRKFACD;<m0CQ8r?%*`* zup!Jqn1L_@VFtnsgc#mK>qC@oE@Ocl6VhKgsPK;f zB>54*zv!9H0lrT(kg-6H3F*61pW^g@z!kv}1Hzs3QEpB$7RWIng*$_AX9z|{a6*AU zI{8I?bB36ZVHsv1%)s;vaQet>kY$*|QrDl~QTewYB!ubsmP_3Yqqra9{olWg+mlT+n{GUw!6>BxFmbE zVwVEl+2`1MGX~dp^*L5{z;=7J1${}YFKZ<|qu#RO<_Uw^irv19V_AD0*W}%FCp=@s z+c#eT{C4F9d>fSP!^y{nJ6w>vh?lONbu4&8|RHg%m zmHORkhfBfBT2dIUR;$&HV*~|7b45$7x?bVg$!AiU;v1PT@4p;3+(h7x5C#;XGc$n|KQs@D4u2 zC47d@@il(J&-ewu;tyQKU-(*}`EPl8aOHV4$};qPPqUrg~a?_**LUMB<#)$$zerqZ#K$YPAhoU&S> zu&z*-$r>?ej;P+Hu9USFMJo{1s>o{MrL0MQRb3mYRkWn6<%w!lWTPT$5S7j9R?b5$ zUsQE9rYIWoE0M-XGv|^f6Uxsu`LjI>%9Uv=l#lj1Ssi`Gb+E&<$vniKWM>KOAFzw; zOLm$4$bMs22=4`ibPeTLfog0(4BN2-yU>DG>_Zp2(L-oAaM(xuF?h&gm{5NL591L$ zhR5*)p2jnH7SG`$w)*YO6S|2@2qi-i7<@G-u?1it6^4^W#!bE~N5N?f6* zX=ombXKc%{kB~0smvguYWuAEFGJgJVp8fa#n=rEQmBS2#8ThXmKz>uase!C#ThsVi zJ4*K literal 0 HcmV?d00001 diff --git a/problems/0494.目标和.md b/problems/0494.目标和.md index 0faef4a5..f190b734 100644 --- a/problems/0494.目标和.md +++ b/problems/0494.目标和.md @@ -272,7 +272,8 @@ Python: class Solution: def findTargetSumWays(self, nums: List[int], target: int) -> int: sumValue = sum(nums) - if target > sumValue or (sumValue + target) % 2 == 1: return 0 + #注意边界条件为 target>sumValue or target<-sumValue or (sumValue + target) % 2 == 1 + if abs(target) > sumValue or (sumValue + target) % 2 == 1: return 0 bagSize = (sumValue + target) // 2 dp = [0] * (bagSize + 1) dp[0] = 1 From 38c8b6849f32b47d59fc9ed5d1b394dda745b277 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Thu, 3 Feb 2022 20:03:43 +0800 Subject: [PATCH 091/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880222.?= =?UTF-8?q?=E5=AE=8C=E5=85=A8=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E4=B8=AA=E6=95=B0.md=EF=BC=89=EF=BC=9A=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0222.完全二叉树的节点个数.md | 60 ++++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git a/problems/0222.完全二叉树的节点个数.md b/problems/0222.完全二叉树的节点个数.md index 8d38bace..ffbc32ff 100644 --- a/problems/0222.完全二叉树的节点个数.md +++ b/problems/0222.完全二叉树的节点个数.md @@ -447,7 +447,63 @@ var countNodes = function(root) { }; ``` +## TypeScrpt: + +> 递归法 + +```typescript +function countNodes(root: TreeNode | null): number { + if (root === null) return 0; + return 1 + countNodes(root.left) + countNodes(root.right); +}; +``` + +> 迭代法 + +```typescript +function countNodes(root: TreeNode | null): number { + let helperQueue: TreeNode[] = []; + let resCount: number = 0; + let tempNode: TreeNode; + if (root !== null) helperQueue.push(root); + while (helperQueue.length > 0) { + for (let i = 0, length = helperQueue.length; i < length; i++) { + tempNode = helperQueue.shift()!; + resCount++; + if (tempNode.left) helperQueue.push(tempNode.left); + if (tempNode.right) helperQueue.push(tempNode.right); + } + } + return resCount; +}; +``` + +> 利用完全二叉树性质 + +```typescript +function countNodes(root: TreeNode | null): number { + if (root === null) return 0; + let left: number = 0, + right: number = 0; + let curNode: TreeNode | null= root; + while (curNode !== null) { + left++; + curNode = curNode.left; + } + curNode = root; + while (curNode !== null) { + right++; + curNode = curNode.right; + } + if (left === right) { + return 2 ** left - 1; + } + return 1 + countNodes(root.left) + countNodes(root.right); +}; +``` + ## C: + 递归法 ```c int countNodes(struct TreeNode* root) { @@ -538,7 +594,7 @@ func _countNodes(_ root: TreeNode?) -> Int { return 1 + leftCount + rightCount } ``` - + > 层序遍历 ```Swift func countNodes(_ root: TreeNode?) -> Int { @@ -564,7 +620,7 @@ func countNodes(_ root: TreeNode?) -> Int { return res } ``` - + > 利用完全二叉树性质 ```Swift func countNodes(_ root: TreeNode?) -> Int { From ea5a011d783073dc0f98bd5d0a0130c97a02153c Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sat, 5 Feb 2022 13:04:38 +0800 Subject: [PATCH 092/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880110.?= =?UTF-8?q?=E5=B9=B3=E8=A1=A1=E4=BA=8C=E5=8F=89=E6=A0=91.md=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0110.平衡二叉树.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/problems/0110.平衡二叉树.md b/problems/0110.平衡二叉树.md index 9d43407a..8a701bb3 100644 --- a/problems/0110.平衡二叉树.md +++ b/problems/0110.平衡二叉树.md @@ -627,7 +627,26 @@ var isBalanced = function(root) { }; ``` +## TypeScript + +```typescript +// 递归法 +function isBalanced(root: TreeNode | null): boolean { + function getDepth(root: TreeNode | null): number { + if (root === null) return 0; + let leftDepth: number = getDepth(root.left); + if (leftDepth === -1) return -1; + let rightDepth: number = getDepth(root.right); + if (rightDepth === -1) return -1; + if (Math.abs(leftDepth - rightDepth) > 1) return -1; + return 1 + Math.max(leftDepth, rightDepth); + } + return getDepth(root) !== -1; +}; +``` + ## C + 递归法: ```c int getDepth(struct TreeNode* node) { From f9e5bce7d7b8b53d266ba082036677b30d092696 Mon Sep 17 00:00:00 2001 From: jobinben <1021137079@qq.com> Date: Sun, 6 Feb 2022 18:36:14 +0800 Subject: [PATCH 093/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E9=9D=A2=E8=AF=95?= =?UTF-8?q?=E9=A2=9802.07.=E9=93=BE=E8=A1=A8=E7=9B=B8=E4=BA=A4.md=20JavaSc?= =?UTF-8?q?ript=E8=AF=AD=E8=A8=80=E8=A7=A3=E6=B3=95=E7=9A=84=E6=B3=A8?= =?UTF-8?q?=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/面试题02.07.链表相交.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/problems/面试题02.07.链表相交.md b/problems/面试题02.07.链表相交.md index dd91f069..2e7226de 100644 --- a/problems/面试题02.07.链表相交.md +++ b/problems/面试题02.07.链表相交.md @@ -224,12 +224,14 @@ var getIntersectionNode = function(headA, headB) { lenA = getListLen(headA), lenB = getListLen(headB); if(lenA < lenB) { + // 下面交换变量注意加 “分号” ,两个数组交换变量在同一个作用域下时 + // 如果不加分号,下面两条代码等同于一条代码: [curA, curB] = [lenB, lenA] [curA, curB] = [curB, curA]; [lenA, lenB] = [lenB, lenA]; } let i = lenA - lenB; while(i-- > 0) { - curA = curA.next + curA = curA.next; } while(curA && curA !== curB) { curA = curA.next; From 343ddb37f9e84284ff8df34f89bed18522244e43 Mon Sep 17 00:00:00 2001 From: bqlin Date: Mon, 20 Dec 2021 20:13:42 +0800 Subject: [PATCH 094/328] =?UTF-8?q?1047.=E5=88=A0=E9=99=A4=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E4=B8=B2=E4=B8=AD=E7=9A=84=E6=89=80=E6=9C=89=E7=9B=B8?= =?UTF-8?q?=E9=82=BB=E9=87=8D=E5=A4=8D=E9=A1=B9=EF=BC=9A=E4=BC=98=E5=8C=96?= =?UTF-8?q?Swift=E7=89=88=E6=9C=AC=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/1047.删除字符串中的所有相邻重复项.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/problems/1047.删除字符串中的所有相邻重复项.md b/problems/1047.删除字符串中的所有相邻重复项.md index d6eefd07..9309aed8 100644 --- a/problems/1047.删除字符串中的所有相邻重复项.md +++ b/problems/1047.删除字符串中的所有相邻重复项.md @@ -322,14 +322,12 @@ char * removeDuplicates(char * s){ Swift: ```swift func removeDuplicates(_ s: String) -> String { - let array = Array(s) var stack = [Character]() - for c in array { - let last: Character? = stack.last - if stack.isEmpty || last != c { - stack.append(c) - } else { + for c in s { + if stack.last == c { stack.removeLast() + } else { + stack.append(c) } } return String(stack) From 2aa31ce54bcb186376a1341d8ef91282a8db4c6f Mon Sep 17 00:00:00 2001 From: bqlin Date: Mon, 20 Dec 2021 21:42:07 +0800 Subject: [PATCH 095/328] =?UTF-8?q?0239.=E6=BB=91=E5=8A=A8=E7=AA=97?= =?UTF-8?q?=E5=8F=A3=E6=9C=80=E5=A4=A7=E5=80=BC=EF=BC=9A=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=8E=92=E7=89=88=EF=BC=8C=E8=A1=A5=E5=85=85Swift=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0239.滑动窗口最大值.md | 36 ++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/problems/0239.滑动窗口最大值.md b/problems/0239.滑动窗口最大值.md index d9788f63..d7a94b5a 100644 --- a/problems/0239.滑动窗口最大值.md +++ b/problems/0239.滑动窗口最大值.md @@ -45,7 +45,7 @@ 这个队列应该长这个样子: -``` +```cpp class MyQueue { public: void pop(int value) { @@ -525,5 +525,39 @@ class Solution { } ``` +Swift解法二: + +```swift +func maxSlidingWindow(_ nums: [Int], _ k: Int) -> [Int] { + var result = [Int]() + var window = [Int]() + var right = 0, left = right - k + 1 + + while right < nums.count { + let value = nums[right] + + // 因为窗口移动丢弃的左边数 + if left > 0, left - 1 == window.first { + window.removeFirst() + } + + // 保证末尾的是最大的 + while !window.isEmpty, value > nums[window.last!] { + window.removeLast() + } + window.append(right) + + if left >= 0 { // 窗口形成 + result.append(nums[window.first!]) + } + + right += 1 + left += 1 + } + + return result +} +``` + -----------------------
From 40dc0d5e65fc36833c9d3fc77bba45606e83f739 Mon Sep 17 00:00:00 2001 From: bqlin Date: Mon, 20 Dec 2021 21:48:45 +0800 Subject: [PATCH 096/328] =?UTF-8?q?=E6=A0=88=E4=B8=8E=E9=98=9F=E5=88=97?= =?UTF-8?q?=E6=80=BB=E7=BB=93=EF=BC=9A=E4=BC=98=E5=8C=96=E6=8E=92=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/栈与队列总结.md | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/problems/栈与队列总结.md b/problems/栈与队列总结.md index 8ec96a29..15093ca7 100644 --- a/problems/栈与队列总结.md +++ b/problems/栈与队列总结.md @@ -158,22 +158,5 @@ cd a/b/c/../../ 好了,栈与队列我们就总结到这里了,接下来Carl就要带大家开启新的篇章了,大家加油! - - - -## 其他语言版本 - - -Java: - - -Python: - - -Go: - - - - -----------------------
From c88aee12e53a301ede5ed3fa81023d98c1ce009b Mon Sep 17 00:00:00 2001 From: bqlin Date: Tue, 21 Dec 2021 11:29:56 +0800 Subject: [PATCH 097/328] =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=90=86?= =?UTF-8?q?=E8=AE=BA=E5=9F=BA=E7=A1=80=EF=BC=9A=E4=BC=98=E5=8C=96=E6=8E=92?= =?UTF-8?q?=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/二叉树理论基础.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/problems/二叉树理论基础.md b/problems/二叉树理论基础.md index cc899850..c5dd118b 100644 --- a/problems/二叉树理论基础.md +++ b/problems/二叉树理论基础.md @@ -154,7 +154,7 @@ C++代码如下: -``` +```cpp struct TreeNode { int val; TreeNode *left; @@ -163,7 +163,7 @@ struct TreeNode { }; ``` -大家会发现二叉树的定义 和链表是差不多的,相对于链表 ,二叉树的节点里多了一个指针, 有两个指针,指向左右孩子. +大家会发现二叉树的定义 和链表是差不多的,相对于链表 ,二叉树的节点里多了一个指针, 有两个指针,指向左右孩子。 这里要提醒大家要注意二叉树节点定义的书写方式。 @@ -177,7 +177,7 @@ struct TreeNode { 本篇我们介绍了二叉树的种类、存储方式、遍历方式以及定义,比较全面的介绍了二叉树各个方面的重点,帮助大家扫一遍基础。 -**说道二叉树,就不得不说递归,很多同学对递归都是又熟悉又陌生,递归的代码一般很简短,但每次都是一看就会,一写就废。** +**说到二叉树,就不得不说递归,很多同学对递归都是又熟悉又陌生,递归的代码一般很简短,但每次都是一看就会,一写就废。** ## 其他语言版本 From be6c45c636556b1c0d3838f265fe7830ca4f00ff Mon Sep 17 00:00:00 2001 From: jobinben <1021137079@qq.com> Date: Sun, 6 Feb 2022 19:06:51 +0800 Subject: [PATCH 098/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200110.=E5=B9=B3?= =?UTF-8?q?=E8=A1=A1=E4=BA=8C=E5=8F=89=E6=A0=91.md=20JavaScript=E8=AF=AD?= =?UTF-8?q?=E8=A8=80=E7=89=88=E6=9C=AC=E7=9A=84=E8=BF=AD=E4=BB=A3=E8=A7=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0110.平衡二叉树.md | 45 ++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/problems/0110.平衡二叉树.md b/problems/0110.平衡二叉树.md index 9d43407a..8a11c013 100644 --- a/problems/0110.平衡二叉树.md +++ b/problems/0110.平衡二叉树.md @@ -604,7 +604,8 @@ func abs(a int)int{ } ``` -## JavaScript +## JavaScript +递归法: ```javascript var isBalanced = function(root) { //还是用递归三部曲 + 后序遍历 左右中 当前左子树右子树高度相差大于1就返回-1 @@ -627,6 +628,48 @@ var isBalanced = function(root) { }; ``` +迭代法: +```javascript +// 获取当前节点的高度 +var getHeight = function (curNode) { + let queue = []; + if (curNode !== null) queue.push(curNode); // 压入当前元素 + let depth = 0, res = 0; + while (queue.length) { + let node = queue[queue.length - 1]; // 取出栈顶 + if (node !== null) { + queue.pop(); + queue.push(node); // 中 + queue.push(null); + depth++; + node.right && queue.push(node.right); // 右 + node.left && queue.push(node.left); // 左 + } else { + queue.pop(); + node = queue[queue.length - 1]; + queue.pop(); + depth--; + } + res = res > depth ? res : depth; + } + return res; +} +var isBalanced = function (root) { + if (root === null) return true; + let queue = [root]; + while (queue.length) { + let node = queue[queue.length - 1]; // 取出栈顶 + queue.pop(); + if (Math.abs(getHeight(node.left) - getHeight(node.right)) > 1) { + return false; + } + node.right && queue.push(node.right); + node.left && queue.push(node.left); + } + return true; +}; +``` + ## C 递归法: ```c From f1a3fbc78851c01bb2b97cf004c85b3d15f41970 Mon Sep 17 00:00:00 2001 From: Anmizi <1845513904@qq.com> Date: Sun, 6 Feb 2022 23:33:11 +0800 Subject: [PATCH 099/328] =?UTF-8?q?Update=200110.=E5=B9=B3=E8=A1=A1?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改原有JS版本代码问题 --- problems/0110.平衡二叉树.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/problems/0110.平衡二叉树.md b/problems/0110.平衡二叉树.md index 9d43407a..313aeff2 100644 --- a/problems/0110.平衡二叉树.md +++ b/problems/0110.平衡二叉树.md @@ -614,8 +614,10 @@ var isBalanced = function(root) { if(node === null) return 0; // 3. 确定单层递归逻辑 let leftDepth = getDepth(node.left); //左子树高度 - let rightDepth = getDepth(node.right); //右子树高度 + // 当判定左子树不为平衡二叉树时,即可直接返回-1 if(leftDepth === -1) return -1; + let rightDepth = getDepth(node.right); //右子树高度 + // 当判定右子树不为平衡二叉树时,即可直接返回-1 if(rightDepth === -1) return -1; if(Math.abs(leftDepth - rightDepth) > 1) { return -1; From 8ce87963e5fe7e74657109d71c80ce3ce3b07da6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=81=E5=AE=A2=E5=AD=A6=E4=BC=9F?= Date: Mon, 7 Feb 2022 13:29:05 +0800 Subject: [PATCH 100/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=EF=BC=9A=E4=BB=A5=E4=B8=BA=E4=BD=BF=E7=94=A8=E4=BA=86?= =?UTF-8?q?=E9=80=92=E5=BD=92=EF=BC=8C=E5=85=B6=E5=AE=9E=E8=BF=98=E9=9A=90?= =?UTF-8?q?=E8=97=8F=E7=9D=80=E5=9B=9E=E6=BA=AF=20Swift=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/二叉树中递归带着回溯.md | 55 ++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/problems/二叉树中递归带着回溯.md b/problems/二叉树中递归带着回溯.md index 20b87f87..603854dc 100644 --- a/problems/二叉树中递归带着回溯.md +++ b/problems/二叉树中递归带着回溯.md @@ -515,6 +515,61 @@ var binaryTreePaths = function(root) { }; ``` +Swift: +> 100.相同的树 +```swift +// 递归 +func isSameTree(_ p: TreeNode?, _ q: TreeNode?) -> Bool { + return _isSameTree3(p, q) +} +func _isSameTree3(_ p: TreeNode?, _ q: TreeNode?) -> Bool { + if p == nil && q == nil { + return true + } else if p == nil && q != nil { + return false + } else if p != nil && q == nil { + return false + } else if p!.val != q!.val { + return false + } + let leftSide = _isSameTree3(p!.left, q!.left) + let rightSide = _isSameTree3(p!.right, q!.right) + return leftSide && rightSide +} +``` + +> 257.二叉树的不同路径 +```swift +// 递归/回溯 +func binaryTreePaths(_ root: TreeNode?) -> [String] { + var res = [String]() + guard let root = root else { + return res + } + var paths = [Int]() + _binaryTreePaths3(root, res: &res, paths: &paths) + return res +} +func _binaryTreePaths3(_ root: TreeNode, res: inout [String], paths: inout [Int]) { + paths.append(root.val) + if root.left == nil && root.right == nil { + var str = "" + for i in 0 ..< (paths.count - 1) { + str.append("\(paths[i])->") + } + str.append("\(paths.last!)") + res.append(str) + } + if let left = root.left { + _binaryTreePaths3(left, res: &res, paths: &paths) + paths.removeLast() + } + if let right = root.right { + _binaryTreePaths3(right, res: &res, paths: &paths) + paths.removeLast() + } +} +``` -----------------------
From 3aa54bfb8a8604a8cfb05a4fa8c606ebe6b09db3 Mon Sep 17 00:00:00 2001 From: Wayne <3522373084@qq.com> Date: Mon, 7 Feb 2022 21:39:51 +0800 Subject: [PATCH 101/328] =?UTF-8?q?343=E6=95=B4=E6=95=B0=E6=8B=86=E5=88=86?= =?UTF-8?q?,=E6=9B=B4=E6=96=B0=E7=AC=AC=E4=BA=8C=E5=B1=82=E5=BE=AA?= =?UTF-8?q?=E7=8E=AF=20j=20=E7=9A=84=E8=8C=83=E5=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0343.整数拆分.md | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/problems/0343.整数拆分.md b/problems/0343.整数拆分.md index 5d11f670..f616a606 100644 --- a/problems/0343.整数拆分.md +++ b/problems/0343.整数拆分.md @@ -197,14 +197,17 @@ Java: ```Java class Solution { public int integerBreak(int n) { - //dp[i]为正整数i拆分结果的最大乘积 - int[] dp = new int[n+1]; - dp[2] = 1; - for (int i = 3; i <= n; ++i) { - for (int j = 1; j < i - 1; ++j) { - //j*(i-j)代表把i拆分为j和i-j两个数相乘 - //j*dp[i-j]代表把i拆分成j和继续把(i-j)这个数拆分,取(i-j)拆分结果中的最大乘积与j相乘 - dp[i] = Math.max(dp[i], Math.max(j * (i - j), j * dp[i - j])); + //dp[i] 为正整数 i 拆分后的结果的最大乘积 + int[]dp=new int[n+1]; + dp[2]=1; + for(int i=3;i<=n;i++){ + for(int j=1;j<=i-j;j++){ + // 这里的 j 其实最大值为 i-j,再大只不过是重复而已, + //并且,在本题中,我们分析 dp[0], dp[1]都是无意义的, + //j 最大到 i-j,就不会用到 dp[0]与dp[1] + dp[i]=Math.max(dp[i],Math.max(j*(i-j),j*dp[i-j])); + // j * (i - j) 是单纯的把整数 i 拆分为两个数 也就是 i,i-j ,再相乘 + //而j * dp[i - j]是将 i 拆分成两个以及两个以上的个数,再相乘。 } } return dp[n]; From 1b7c86e20c2b36ed0732deb66a0c124a8e8fcdff Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Mon, 7 Feb 2022 23:01:47 +0800 Subject: [PATCH 102/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880257.?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84=E6=89=80=E6=9C=89=E8=B7=AF?= =?UTF-8?q?=E5=BE=84.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0257.二叉树的所有路径.md | 67 ++++++++++++++++++++++++++++--- 1 file changed, 61 insertions(+), 6 deletions(-) diff --git a/problems/0257.二叉树的所有路径.md b/problems/0257.二叉树的所有路径.md index 4078320f..1362897c 100644 --- a/problems/0257.二叉树的所有路径.md +++ b/problems/0257.二叉树的所有路径.md @@ -433,9 +433,9 @@ class Solution: if cur.right: self.traversal(cur.right, path + '->', result) ``` - + 迭代法: - + ```python3 from collections import deque @@ -463,13 +463,13 @@ class Solution: return result ``` - + --- Go: - + 递归法: - + ```go func binaryTreePaths(root *TreeNode) []string { res := make([]string, 0) @@ -492,7 +492,7 @@ func binaryTreePaths(root *TreeNode) []string { return res } ``` - + 迭代法: ```go @@ -581,7 +581,62 @@ var binaryTreePaths = function(root) { }; ``` +TypeScript: + +> 递归法 + +```typescript +function binaryTreePaths(root: TreeNode | null): string[] { + function recur(node: TreeNode, route: string, resArr: string[]): void { + route += String(node.val); + if (node.left === null && node.right === null) { + resArr.push(route); + return; + } + if (node.left !== null) recur(node.left, route + '->', resArr); + if (node.right !== null) recur(node.right, route + '->', resArr); + } + const resArr: string[] = []; + if (root === null) return resArr; + recur(root, '', resArr); + return resArr; +}; +``` + +> 迭代法 + +```typescript +// 迭代法2 +function binaryTreePaths(root: TreeNode | null): string[] { + let helperStack: TreeNode[] = []; + let tempNode: TreeNode; + let routeArr: string[] = []; + let resArr: string[] = []; + if (root !== null) { + helperStack.push(root); + routeArr.push(String(root.val)); + }; + while (helperStack.length > 0) { + tempNode = helperStack.pop()!; + let route: string = routeArr.pop()!; // tempNode 对应的路径 + if (tempNode.left === null && tempNode.right === null) { + resArr.push(route); + } + if (tempNode.right !== null) { + helperStack.push(tempNode.right); + routeArr.push(route + '->' + tempNode.right.val); // tempNode.right 对应的路径 + } + if (tempNode.left !== null) { + helperStack.push(tempNode.left); + routeArr.push(route + '->' + tempNode.left.val); // tempNode.left 对应的路径 + } + } + return resArr; +}; +``` + Swift: + > 递归/回溯 ```swift func binaryTreePaths(_ root: TreeNode?) -> [String] { From 47818c947888ecff3dae6f36daded1cfaf92db3b Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Tue, 8 Feb 2022 10:23:59 +0800 Subject: [PATCH 103/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=E4=B8=AD=E9=80=92=E5=BD=92=E5=B8=A6=E7=9D=80?= =?UTF-8?q?=E5=9B=9E=E6=BA=AF.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E7=9B=B8=E5=90=8C=E7=9A=84=E6=A0=91typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/二叉树中递归带着回溯.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/problems/二叉树中递归带着回溯.md b/problems/二叉树中递归带着回溯.md index 20b87f87..03815ed3 100644 --- a/problems/二叉树中递归带着回溯.md +++ b/problems/二叉树中递归带着回溯.md @@ -515,6 +515,29 @@ var binaryTreePaths = function(root) { }; ``` +TypeScript: + +> 相同的树 + +```typescript +function isSameTree(p: TreeNode | null, q: TreeNode | null): boolean { + if (p === null && q === null) return true; + if (p === null || q === null) return false; + if (p.val !== q.val) return false; + let bool1: boolean, bool2: boolean; + bool1 = isSameTree(p.left, q.left); + bool2 = isSameTree(p.right, q.right); + return bool1 && bool2; +}; +``` + +> 二叉树的不同路径 + +```typescript +``` + + + -----------------------
From 49a1a42bbed494b10b4d6659ba787830f62bd842 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Tue, 8 Feb 2022 10:45:15 +0800 Subject: [PATCH 104/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=E4=B8=AD=E9=80=92=E5=BD=92=E5=B8=A6=E7=9D=80?= =?UTF-8?q?=E5=9B=9E=E6=BA=AF.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84=E4=B8=8D=E5=90=8C=E8=B7=AF?= =?UTF-8?q?=E5=BE=84=E7=9A=84typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/二叉树中递归带着回溯.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/problems/二叉树中递归带着回溯.md b/problems/二叉树中递归带着回溯.md index 03815ed3..41d5663e 100644 --- a/problems/二叉树中递归带着回溯.md +++ b/problems/二叉树中递归带着回溯.md @@ -534,6 +534,27 @@ function isSameTree(p: TreeNode | null, q: TreeNode | null): boolean { > 二叉树的不同路径 ```typescript +function binaryTreePaths(root: TreeNode | null): string[] { + function recur(node: TreeNode, nodeSeqArr: number[], resArr: string[]): void { + nodeSeqArr.push(node.val); + if (node.left === null && node.right === null) { + resArr.push(nodeSeqArr.join('->')); + } + if (node.left !== null) { + recur(node.left, nodeSeqArr, resArr); + nodeSeqArr.pop(); + } + if (node.right !== null) { + recur(node.right, nodeSeqArr, resArr); + nodeSeqArr.pop(); + } + } + let nodeSeqArr: number[] = []; + let resArr: string[] = []; + if (root === null) return resArr; + recur(root, nodeSeqArr, resArr); + return resArr; +}; ``` From f604aea34c6632e20ad4ced37cb24c005420e574 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Tue, 8 Feb 2022 23:00:31 +0800 Subject: [PATCH 105/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880404.?= =?UTF-8?q?=E5=B7=A6=E5=8F=B6=E5=AD=90=E4=B9=8B=E5=92=8C.md=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0404.左叶子之和.md | 44 +++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/problems/0404.左叶子之和.md b/problems/0404.左叶子之和.md index 09272052..2b4df151 100644 --- a/problems/0404.左叶子之和.md +++ b/problems/0404.左叶子之和.md @@ -372,6 +372,50 @@ var sumOfLeftLeaves = function(root) { }; ``` +## TypeScript + +> 递归法 + +```typescript +function sumOfLeftLeaves(root: TreeNode | null): number { + if (root === null) return 0; + let midVal: number = 0; + if ( + root.left !== null && + root.left.left === null && + root.left.right === null + ) { + midVal = root.left.val; + } + let leftVal: number = sumOfLeftLeaves(root.left); + let rightVal: number = sumOfLeftLeaves(root.right); + return midVal + leftVal + rightVal; +}; +``` + +> 迭代法 + +```typescript +function sumOfLeftLeaves(root: TreeNode | null): number { + let helperStack: TreeNode[] = []; + let tempNode: TreeNode; + let sum: number = 0; + if (root !== null) helperStack.push(root); + while (helperStack.length > 0) { + tempNode = helperStack.pop()!; + if ( + tempNode.left !== null && + tempNode.left.left === null && + tempNode.left.right === null + ) { + sum += tempNode.left.val; + } + if (tempNode.right !== null) helperStack.push(tempNode.right); + if (tempNode.left !== null) helperStack.push(tempNode.left); + } + return sum; +}; +``` ## Swift From 81c1060ad7b21cab48d3f27aea802135544a73ff Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Wed, 9 Feb 2022 14:57:04 +0800 Subject: [PATCH 106/328] Update --- README.md | 9 +++++---- problems/前序/程序员写文档工具.md | 1 - problems/背包理论基础01背包-2.md | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index c5149776..c1761f7b 100644 --- a/README.md +++ b/README.md @@ -5,10 +5,11 @@ > 1. **介绍**:本项目是一套完整的刷题计划,旨在帮助大家少走弯路,循序渐进学算法,[关注作者](#关于作者) > 2. **PDF版本** : [「代码随想录」算法精讲 PDF 版本](https://programmercarl.com/other/algo_pdf.html) 。 -> 3. **刷题顺序** : README已经将刷题顺序排好了,按照顺序一道一道刷就可以。 -> 4. **学习社区** : 一起学习打卡/面试技巧/如何选择offer/大厂内推/职场规则/简历修改/技术分享/程序人生。欢迎加入[「代码随想录」知识星球](https://programmercarl.com/other/kstar.html) 。 -> 5. **提交代码**:本项目统一使用C++语言进行讲解,但已经有Java、Python、Go、JavaScript等等多语言版本,感谢[这里的每一位贡献者](https://github.com/youngyangyang04/leetcode-master/graphs/contributors),如果你也想贡献代码点亮你的头像,[点击这里](https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A)了解提交代码的方式。 -> 6. **转载须知** :以下所有文章皆为我([程序员Carl](https://github.com/youngyangyang04))的原创。引用本项目文章请注明出处,发现恶意抄袭或搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境! +> 3. **最强八股文:**:[代码随想录知识星球精华PDF](https://www.programmercarl.com/other/kstar_baguwen.html) +> 4. **刷题顺序** : README已经将刷题顺序排好了,按照顺序一道一道刷就可以。 +> 5. **学习社区** : 一起学习打卡/面试技巧/如何选择offer/大厂内推/职场规则/简历修改/技术分享/程序人生。欢迎加入[「代码随想录」知识星球](https://programmercarl.com/other/kstar.html) 。 +> 6. **提交代码**:本项目统一使用C++语言进行讲解,但已经有Java、Python、Go、JavaScript等等多语言版本,感谢[这里的每一位贡献者](https://github.com/youngyangyang04/leetcode-master/graphs/contributors),如果你也想贡献代码点亮你的头像,[点击这里](https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A)了解提交代码的方式。 +> 7. **转载须知** :以下所有文章皆为我([程序员Carl](https://github.com/youngyangyang04))的原创。引用本项目文章请注明出处,发现恶意抄袭或搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境!

diff --git a/problems/前序/程序员写文档工具.md b/problems/前序/程序员写文档工具.md index b76fb036..e4193c42 100644 --- a/problems/前序/程序员写文档工具.md +++ b/problems/前序/程序员写文档工具.md @@ -135,7 +135,6 @@ Markdown支持部分html,例如这样 - ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) * B站视频:[代码随想录](https://space.bilibili.com/525438321) diff --git a/problems/背包理论基础01背包-2.md b/problems/背包理论基础01背包-2.md index a57bae10..dabdfb2d 100644 --- a/problems/背包理论基础01背包-2.md +++ b/problems/背包理论基础01背包-2.md @@ -210,7 +210,7 @@ int main() { ## 其他语言版本 -Java: +### Java ```java public static void main(String[] args) { @@ -240,7 +240,7 @@ Java: -Python: +### Python ```python def test_1_wei_bag_problem(): weight = [1, 3, 4] @@ -260,7 +260,7 @@ def test_1_wei_bag_problem(): test_1_wei_bag_problem() ``` -Go: +### Go ```go func test_1_wei_bag_problem(weight, value []int, bagWeight int) int { // 定义 and 初始化 @@ -292,7 +292,7 @@ func main() { } ``` -javaScript: +### javaScript ```js From 4ed65b50d174a3d9f89d0352ee30da95fcecece9 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Wed, 9 Feb 2022 22:45:31 +0800 Subject: [PATCH 107/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880513.?= =?UTF-8?q?=E6=89=BE=E6=A0=91=E5=B7=A6=E4=B8=8B=E8=A7=92=E7=9A=84=E5=80=BC?= =?UTF-8?q?.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0513.找树左下角的值.md | 45 +++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/problems/0513.找树左下角的值.md b/problems/0513.找树左下角的值.md index 84ed3932..12c62c70 100644 --- a/problems/0513.找树左下角的值.md +++ b/problems/0513.找树左下角的值.md @@ -433,6 +433,51 @@ var findBottomLeftValue = function(root) { }; ``` +## TypeScript + +> 递归法: + +```typescript +function findBottomLeftValue(root: TreeNode | null): number { + function recur(root: TreeNode, depth: number): void { + if (root.left === null && root.right === null) { + if (depth > maxDepth) { + maxDepth = depth; + resVal = root.val; + } + return; + } + if (root.left !== null) recur(root.left, depth + 1); + if (root.right !== null) recur(root.right, depth + 1); + } + let maxDepth: number = 0; + let resVal: number = 0; + if (root === null) return resVal; + recur(root, 1); + return resVal; +}; +``` + +> 迭代法: + +```typescript +function findBottomLeftValue(root: TreeNode | null): number { + let helperQueue: TreeNode[] = []; + if (root !== null) helperQueue.push(root); + let resVal: number = 0; + let tempNode: TreeNode; + while (helperQueue.length > 0) { + resVal = helperQueue[0].val; + for (let i = 0, length = helperQueue.length; i < length; i++) { + tempNode = helperQueue.shift()!; + if (tempNode.left !== null) helperQueue.push(tempNode.left); + if (tempNode.right !== null) helperQueue.push(tempNode.right); + } + } + return resVal; +}; +``` + ## Swift 递归版本: From 7d8e9e8fae9d580013b717ff882bd9a942fe0e4f Mon Sep 17 00:00:00 2001 From: Guang-Hou <87743934+Guang-Hou@users.noreply.github.com> Date: Wed, 9 Feb 2022 16:37:44 -0500 Subject: [PATCH 108/328] =?UTF-8?q?Update=200701.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E6=A0=91=E4=B8=AD=E7=9A=84=E6=8F=92=E5=85=A5?= =?UTF-8?q?=E6=93=8D=E4=BD=9C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Python 递归法- 无返回值的一种更简单的实现。 --- problems/0701.二叉搜索树中的插入操作.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/problems/0701.二叉搜索树中的插入操作.md b/problems/0701.二叉搜索树中的插入操作.md index 468f2675..5e9fbdfe 100644 --- a/problems/0701.二叉搜索树中的插入操作.md +++ b/problems/0701.二叉搜索树中的插入操作.md @@ -310,6 +310,26 @@ class Solution: return root ``` +**递归法** - 无返回值 - another easier way +```python +class Solution: + def insertIntoBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]: + newNode = TreeNode(val) + if not root: return newNode + + if not root.left and val < root.val: + root.left = newNode + if not root.right and val > root.val: + root.right = newNode + + if val < root.val: + self.insertIntoBST(root.left, val) + if val > root.val: + self.insertIntoBST(root.right, val) + + return root +``` + **迭代法** 与无返回值的递归函数的思路大体一致 ```python From fc1a7e3e079958e6919bbc4fbe069a8d92e66322 Mon Sep 17 00:00:00 2001 From: zhaoninge Date: Thu, 10 Feb 2022 17:01:31 +0800 Subject: [PATCH 109/328] =?UTF-8?q?Update=200027.=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E5=85=83=E7=B4=A0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加27. 移除元素 C++版相向双指针方法,该方法基于元素顺序可以改变的题目描述,使用双指针法改变了元素相对位置,确保了移动最少元素 --- problems/0027.移除元素.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/problems/0027.移除元素.md b/problems/0027.移除元素.md index d69f2bcf..0c6f5129 100644 --- a/problems/0027.移除元素.md +++ b/problems/0027.移除元素.md @@ -106,6 +106,37 @@ public: 旧文链接:[数组:就移除个元素很难么?](https://programmercarl.com/0027.移除元素.html) +```CPP +/** +* 相向双指针方法,基于元素顺序可以改变的题目描述改变了元素相对位置,确保了移动最少元素 +* 时间复杂度:$O(n)$ +* 空间复杂度:$O(1)$ +*/ +class Solution { +public: + int removeElement(vector& nums, int val) { + int leftIndex = 0; + int rightIndex = nums.size() - 1; + while (leftIndex <= rightIndex) { + // 找左边等于val的元素 + while (leftIndex <= rightIndex && nums[leftIndex] != val){ + ++leftIndex; + } + // 找右边不等于val的元素 + while (leftIndex <= rightIndex && nums[rightIndex] == val) { + -- rightIndex; + } + // 将右边不等于val的元素覆盖左边等于val的元素 + if (leftIndex < rightIndex) { + nums[leftIndex++] = nums[rightIndex--]; + } + } + return leftIndex; // leftIndex一定指向了最终数组末尾的下一个元素 + } +}; +``` + + ## 相关题目推荐 * 26.删除排序数组中的重复项 From 71dd3eab9e9a005eec5669bfc25ba3cd4d27fb2f Mon Sep 17 00:00:00 2001 From: Luo <82520819+Jerry-306@users.noreply.github.com> Date: Fri, 11 Feb 2022 11:26:14 +0800 Subject: [PATCH 110/328] =?UTF-8?q?0059=20=20=E8=9E=BA=E6=97=8B=E7=9F=A9?= =?UTF-8?q?=E9=98=B5II=20=20=E9=A2=98=E7=9B=AE=E9=94=99=E8=AF=AF=E7=BA=A0?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0059.螺旋矩阵II.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/0059.螺旋矩阵II.md b/problems/0059.螺旋矩阵II.md index 3f7a59ca..ff654358 100644 --- a/problems/0059.螺旋矩阵II.md +++ b/problems/0059.螺旋矩阵II.md @@ -10,7 +10,7 @@ [力扣题目链接](https://leetcode-cn.com/problems/spiral-matrix-ii/) -给定一个正整数 n,生成一个包含 1 到 $n^2$ 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。 +给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。 示例: From 305ef69d5878ecaf1b9655e7899d663290f53af5 Mon Sep 17 00:00:00 2001 From: weiting-cn <2254912@qq.com> Date: Fri, 11 Feb 2022 16:09:17 +0800 Subject: [PATCH 111/328] =?UTF-8?q?=E6=9B=B4=E6=96=B0=EF=BC=9A0015.?= =?UTF-8?q?=E4=B8=89=E6=95=B0=E4=B9=8B=E5=92=8C=EF=BC=8C0018.=E5=9B=9B?= =?UTF-8?q?=E6=95=B0=E4=B9=8B=E5=92=8C=EF=BC=88=E5=8E=BB=E9=87=8D=E4=BC=98?= =?UTF-8?q?=E5=8C=96=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0015.三数之和.md | 4 ++++ problems/0018.四数之和.md | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/problems/0015.三数之和.md b/problems/0015.三数之和.md index e191eabc..9b59e66d 100644 --- a/problems/0015.三数之和.md +++ b/problems/0015.三数之和.md @@ -138,8 +138,12 @@ public: */ if (nums[i] + nums[left] + nums[right] > 0) { right--; + // 当前元素不合适了,可以去重 + while (left < right && nums[right] == nums[right + 1]) right--; } else if (nums[i] + nums[left] + nums[right] < 0) { left++; + // 不合适,去重 + while (left < right && nums[left] == nums[left - 1]) left++; } else { result.push_back(vector{nums[i], nums[left], nums[right]}); // 去重逻辑应该放在找到一个三元组之后 diff --git a/problems/0018.四数之和.md b/problems/0018.四数之和.md index bad258c1..c6c55d50 100644 --- a/problems/0018.四数之和.md +++ b/problems/0018.四数之和.md @@ -91,9 +91,13 @@ public: // nums[k] + nums[i] + nums[left] + nums[right] > target 会溢出 if (nums[k] + nums[i] > target - (nums[left] + nums[right])) { right--; + // 当前元素不合适了,可以去重 + while (left < right && nums[right] == nums[right + 1]) right--; // nums[k] + nums[i] + nums[left] + nums[right] < target 会溢出 } else if (nums[k] + nums[i] < target - (nums[left] + nums[right])) { left++; + // 不合适,去重 + while (left < right && nums[left] == nums[left - 1]) left++; } else { result.push_back(vector{nums[k], nums[i], nums[left], nums[right]}); // 去重逻辑应该放在找到一个四元组之后 From fbf52ee2bf0cad8c4231311ef2d87fc383a49a3c Mon Sep 17 00:00:00 2001 From: Luo <82520819+Jerry-306@users.noreply.github.com> Date: Fri, 11 Feb 2022 16:57:22 +0800 Subject: [PATCH 112/328] =?UTF-8?q?=E7=AE=97=E6=B3=95=E6=A8=A1=E6=9D=BF?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=20typescript=20=E7=89=88=E6=9C=AC=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/算法模板.md | 265 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 264 insertions(+), 1 deletion(-) diff --git a/problems/算法模板.md b/problems/算法模板.md index a4136511..789d8f80 100644 --- a/problems/算法模板.md +++ b/problems/算法模板.md @@ -394,7 +394,7 @@ var postorder = function (root, list) { ```javascript var preorderTraversal = function (root) { let res = []; - if (root === null) return rs; + if (root === null) return res; let stack = [root], cur = null; while (stack.length) { @@ -536,6 +536,269 @@ function backtracking(参数) { } ``` +TypeScript: + +## 二分查找法 + +使用左闭右闭区间 + +```typescript +var search = function (nums: number[], target: number): number { + let left: number = 0, right: number = nums.length - 1; + // 使用左闭右闭区间 + while (left <= right) { + let mid: number = left + Math.floor((right - left)/2); + if (nums[mid] > target) { + right = mid - 1; // 去左面闭区间寻找 + } else if (nums[mid] < target) { + left = mid + 1; // 去右面闭区间寻找 + } else { + return mid; + } + } + return -1; +}; +``` + +使用左闭右开区间 + +```typescript +var search = function (nums: number[], target: number): number { + let left: number = 0, right: number = nums.length; + // 使用左闭右开区间 [left, right) + while (left < right) { + let mid: number = left + Math.floor((right - left)/2); + if (nums[mid] > target) { + right = mid; // 去左面闭区间寻找 + } else if (nums[mid] < target) { + left = mid + 1; // 去右面闭区间寻找 + } else { + return mid; + } + } + return -1; +}; +``` + +## KMP + +```typescript +var kmp = function (next: number[], s: number): void { + next[0] = -1; + let j: number = -1; + for(let i: number = 1; i < s.length; i++){ + while (j >= 0 && s[i] !== s[j + 1]) { + j = next[j]; + } + if (s[i] === s[j + 1]) { + j++; + } + next[i] = j; + } +} +``` + +## 二叉树 + +### 深度优先遍历(递归) + +二叉树节点定义: + +```typescript +class TreeNode { + val: number + left: TreeNode | null + right: TreeNode | null + constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) { + this.val = (val===undefined ? 0 : val) + this.left = (left===undefined ? null : left) + this.right = (right===undefined ? null : right) + } +} +``` + +前序遍历(中左右): + +```typescript +var preorder = function (root: TreeNode | null, list: number[]): void { + if (root === null) return; + list.push(root.val); // 中 + preorder(root.left, list); // 左 + preorder(root.right, list); // 右 +} +``` + +中序遍历(左中右): + +```typescript +var inorder = function (root: TreeNode | null, list: number[]): void { + if (root === null) return; + inorder(root.left, list); // 左 + list.push(root.val); // 中 + inorder(root.right, list); // 右 +} +``` + +后序遍历(左右中): + +```typescript +var postorder = function (root: TreeNode | null, list: number[]): void { + if (root === null) return; + postorder(root.left, list); // 左 + postorder(root.right, list); // 右 + list.push(root.val); // 中 +} +``` + +### 深度优先遍历(迭代) + +前序遍历(中左右): + +```typescript +var preorderTraversal = function (root: TreeNode | null): number[] { + let res: number[] = []; + if (root === null) return res; + let stack: TreeNode[] = [root], + cur: TreeNode | null = null; + while (stack.length) { + cur = stack.pop(); + res.push(cur.val); + cur.right && stack.push(cur.right); + cur.left && stack.push(cur.left); + } + return res; +}; +``` + +中序遍历(左中右): + +```typescript +var inorderTraversal = function (root: TreeNode | null): number[] { + let res: number[] = []; + if (root === null) return res; + let stack: TreeNode[] = []; + let cur: TreeNode | null = root; + while (stack.length !== 0 || cur !== null) { + if (cur !== null) { + stack.push(cur); + cur = cur.left; + } else { + cur = stack.pop(); + res.push(cur.val); + cur = cur.right; + } + } + return res; +}; +``` + +后序遍历(左右中): + +```typescript +var postorderTraversal = function (root: TreeNode | null): number[] { + let res: number[] = []; + if (root === null) return res; + let stack: TreeNode[] = [root]; + let cur: TreeNode | null = null; + while (stack.length) { + cur = stack.pop(); + res.push(cur.val); + cur.left && stack.push(cur.left); + cur.right && stack.push(cur.right); + } + return res.reverse() +}; +``` + +### 广度优先遍历(队列) + +```typescript +var levelOrder = function (root: TreeNode | null): number[] { + let res: number[] = []; + if (root === null) return res; + let queue: TreeNode[] = [root]; + while (queue.length) { + let n: number = queue.length; + let temp: number[] = []; + for (let i: number = 0; i < n; i++) { + let node: TreeNode = queue.shift(); + temp.push(node.val); + node.left && queue.push(node.left); + node.right && queue.push(node.right); + } + res.push(temp); + } + return res; +}; +``` + +### 二叉树深度 + +```typescript +var getDepth = function (node: TreNode | null): number { + if (node === null) return 0; + return 1 + Math.max(getDepth(node.left), getDepth(node.right)); +} +``` + +### 二叉树节点数量 + +```typescript +var countNodes = function (root: TreeNode | null): number { + if (root === null) return 0; + return 1 + countNodes(root.left) + countNodes(root.right); +} +``` + +## 回溯算法 + +```typescript +function backtracking(参数) { + if (终止条件) { + 存放结果; + return; + } + + for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) { + 处理节点; + backtracking(路径,选择列表); // 递归 + 回溯,撤销处理结果 + } +} + +``` + +## 并查集 + +```typescript + let n: number = 1005; // 根据题意而定 + let father: number[] = new Array(n).fill(0); + + // 并查集初始化 + function init () { + for (int i: number = 0; i < n; ++i) { + father[i] = i; + } + } + // 并查集里寻根的过程 + function find (u: number): number { + return u === father[u] ? u : father[u] = find(father[u]); + } + // 将v->u 这条边加入并查集 + function join(u: number, v: number) { + u = find(u); + v = find(v); + if (u === v) return ; + father[v] = u; + } + // 判断 u 和 v是否找到同一个根 + function same(u: number, v: number): boolean { + u = find(u); + v = find(v); + return u === v; + } +``` + Java: From 65a341bf365eb3b2648c357a7a311a59ec6e9e18 Mon Sep 17 00:00:00 2001 From: Larry Liu Date: Fri, 11 Feb 2022 20:24:45 +0800 Subject: [PATCH 113/328] =?UTF-8?q?Update=20=E5=B9=BF=E5=B7=9E=E4=BA=92?= =?UTF-8?q?=E8=81=94=E7=BD=91=E5=85=AC=E5=8F=B8=E6=80=BB=E7=BB=93.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 字节跳动有广州研发岗位 --- problems/前序/广州互联网公司总结.md | 1 + 1 file changed, 1 insertion(+) diff --git a/problems/前序/广州互联网公司总结.md b/problems/前序/广州互联网公司总结.md index ae41c899..ac70f40c 100644 --- a/problems/前序/广州互联网公司总结.md +++ b/problems/前序/广州互联网公司总结.md @@ -14,6 +14,7 @@ ## 一线互联网 * 微信(总部) 有点难进! +* 字节跳动(广州) ## 二线 * 网易(总部)主要是游戏 From 961ae6eadf6359f2ef6b787ad612475e02e6842e Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 11 Feb 2022 21:52:36 +0800 Subject: [PATCH 114/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880112.?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E6=80=BB=E5=92=8C.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0112.路径总和.md | 89 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) diff --git a/problems/0112.路径总和.md b/problems/0112.路径总和.md index 5ec8ffd0..de6caef0 100644 --- a/problems/0112.路径总和.md +++ b/problems/0112.路径总和.md @@ -766,11 +766,100 @@ let pathSum = function(root, targetSum) { }; ``` +## TypeScript + +> 0112.路径总和 + +**递归法:** + +```typescript +function hasPathSum(root: TreeNode | null, targetSum: number): boolean { + function recur(node: TreeNode, sum: number): boolean { + console.log(sum); + if ( + node.left === null && + node.right === null && + sum === 0 + ) return true; + if (node.left !== null) { + sum -= node.left.val; + if (recur(node.left, sum) === true) return true; + sum += node.left.val; + } + if (node.right !== null) { + sum -= node.right.val; + if (recur(node.right, sum) === true) return true; + sum += node.right.val; + } + return false; + } + if (root === null) return false; + return recur(root, targetSum - root.val); +}; +``` + +**递归法(精简版):** + +```typescript +function hasPathSum(root: TreeNode | null, targetSum: number): boolean { + if (root === null) return false; + targetSum -= root.val; + if ( + root.left === null && + root.right === null && + targetSum === 0 + ) return true; + return hasPathSum(root.left, targetSum) || + hasPathSum(root.right, targetSum); +}; +``` + +**迭代法:** + +```typescript +function hasPathSum(root: TreeNode | null, targetSum: number): boolean { + type Pair = { + node: TreeNode, // 当前节点 + sum: number // 根节点到当前节点的路径数值总和 + } + + const helperStack: Pair[] = []; + if (root !== null) helperStack.push({ node: root, sum: root.val }); + let tempPair: Pair; + while (helperStack.length > 0) { + tempPair = helperStack.pop()!; + if ( + tempPair.node.left === null && + tempPair.node.right === null && + tempPair.sum === targetSum + ) return true; + if (tempPair.node.right !== null) { + helperStack.push({ + node: tempPair.node.right, + sum: tempPair.sum + tempPair.node.right.val + }); + } + if (tempPair.node.left !== null) { + helperStack.push({ + node: tempPair.node.left, + sum: tempPair.sum + tempPair.node.left.val + }); + } + } + return false; +}; +``` + +> 0112.路径总和 ii + + + ## Swift 0112.路径总和 **递归** + ```swift func hasPathSum(_ root: TreeNode?, _ targetSum: Int) -> Bool { guard let root = root else { From fde074cb2ab400b44707c178139d7757541bbf39 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 11 Feb 2022 23:28:30 +0800 Subject: [PATCH 115/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880112.?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E6=80=BB=E5=92=8C=20ii=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0112.路径总和.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/problems/0112.路径总和.md b/problems/0112.路径总和.md index de6caef0..2e10d98d 100644 --- a/problems/0112.路径总和.md +++ b/problems/0112.路径总和.md @@ -852,7 +852,39 @@ function hasPathSum(root: TreeNode | null, targetSum: number): boolean { > 0112.路径总和 ii +**递归法:** +```typescript +function pathSum(root: TreeNode | null, targetSum: number): number[][] { + function recur(node: TreeNode, sumGap: number, routeArr: number[]): void { + if ( + node.left === null && + node.right === null && + sumGap === 0 + ) resArr.push([...routeArr]); + if (node.left !== null) { + sumGap -= node.left.val; + routeArr.push(node.left.val); + recur(node.left, sumGap, routeArr); + sumGap += node.left.val; + routeArr.pop(); + } + if (node.right !== null) { + sumGap -= node.right.val; + routeArr.push(node.right.val); + recur(node.right, sumGap, routeArr); + sumGap += node.right.val; + routeArr.pop(); + } + } + const resArr: number[][] = []; + if (root === null) return resArr; + const routeArr: number[] = []; + routeArr.push(root.val); + recur(root, targetSum - root.val, routeArr); + return resArr; +}; +``` ## Swift From fb67fb4320c3ee7c0ee17dd695a5b7a7ea2a4d34 Mon Sep 17 00:00:00 2001 From: "darion.yaphet" Date: Sat, 12 Feb 2022 17:25:57 +0800 Subject: [PATCH 116/328] fix java code --- problems/背包理论基础01背包-1.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/problems/背包理论基础01背包-1.md b/problems/背包理论基础01背包-1.md index 6ff32017..fe940b4c 100644 --- a/problems/背包理论基础01背包-1.md +++ b/problems/背包理论基础01背包-1.md @@ -271,7 +271,7 @@ int main() { ### java ```java - public static void main(string[] args) { + public static void main(String[] args) { int[] weight = {1, 3, 4}; int[] value = {15, 20, 30}; int bagsize = 4; @@ -292,16 +292,16 @@ int main() { if (j < weight[i - 1]){ dp[i][j] = dp[i - 1][j]; }else{ - dp[i][j] = math.max(dp[i - 1][j], dp[i - 1][j - weight[i - 1]] + value[i - 1]); + dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight[i - 1]] + value[i - 1]); } } } //打印dp数组 for (int i = 0; i <= wlen; i++){ for (int j = 0; j <= bagsize; j++){ - system.out.print(dp[i][j] + " "); + System.out.print(dp[i][j] + " "); } - system.out.print("\n"); + System.out.print("\n"); } } ``` From bac5f8d70cef72f5457ac80fd487d86618d27831 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sun, 13 Feb 2022 16:37:32 +0800 Subject: [PATCH 117/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880106.?= =?UTF-8?q?=E4=BB=8E=E4=B8=AD=E5=BA=8F=E4=B8=8E=E5=90=8E=E5=BA=8F=E9=81=8D?= =?UTF-8?q?=E5=8E=86=E5=BA=8F=E5=88=97=E6=9E=84=E9=80=A0=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0106.从中序与后序遍历序列构造二叉树.md | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/problems/0106.从中序与后序遍历序列构造二叉树.md b/problems/0106.从中序与后序遍历序列构造二叉树.md index 40d75983..9b18e729 100644 --- a/problems/0106.从中序与后序遍历序列构造二叉树.md +++ b/problems/0106.从中序与后序遍历序列构造二叉树.md @@ -814,7 +814,70 @@ var buildTree = function(preorder, inorder) { }; ``` +## TypeScript + +> 106.从中序与后序遍历序列构造二叉树 + +**创建新数组:** + +```typescript +function buildTree(inorder: number[], postorder: number[]): TreeNode | null { + if (postorder.length === 0) return null; + const rootVal: number = postorder.pop()!; + const rootValIndex: number = inorder.indexOf(rootVal); + const rootNode: TreeNode = new TreeNode(rootVal); + rootNode.left = buildTree(inorder.slice(0, rootValIndex), postorder.slice(0, rootValIndex)); + rootNode.right = buildTree(inorder.slice(rootValIndex + 1), postorder.slice(rootValIndex)); + return rootNode; +}; +``` + +**使用数组索引:** + +```typescript +function buildTree(inorder: number[], postorder: number[]): TreeNode | null { + function recur( + inorder: number[], postorder: number[], + inBegin: number, inEnd: number, + postBegin: number, postEnd: number + ): TreeNode | null { + if (postBegin === postEnd) return null; + const rootVal: number = postorder[postEnd - 1]!; + const rootValIndex: number = inorder.indexOf(rootVal, inBegin); + const rootNode: TreeNode = new TreeNode(rootVal); + + const leftInorderBegin: number = inBegin; + const leftInorderEnd: number = rootValIndex; + const rightInorderBegin: number = rootValIndex + 1; + const rightInorderEnd: number = inEnd; + + const leftPostorderBegin: number = postBegin; + const leftPostorderEnd: number = postBegin + rootValIndex - inBegin; + const rightPostorderBegin: number = leftPostorderEnd; + const rightPostorderEnd: number = postEnd - 1; + + rootNode.left = recur( + inorder, postorder, + leftInorderBegin, leftInorderEnd, + leftPostorderBegin, leftPostorderEnd + ); + rootNode.right = recur( + inorder, postorder, + rightInorderBegin, rightInorderEnd, + rightPostorderBegin, rightPostorderEnd + ); + return rootNode; + } + return recur(inorder, postorder, 0, inorder.length, 0, inorder.length); +}; +``` + +> 105.从前序与中序遍历序列构造二叉树 + + + ## C + 106 从中序与后序遍历序列构造二叉树 ```c From ddf79ac04322e27c50f50be81a46407d7b054950 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sun, 13 Feb 2022 17:09:38 +0800 Subject: [PATCH 118/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88105.?= =?UTF-8?q?=E4=BB=8E=E5=89=8D=E5=BA=8F=E4=B8=8E=E4=B8=AD=E5=BA=8F=E9=81=8D?= =?UTF-8?q?=E5=8E=86=E5=BA=8F=E5=88=97=E6=9E=84=E9=80=A0=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0106.从中序与后序遍历序列构造二叉树.md | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/problems/0106.从中序与后序遍历序列构造二叉树.md b/problems/0106.从中序与后序遍历序列构造二叉树.md index 9b18e729..3e4211fb 100644 --- a/problems/0106.从中序与后序遍历序列构造二叉树.md +++ b/problems/0106.从中序与后序遍历序列构造二叉树.md @@ -874,7 +874,51 @@ function buildTree(inorder: number[], postorder: number[]): TreeNode | null { > 105.从前序与中序遍历序列构造二叉树 +**新建数组:** +```typescript +function buildTree(preorder: number[], inorder: number[]): TreeNode | null { + if (preorder.length === 0) return null; + const rootVal: number = preorder[0]; + const rootNode: TreeNode = new TreeNode(rootVal); + const rootValIndex: number = inorder.indexOf(rootVal); + rootNode.left = buildTree(preorder.slice(1, rootValIndex + 1), inorder.slice(0, rootValIndex)); + rootNode.right = buildTree(preorder.slice(rootValIndex + 1), inorder.slice(rootValIndex + 1)); + return rootNode; +}; +``` + +**使用数组索引:** + +```typescript +function buildTree(preorder: number[], inorder: number[]): TreeNode | null { + function recur( + preorder: number[], inorder: number[], + preBegin: number, preEnd: number, + inBegin: number, inEnd: number + ): TreeNode | null { + if (preBegin === preEnd) return null; + const rootVal: number = preorder[preBegin]; + const rootNode: TreeNode = new TreeNode(rootVal); + const rootValIndex: number = inorder.indexOf(rootVal, inBegin); + + const leftPreBegin: number = preBegin + 1; + const leftPreEnd: number = preBegin + rootValIndex - inBegin + 1; + const leftInBegin: number = inBegin; + const leftInEnd: number = rootValIndex; + + const rightPreBegin: number = leftPreEnd; + const rightPreEnd: number = preEnd; + const rightInBegin: number = rootValIndex + 1; + const rightInEnd: number = inEnd; + + rootNode.left = recur(preorder, inorder, leftPreBegin, leftPreEnd, leftInBegin, leftInEnd); + rootNode.right = recur(preorder, inorder, rightPreBegin, rightPreEnd, rightInBegin, rightInEnd); + return rootNode; + }; + return recur(preorder, inorder, 0, preorder.length, 0, inorder.length); +}; +``` ## C From 92322870fe4664dffa3dcb8e6020626376417bb3 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sun, 13 Feb 2022 21:20:24 +0800 Subject: [PATCH 119/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880654.?= =?UTF-8?q?=E6=9C=80=E5=A4=A7=E4=BA=8C=E5=8F=89=E6=A0=91.md=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0654.最大二叉树.md | 49 +++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/problems/0654.最大二叉树.md b/problems/0654.最大二叉树.md index 44c74f89..1c73354b 100644 --- a/problems/0654.最大二叉树.md +++ b/problems/0654.最大二叉树.md @@ -371,7 +371,56 @@ var constructMaximumBinaryTree = function (nums) { }; ``` +## TypeScript + +> 新建数组法: + +```typescript +function constructMaximumBinaryTree(nums: number[]): TreeNode | null { + if (nums.length === 0) return null; + let maxIndex: number = 0; + let maxVal: number = nums[0]; + for (let i = 1, length = nums.length; i < length; i++) { + if (nums[i] > maxVal) { + maxIndex = i; + maxVal = nums[i]; + } + } + const rootNode: TreeNode = new TreeNode(maxVal); + rootNode.left = constructMaximumBinaryTree(nums.slice(0, maxIndex)); + rootNode.right = constructMaximumBinaryTree(nums.slice(maxIndex + 1)); + return rootNode; +}; +``` + +> 使用数组索引法: + +```typescript +function constructMaximumBinaryTree(nums: number[]): TreeNode | null { + // 左闭右开区间[begin, end) + function recur(nums: number[], begin: number, end: number): TreeNode | null { + if (begin === end) return null; + let maxIndex: number = begin; + let maxVal: number = nums[begin]; + for (let i = begin + 1; i < end; i++) { + if (nums[i] > maxVal) { + maxIndex = i; + maxVal = nums[i]; + } + } + const rootNode: TreeNode = new TreeNode(maxVal); + rootNode.left = recur(nums, begin, maxIndex); + rootNode.right = recur(nums, maxIndex + 1, end); + return rootNode; + } + return recur(nums, 0, nums.length); +}; +``` + + + ## C + ```c struct TreeNode* traversal(int* nums, int left, int right) { //若左边界大于右边界,返回NULL From 2440d6a365def0caf92f041886545117ec0c1e9f Mon Sep 17 00:00:00 2001 From: Dewittt <43514251+Dewittt@users.noreply.github.com> Date: Mon, 14 Feb 2022 14:04:34 +0800 Subject: [PATCH 120/328] =?UTF-8?q?Update=20=E8=83=8C=E5=8C=85=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80=E5=AE=8C=E5=85=A8?= =?UTF-8?q?=E8=83=8C=E5=8C=85.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 删除多余字符 --- problems/背包问题理论基础完全背包.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/背包问题理论基础完全背包.md b/problems/背包问题理论基础完全背包.md index cea69c72..2cdfeffa 100644 --- a/problems/背包问题理论基础完全背包.md +++ b/problems/背包问题理论基础完全背包.md @@ -94,7 +94,7 @@ dp状态图如下: 看了这两个图,大家就会理解,完全背包中,两个for循环的先后循序,都不影响计算dp[j]所需要的值(这个值就是下标j之前所对应的dp[j])。 -先遍历被背包在遍历物品,代码如下: +先遍历背包在遍历物品,代码如下: ```CPP // 先遍历背包,再遍历物品 From 30f2c6bc1763bb3cfe607707f96b1d9047a3d2b3 Mon Sep 17 00:00:00 2001 From: Verolilo <57696907+Verolilo@users.noreply.github.com> Date: Mon, 14 Feb 2022 14:15:33 +0800 Subject: [PATCH 121/328] =?UTF-8?q?=E6=9B=B4=E6=96=B00070.=E7=88=AC?= =?UTF-8?q?=E6=A5=BC=E6=A2=AF.md=20python=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新0070.爬楼梯.md python版本,添加了O(1)复杂度的python代码 --- problems/0070.爬楼梯.md | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/problems/0070.爬楼梯.md b/problems/0070.爬楼梯.md index 7f47a991..da19ea0e 100644 --- a/problems/0070.爬楼梯.md +++ b/problems/0070.爬楼梯.md @@ -256,16 +256,28 @@ public int climbStairs(int n) { ### Python ```python +# 空间复杂度为O(n)版本 class Solution: def climbStairs(self, n: int) -> int: - # dp[i]表示爬到第i级楼梯的种数, (1, 2) (2, 1)是两种不同的类型 - dp = [0] * (n + 1) - dp[0] = 1 - for i in range(n+1): - for j in range(1, 3): - if i>=j: - dp[i] += dp[i-j] - return dp[-1] + # dp[i] 为第 i 阶楼梯有多少种方法爬到楼顶 + dp=[0]*(n+1) + dp[0]=1 + dp[1]=1 + for i in range(2,n+1): + dp[i]=dp[i-1]+dp[i-2] + return dp[n] + +# 空间复杂度为O(1)版本 +class Solution: + def climbStairs(self, n: int) -> int: + dp=[0]*(n+1) + dp[0]=1 + dp[1]=1 + for i in range(2,n+1): + tmp=dp[0]+dp[1] + dp[0]=dp[1] + dp[1]=tmp + return dp[1] ``` ### Go From 6d5a0d0340798f773104f418d3db71797c5db717 Mon Sep 17 00:00:00 2001 From: Verolilo <57696907+Verolilo@users.noreply.github.com> Date: Wed, 16 Feb 2022 10:22:19 +0800 Subject: [PATCH 122/328] =?UTF-8?q?=E6=9B=B4=E6=96=B00213.=E6=89=93?= =?UTF-8?q?=E5=AE=B6=E5=8A=AB=E8=88=8DII.md=20=E6=9B=B4=E7=AE=80=E6=B4=81?= =?UTF-8?q?=E7=9A=84python=20=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0213.打家劫舍II.md | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/problems/0213.打家劫舍II.md b/problems/0213.打家劫舍II.md index b6c2d080..8e569e46 100644 --- a/problems/0213.打家劫舍II.md +++ b/problems/0213.打家劫舍II.md @@ -123,22 +123,24 @@ Python: ```Python class Solution: def rob(self, nums: List[int]) -> int: - if (n := len(nums)) == 0: - return 0 - if n == 1: - return nums[0] - result1 = self.robRange(nums, 0, n - 2) - result2 = self.robRange(nums, 1, n - 1) - return max(result1 , result2) + #在198入门级的打家劫舍问题上分两种情况考虑 + #一是不偷第一间房,二是不偷最后一间房 + if len(nums)==1:#题目中提示nums.length>=1,所以不需要考虑len(nums)==0的情况 + return nums[0] + val1=self.roblist(nums[1:])#不偷第一间房 + val2=self.roblist(nums[:-1])#不偷最后一间房 + return max(val1,val2) - def robRange(self, nums: List[int], start: int, end: int) -> int: - if end == start: return nums[start] - dp = [0] * len(nums) - dp[start] = nums[start] - dp[start + 1] = max(nums[start], nums[start + 1]) - for i in range(start + 2, end + 1): - dp[i] = max(dp[i -2] + nums[i], dp[i - 1]) - return dp[end] + def robRange(self,nums): + l=len(nums) + dp=[0]*l + dp[0]=nums[0] + for i in range(1,l): + if i==1: + dp[i]=max(dp[i-1],nums[i]) + else: + dp[i]=max(dp[i-1],dp[i-2]+nums[i]) + return dp[-1] ``` javascipt: From f39d5a110c19963037374a3f1ea253b30f08becb Mon Sep 17 00:00:00 2001 From: erdengk <15596570256@163.com> Date: Wed, 16 Feb 2022 16:23:39 +0800 Subject: [PATCH 123/328] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=83=A8=E5=88=86?= =?UTF-8?q?=E9=94=99=E5=AD=97=20&=20=E4=BC=98=E5=8C=96=E5=8F=98=E9=87=8F?= =?UTF-8?q?=E5=90=8D=E5=91=BD=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0106.从中序与后序遍历序列构造二叉树.md | 4 ++-- problems/0860.柠檬水找零.md | 20 +++++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/problems/0106.从中序与后序遍历序列构造二叉树.md b/problems/0106.从中序与后序遍历序列构造二叉树.md index 30ec684d..cb1d75d9 100644 --- a/problems/0106.从中序与后序遍历序列构造二叉树.md +++ b/problems/0106.从中序与后序遍历序列构造二叉树.md @@ -89,9 +89,9 @@ TreeNode* traversal (vector& inorder, vector& postorder) { **难点大家应该发现了,就是如何切割,以及边界值找不好很容易乱套。** -此时应该注意确定切割的标准,是左闭右开,还有左开又闭,还是左闭又闭,这个就是不变量,要在递归中保持这个不变量。 +此时应该注意确定切割的标准,是左闭右开,还有左开右闭,还是左闭右闭,这个就是不变量,要在递归中保持这个不变量。 -**在切割的过程中会产生四个区间,把握不好不变量的话,一会左闭右开,一会左闭又闭,必然乱套!** +**在切割的过程中会产生四个区间,把握不好不变量的话,一会左闭右开,一会左闭右闭,必然乱套!** 我在[数组:每次遇到二分法,都是一看就会,一写就废](https://programmercarl.com/0035.搜索插入位置.html)和[数组:这个循环可以转懵很多人!](https://programmercarl.com/0059.螺旋矩阵II.html)中都强调过循环不变量的重要性,在二分查找以及螺旋矩阵的求解中,坚持循环不变量非常重要,本题也是。 diff --git a/problems/0860.柠檬水找零.md b/problems/0860.柠檬水找零.md index 01bd1a3b..f48ecf4d 100644 --- a/problems/0860.柠檬水找零.md +++ b/problems/0860.柠檬水找零.md @@ -128,24 +128,24 @@ public: ```java class Solution { public boolean lemonadeChange(int[] bills) { - int cash_5 = 0; - int cash_10 = 0; + int five = 0; + int ten = 0; for (int i = 0; i < bills.length; i++) { if (bills[i] == 5) { - cash_5++; + five++; } else if (bills[i] == 10) { - cash_5--; - cash_10++; + five--; + ten++; } else if (bills[i] == 20) { - if (cash_10 > 0) { - cash_10--; - cash_5--; + if (ten > 0) { + ten--; + five--; } else { - cash_5 -= 3; + five -= 3; } } - if (cash_5 < 0 || cash_10 < 0) return false; + if (five < 0 || ten < 0) return false; } return true; From 1a553b01d691478c049fd39e59548f3a71c9f456 Mon Sep 17 00:00:00 2001 From: erdengk <15596570256@163.com> Date: Wed, 16 Feb 2022 17:43:36 +0800 Subject: [PATCH 124/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200491.=E9=80=92?= =?UTF-8?q?=E5=A2=9E=E5=AD=90=E5=BA=8F=E5=88=97.md=20Java=E8=A7=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0491.递增子序列.md | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/problems/0491.递增子序列.md b/problems/0491.递增子序列.md index 6d88119e..298586c7 100644 --- a/problems/0491.递增子序列.md +++ b/problems/0491.递增子序列.md @@ -227,7 +227,39 @@ class Solution { } } ``` - +```java +//法二:使用map +class Solution { + //结果集合 + List> res = new ArrayList<>(); + //路径集合 + LinkedList path = new LinkedList<>(); + public List> findSubsequences(int[] nums) { + getSubsequences(nums,0); + return res; + } + private void getSubsequences( int[] nums, int start ) { + if(path.size()>1 ){ + res.add( new ArrayList<>(path) ); + // 注意这里不要加return,要取树上的节点 + } + HashMap map = new HashMap<>(); + for(int i=start ;i < nums.length ;i++){ + if(!path.isEmpty() && nums[i]< path.getLast()){ + continue; + } + // 使用过了当前数字 + if ( map.getOrDefault( nums[i],0 ) >=1 ){ + continue; + } + map.put(nums[i],map.getOrDefault( nums[i],0 )+1); + path.add( nums[i] ); + getSubsequences( nums,i+1 ); + path.removeLast(); + } + } +} +``` ### Python From fac4fc5193caac05a5418338f281e25c02a2739b Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Wed, 16 Feb 2022 23:22:26 +0800 Subject: [PATCH 125/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880617.?= =?UTF-8?q?=E5=90=88=E5=B9=B6=E4=BA=8C=E5=8F=89=E6=A0=91.md=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0617.合并二叉树.md | 50 +++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/problems/0617.合并二叉树.md b/problems/0617.合并二叉树.md index f815d741..55786ea9 100644 --- a/problems/0617.合并二叉树.md +++ b/problems/0617.合并二叉树.md @@ -583,6 +583,56 @@ var mergeTrees = function(root1, root2) { ``` +## TypeScript + +> 递归法: + +```type +function mergeTrees(root1: TreeNode | null, root2: TreeNode | null): TreeNode | null { + if (root1 === null) return root2; + if (root2 === null) return root1; + const resNode: TreeNode = new TreeNode(root1.val + root2.val); + resNode.left = mergeTrees(root1.left, root2.left); + resNode.right = mergeTrees(root1.right, root2.right); + return resNode; +}; +``` + +> 迭代法: + +```typescript +function mergeTrees(root1: TreeNode | null, root2: TreeNode | null): TreeNode | null { + if (root1 === null) return root2; + if (root2 === null) return root1; + const helperQueue1: TreeNode[] = [], + helperQueue2: TreeNode[] = []; + helperQueue1.push(root1); + helperQueue2.push(root2); + let tempNode1: TreeNode, + tempNode2: TreeNode; + while (helperQueue1.length > 0) { + tempNode1 = helperQueue1.shift()!; + tempNode2 = helperQueue2.shift()!; + tempNode1.val += tempNode2.val; + if (tempNode1.left !== null && tempNode2.left !== null) { + helperQueue1.push(tempNode1.left); + helperQueue2.push(tempNode2.left); + } else if (tempNode1.left === null) { + tempNode1.left = tempNode2.left; + } + if (tempNode1.right !== null && tempNode2.right !== null) { + helperQueue1.push(tempNode1.right); + helperQueue2.push(tempNode2.right); + } else if (tempNode1.right === null) { + tempNode1.right = tempNode2.right; + } + } + return root1; +}; +``` + + + -----------------------

From bd2310622b8a4d726288759820a60b5a62fce590 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Thu, 17 Feb 2022 10:25:56 +0800 Subject: [PATCH 126/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880700.?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E6=90=9C=E7=B4=A2.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typesc?= =?UTF-8?q?ript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0700.二叉搜索树中的搜索.md | 30 +++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/problems/0700.二叉搜索树中的搜索.md b/problems/0700.二叉搜索树中的搜索.md index 1521514a..00ba8753 100644 --- a/problems/0700.二叉搜索树中的搜索.md +++ b/problems/0700.二叉搜索树中的搜索.md @@ -334,6 +334,36 @@ var searchBST = function (root, val) { }; ``` +## TypeScript + +> 递归法 + +```typescript +function searchBST(root: TreeNode | null, val: number): TreeNode | null { + if (root === null || root.val === val) return root; + if (root.val < val) return searchBST(root.right, val); + if (root.val > val) return searchBST(root.left, val); + return null; +}; +``` + +> 迭代法 + +```typescript +function searchBST(root: TreeNode | null, val: number): TreeNode | null { + let resNode: TreeNode | null = root; + while (resNode !== null) { + if (resNode.val === val) return resNode; + if (resNode.val < val) { + resNode = resNode.right; + } else { + resNode = resNode.left; + } + } + return null; +}; +``` + ----------------------- From 7af58b92b86e045998ce3f7ceca186d73809cbdd Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Thu, 17 Feb 2022 15:07:13 +0800 Subject: [PATCH 127/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880098.?= =?UTF-8?q?=E9=AA=8C=E8=AF=81=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91?= =?UTF-8?q?.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0098.验证二叉搜索树.md | 42 +++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/problems/0098.验证二叉搜索树.md b/problems/0098.验证二叉搜索树.md index 4ed29619..c0f3e039 100644 --- a/problems/0098.验证二叉搜索树.md +++ b/problems/0098.验证二叉搜索树.md @@ -526,6 +526,48 @@ var isValidBST = function (root) { }; ``` +## TypeScript + +> 辅助数组解决: + +```typescript +function isValidBST(root: TreeNode | null): boolean { + const traversalArr: number[] = []; + function inorderTraverse(root: TreeNode | null): void { + if (root === null) return; + inorderTraverse(root.left); + traversalArr.push(root.val); + inorderTraverse(root.right); + } + inorderTraverse(root); + for (let i = 0, length = traversalArr.length; i < length - 1; i++) { + if (traversalArr[i] >= traversalArr[i + 1]) return false; + } + return true; +}; +``` + +> 递归中解决: + +```typescript +function isValidBST(root: TreeNode | null): boolean { + let maxVal = -Infinity; + function inorderTraverse(root: TreeNode | null): boolean { + if (root === null) return true; + let leftValid: boolean = inorderTraverse(root.left); + if (!leftValid) return false; + if (maxVal < root.val) { + maxVal = root.val + } else { + return false; + } + let rightValid: boolean = inorderTraverse(root.right); + return leftValid && rightValid; + } + return inorderTraverse(root); +}; +``` + ----------------------- From 6cb2076827726fc5be341e226585882424e523e7 Mon Sep 17 00:00:00 2001 From: hs-zhangsan <1513157458@qq.com> Date: Fri, 18 Feb 2022 17:03:41 +0800 Subject: [PATCH 128/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20541.=E5=8F=8D?= =?UTF-8?q?=E8=BD=AC=E5=AD=97=E7=AC=A6=E4=B8=B2II=20C=E8=AF=AD=E8=A8=80?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0541.反转字符串II.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/problems/0541.反转字符串II.md b/problems/0541.反转字符串II.md index 14b8601a..bf59f52d 100644 --- a/problems/0541.反转字符串II.md +++ b/problems/0541.反转字符串II.md @@ -98,8 +98,31 @@ public: ## 其他语言版本 +C: + +```c +char * reverseStr(char * s, int k){ + int len = strlen(s); + + for (int i = 0; i < len; i += (2 * k)) { + //判断剩余字符是否少于 k + k = i + k > len ? len - i : k; + + int left = i; + int right = i + k - 1; + while (left < right) { + char temp = s[left]; + s[left++] = s[right]; + s[right--] = temp; + } + } + + return s; +} +``` Java: + ```Java //解法一 class Solution { From 266702c291505ab3847d520ab7474789d0e97fab Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Fri, 18 Feb 2022 22:09:38 +0800 Subject: [PATCH 129/328] Update --- problems/前序/ACM模式如何构建二叉树.md | 3 --- problems/前序/BAT级别技术面试流程和注意事项都在这里了.md | 3 --- problems/前序/On的算法居然超时了,此时的n究竟是多大?.md | 3 --- problems/前序/上海互联网公司总结.md | 3 --- problems/前序/什么是核心代码模式,什么又是ACM模式?.md | 3 --- problems/前序/关于时间复杂度,你不知道的都在这里!.md | 3 --- problems/前序/关于空间复杂度,可能有几个疑问?.md | 3 --- problems/前序/刷了这么多题,你了解自己代码的内存消耗么?.md | 3 --- problems/前序/力扣上的代码想在本地编译运行?.md | 3 --- problems/前序/北京互联网公司总结.md | 3 --- problems/前序/广州互联网公司总结.md | 3 --- problems/前序/成都互联网公司总结.md | 3 --- problems/前序/杭州互联网公司总结.md | 3 --- problems/前序/深圳互联网公司总结.md | 3 --- problems/前序/程序员写文档工具.md | 3 --- problems/前序/程序员简历.md | 3 --- problems/前序/递归算法的时间与空间复杂度分析.md | 3 --- .../前序/通过一道面试题目,讲一讲递归算法的时间复杂度!.md | 3 --- 18 files changed, 54 deletions(-) diff --git a/problems/前序/ACM模式如何构建二叉树.md b/problems/前序/ACM模式如何构建二叉树.md index d3b2656e..fc7a1823 100644 --- a/problems/前序/ACM模式如何构建二叉树.md +++ b/problems/前序/ACM模式如何构建二叉树.md @@ -251,7 +251,4 @@ int main() { ``` ----------------------- -* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) -* B站视频:[代码随想录](https://space.bilibili.com/525438321) -* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)
diff --git a/problems/前序/BAT级别技术面试流程和注意事项都在这里了.md b/problems/前序/BAT级别技术面试流程和注意事项都在这里了.md index c5797739..6678860d 100644 --- a/problems/前序/BAT级别技术面试流程和注意事项都在这里了.md +++ b/problems/前序/BAT级别技术面试流程和注意事项都在这里了.md @@ -218,7 +218,4 @@ leetcode是专门针对算法练习的题库,leetcode现在也推出了中文 ----------------------- -* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) -* B站视频:[代码随想录](https://space.bilibili.com/525438321) -* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)
diff --git a/problems/前序/On的算法居然超时了,此时的n究竟是多大?.md b/problems/前序/On的算法居然超时了,此时的n究竟是多大?.md index 9a56937c..5257ceb9 100644 --- a/problems/前序/On的算法居然超时了,此时的n究竟是多大?.md +++ b/problems/前序/On的算法居然超时了,此时的n究竟是多大?.md @@ -280,7 +280,4 @@ public class TimeComplexity { ----------------------- -* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) -* B站视频:[代码随想录](https://space.bilibili.com/525438321) -* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)
diff --git a/problems/前序/上海互联网公司总结.md b/problems/前序/上海互联网公司总结.md index 08c15895..ffcbe77b 100644 --- a/problems/前序/上海互联网公司总结.md +++ b/problems/前序/上海互联网公司总结.md @@ -130,7 +130,4 @@ ----------------------- -* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) -* B站视频:[代码随想录](https://space.bilibili.com/525438321) -* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)
diff --git a/problems/前序/什么是核心代码模式,什么又是ACM模式?.md b/problems/前序/什么是核心代码模式,什么又是ACM模式?.md index 3c5fb4e4..54c5b6ec 100644 --- a/problems/前序/什么是核心代码模式,什么又是ACM模式?.md +++ b/problems/前序/什么是核心代码模式,什么又是ACM模式?.md @@ -119,7 +119,4 @@ int main() { ----------------------- -* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) -* B站视频:[代码随想录](https://space.bilibili.com/525438321) -* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)
diff --git a/problems/前序/关于时间复杂度,你不知道的都在这里!.md b/problems/前序/关于时间复杂度,你不知道的都在这里!.md index cfcbed1a..478b82e4 100644 --- a/problems/前序/关于时间复杂度,你不知道的都在这里!.md +++ b/problems/前序/关于时间复杂度,你不知道的都在这里!.md @@ -170,7 +170,4 @@ $O(2 × n^2 + 10 × n + 1000) < O(3 × n^2)$,所以说最后省略掉常数项 ----------------------- -* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) -* B站视频:[代码随想录](https://space.bilibili.com/525438321) -* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)
diff --git a/problems/前序/关于空间复杂度,可能有几个疑问?.md b/problems/前序/关于空间复杂度,可能有几个疑问?.md index 95ffe597..d49b42a2 100644 --- a/problems/前序/关于空间复杂度,可能有几个疑问?.md +++ b/problems/前序/关于空间复杂度,可能有几个疑问?.md @@ -73,7 +73,4 @@ for (int i = 0; i < n; i++) { ----------------------- -* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) -* B站视频:[代码随想录](https://space.bilibili.com/525438321) -* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)
diff --git a/problems/前序/刷了这么多题,你了解自己代码的内存消耗么?.md b/problems/前序/刷了这么多题,你了解自己代码的内存消耗么?.md index 3fccfb22..0364fc8b 100644 --- a/problems/前序/刷了这么多题,你了解自己代码的内存消耗么?.md +++ b/problems/前序/刷了这么多题,你了解自己代码的内存消耗么?.md @@ -150,7 +150,4 @@ char型的数据和int型的数据挨在一起,该int数据从地址1开始, ----------------------- -* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) -* B站视频:[代码随想录](https://space.bilibili.com/525438321) -* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)
diff --git a/problems/前序/力扣上的代码想在本地编译运行?.md b/problems/前序/力扣上的代码想在本地编译运行?.md index c4899a20..dca6eec3 100644 --- a/problems/前序/力扣上的代码想在本地编译运行?.md +++ b/problems/前序/力扣上的代码想在本地编译运行?.md @@ -67,7 +67,4 @@ int main() { ----------------------- -* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) -* B站视频:[代码随想录](https://space.bilibili.com/525438321) -* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)
diff --git a/problems/前序/北京互联网公司总结.md b/problems/前序/北京互联网公司总结.md index 0e22dad6..02a877b7 100644 --- a/problems/前序/北京互联网公司总结.md +++ b/problems/前序/北京互联网公司总结.md @@ -116,7 +116,4 @@ ----------------------- -* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) -* B站视频:[代码随想录](https://space.bilibili.com/525438321) -* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)
diff --git a/problems/前序/广州互联网公司总结.md b/problems/前序/广州互联网公司总结.md index ae41c899..1cf0da36 100644 --- a/problems/前序/广州互联网公司总结.md +++ b/problems/前序/广州互联网公司总结.md @@ -79,7 +79,4 @@ ----------------------- -* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) -* B站视频:[代码随想录](https://space.bilibili.com/525438321) -* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)
diff --git a/problems/前序/成都互联网公司总结.md b/problems/前序/成都互联网公司总结.md index d44800cd..7964f23c 100644 --- a/problems/前序/成都互联网公司总结.md +++ b/problems/前序/成都互联网公司总结.md @@ -77,7 +77,4 @@ ----------------------- -* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) -* B站视频:[代码随想录](https://space.bilibili.com/525438321) -* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)
diff --git a/problems/前序/杭州互联网公司总结.md b/problems/前序/杭州互联网公司总结.md index 326a176b..029ee380 100644 --- a/problems/前序/杭州互联网公司总结.md +++ b/problems/前序/杭州互联网公司总结.md @@ -87,7 +87,4 @@ ----------------------- -* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) -* B站视频:[代码随想录](https://space.bilibili.com/525438321) -* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)
diff --git a/problems/前序/深圳互联网公司总结.md b/problems/前序/深圳互联网公司总结.md index 9e089315..61bd52e8 100644 --- a/problems/前序/深圳互联网公司总结.md +++ b/problems/前序/深圳互联网公司总结.md @@ -82,7 +82,4 @@ ----------------------- -* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) -* B站视频:[代码随想录](https://space.bilibili.com/525438321) -* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)
diff --git a/problems/前序/程序员写文档工具.md b/problems/前序/程序员写文档工具.md index e4193c42..5504ae7a 100644 --- a/problems/前序/程序员写文档工具.md +++ b/problems/前序/程序员写文档工具.md @@ -136,7 +136,4 @@ Markdown支持部分html,例如这样 ----------------------- -* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) -* B站视频:[代码随想录](https://space.bilibili.com/525438321) -* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)
diff --git a/problems/前序/程序员简历.md b/problems/前序/程序员简历.md index f47516dc..522fc5f7 100644 --- a/problems/前序/程序员简历.md +++ b/problems/前序/程序员简历.md @@ -133,7 +133,4 @@ Carl校招社招都拿过大厂的offer,同时也看过很多应聘者的简 ----------------------- -* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) -* B站视频:[代码随想录](https://space.bilibili.com/525438321) -* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)
diff --git a/problems/前序/递归算法的时间与空间复杂度分析.md b/problems/前序/递归算法的时间与空间复杂度分析.md index 4dd340a6..914cccfd 100644 --- a/problems/前序/递归算法的时间与空间复杂度分析.md +++ b/problems/前序/递归算法的时间与空间复杂度分析.md @@ -269,7 +269,4 @@ int binary_search( int arr[], int l, int r, int x) { ----------------------- -* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) -* B站视频:[代码随想录](https://space.bilibili.com/525438321) -* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)
diff --git a/problems/前序/通过一道面试题目,讲一讲递归算法的时间复杂度!.md b/problems/前序/通过一道面试题目,讲一讲递归算法的时间复杂度!.md index 8780122f..849a025d 100644 --- a/problems/前序/通过一道面试题目,讲一讲递归算法的时间复杂度!.md +++ b/problems/前序/通过一道面试题目,讲一讲递归算法的时间复杂度!.md @@ -152,7 +152,4 @@ int function3(int x, int n) { ----------------------- -* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) -* B站视频:[代码随想录](https://space.bilibili.com/525438321) -* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)
From f5fe6bd73c936faedc52b93de3cd56ec39c0ec84 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 18 Feb 2022 23:33:57 +0800 Subject: [PATCH 130/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88530.?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=E7=9A=84=E6=9C=80?= =?UTF-8?q?=E5=B0=8F=E7=BB=9D=E5=AF=B9=E5=B7=AE=EF=BC=89=EF=BC=9A=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0530.二叉搜索树的最小绝对差.md | 71 ++++++++++++++++++++++++- 1 file changed, 70 insertions(+), 1 deletion(-) diff --git a/problems/0530.二叉搜索树的最小绝对差.md b/problems/0530.二叉搜索树的最小绝对差.md index 3ebb4c8c..77699c9f 100644 --- a/problems/0530.二叉搜索树的最小绝对差.md +++ b/problems/0530.二叉搜索树的最小绝对差.md @@ -238,7 +238,7 @@ class Solution: cur = cur.right return result -``` +``` ## Go: @@ -364,5 +364,74 @@ var getMinimumDifference = function(root) { } ``` +## TypeScript + +> 辅助数组解决 + +```typescript +function getMinimumDifference(root: TreeNode | null): number { + let helperArr: number[] = []; + function recur(root: TreeNode | null): void { + if (root === null) return; + recur(root.left); + helperArr.push(root.val); + recur(root.right); + } + recur(root); + let resMin: number = Infinity; + for (let i = 0, length = helperArr.length; i < length - 1; i++) { + resMin = Math.min(resMin, helperArr[i + 1] - helperArr[i]); + } + return resMin; +}; +``` + +> 递归中解决 + +```typescript +function getMinimumDifference(root: TreeNode | null): number { + let preNode: TreeNode | null= null; + let resMin: number = Infinity; + function recur(root: TreeNode | null): void { + if (root === null) return; + recur(root.left); + if (preNode !== null) { + resMin = Math.min(resMin, root.val - preNode.val); + } + preNode = root; + recur(root.right); + } + recur(root); + return resMin; +}; +``` + +> 迭代法-中序遍历 + +```typescript +function getMinimumDifference(root: TreeNode | null): number { + const helperStack: TreeNode[] = []; + let curNode: TreeNode | null = root; + let resMin: number = Infinity; + let preNode: TreeNode | null = null; + while (curNode !== null || helperStack.length > 0) { + if (curNode !== null) { + helperStack.push(curNode); + curNode = curNode.left; + } else { + curNode = helperStack.pop()!; + if (preNode !== null) { + resMin = Math.min(resMin, curNode.val - preNode.val); + } + preNode = curNode; + curNode = curNode.right; + } + } + return resMin; +}; +``` + + + -----------------------
From 28cff716ac11f9f5970593fb42a38b399eae9490 Mon Sep 17 00:00:00 2001 From: bqlin Date: Tue, 21 Dec 2021 11:52:30 +0800 Subject: [PATCH 131/328] =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84?= =?UTF-8?q?=E9=80=92=E5=BD=92=E9=81=8D=E5=8E=86=EF=BC=9A=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=8E=92=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/二叉树的递归遍历.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/problems/二叉树的递归遍历.md b/problems/二叉树的递归遍历.md index c481fd11..9e131c6d 100644 --- a/problems/二叉树的递归遍历.md +++ b/problems/二叉树的递归遍历.md @@ -34,19 +34,19 @@ 1. **确定递归函数的参数和返回值**:因为要打印出前序遍历节点的数值,所以参数里需要传入vector在放节点的数值,除了这一点就不需要在处理什么数据了也不需要有返回值,所以递归函数返回类型就是void,代码如下: -``` +```cpp void traversal(TreeNode* cur, vector& vec) ``` 2. **确定终止条件**:在递归的过程中,如何算是递归结束了呢,当然是当前遍历的节点是空了,那么本层递归就要要结束了,所以如果当前遍历的这个节点是空,就直接return,代码如下: -``` +```cpp if (cur == NULL) return; ``` 3. **确定单层递归的逻辑**:前序遍历是中左右的循序,所以在单层递归的逻辑,是要先取中节点的数值,代码如下: -``` +```cpp vec.push_back(cur->val); // 中 traversal(cur->left, vec); // 左 traversal(cur->right, vec); // 右 From a9ae0f5d03b4e6f819c3c3d518f2984cf54d8810 Mon Sep 17 00:00:00 2001 From: bqlin Date: Tue, 21 Dec 2021 11:55:45 +0800 Subject: [PATCH 132/328] =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84?= =?UTF-8?q?=E8=BF=AD=E4=BB=A3=E9=81=8D=E5=8E=86=EF=BC=9A=E8=A1=A5=E5=85=85?= =?UTF-8?q?Swift=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Conflicts: # problems/二叉树的迭代遍历.md --- problems/二叉树的迭代遍历.md | 104 +++++++++++++++-------------------- 1 file changed, 45 insertions(+), 59 deletions(-) diff --git a/problems/二叉树的迭代遍历.md b/problems/二叉树的迭代遍历.md index ba38726b..8164724b 100644 --- a/problems/二叉树的迭代遍历.md +++ b/problems/二叉树的迭代遍历.md @@ -390,7 +390,7 @@ func inorderTraversal(root *TreeNode) []int { } ``` -javaScript +javaScript: ```js @@ -454,7 +454,7 @@ var postorderTraversal = function(root, res = []) { }; ``` -TypeScript: +TypeScript: ```typescript // 前序遍历(迭代法) @@ -509,77 +509,63 @@ function postorderTraversal(root: TreeNode | null): number[] { }; ``` -Swift: +Swift: -> 迭代法前序遍历 ```swift +// 前序遍历迭代法 func preorderTraversal(_ root: TreeNode?) -> [Int] { - var res = [Int]() - if root == nil { - return res - } - var stack = [TreeNode]() - stack.append(root!) + var result = [Int]() + guard let root = root else { return result } + var stack = [root] while !stack.isEmpty { - let node = stack.popLast()! - res.append(node.val) - if node.right != nil { - stack.append(node.right!) + let current = stack.removeLast() + // 先右后左,这样出栈的时候才是左右顺序 + if let node = current.right { // 右 + stack.append(node) } - if node.left != nil { - stack.append(node.left!) + if let node = current.left { // 左 + stack.append(node) } + result.append(current.val) // 中 } - return res + return result } -``` -> 迭代法中序遍历 -```swift -func inorderTraversal(_ root: TreeNode?) -> [Int] { - var res = [Int]() - if root == nil { - return res - } - var stack = [TreeNode]() - var cur: TreeNode? = root - while cur != nil || !stack.isEmpty { - if cur != nil { - stack.append(cur!) - cur = cur!.left - } else { - cur = stack.popLast() - res.append(cur!.val) - cur = cur!.right - } - } - return res -} -``` - -> 迭代法后序遍历 -```swift +// 后序遍历迭代法 func postorderTraversal(_ root: TreeNode?) -> [Int] { - var res = [Int]() - if root == nil { - return res - } - var stack = [TreeNode]() - stack.append(root!) - // res 存储 中 -> 右 -> 左 + var result = [Int]() + guard let root = root else { return result } + var stack = [root] while !stack.isEmpty { - let node = stack.popLast()! - res.append(node.val) - if node.left != nil { - stack.append(node.left!) + let current = stack.removeLast() + // 与前序相反,即中右左,最后结果还需反转才是后序 + if let node = current.left { // 左 + stack.append(node) } - if node.right != nil { - stack.append(node.right!) + if let node = current.right { // 右 + stack.append(node) + } + result.append(current.val) // 中 + } + return result.reversed() +} + +// 中序遍历迭代法 +func inorderTraversal(_ root: TreeNode?) -> [Int] { + var result = [Int]() + var stack = [TreeNode]() + var current: TreeNode! = root + while current != nil || !stack.isEmpty { + if current != nil { // 先访问到最左叶子 + stack.append(current) + current = current.left // 左 + } else { + current = stack.removeLast() + result.append(current.val) // 中 + current = current.right // 右 } } - // res 翻转 - res.reverse() - return res + return result } ``` From af547486756b7213d17c10dd76c1a6e518a9b1fa Mon Sep 17 00:00:00 2001 From: bqlin Date: Tue, 21 Dec 2021 14:57:57 +0800 Subject: [PATCH 133/328] =?UTF-8?q?0102.=E4=BA=8C=E5=8F=89=E6=A0=91?= =?UTF-8?q?=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86=EF=BC=9A=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E6=8E=92=E7=89=88=EF=BC=8C=E8=A1=A5=E5=85=85Swift?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Conflicts: # problems/0102.二叉树的层序遍历.md --- problems/0102.二叉树的层序遍历.md | 332 ++++++++++++++---------------- 1 file changed, 156 insertions(+), 176 deletions(-) diff --git a/problems/0102.二叉树的层序遍历.md b/problems/0102.二叉树的层序遍历.md index 1a92d42f..8d6d2502 100644 --- a/problems/0102.二叉树的层序遍历.md +++ b/problems/0102.二叉树的层序遍历.md @@ -273,32 +273,29 @@ function levelOrder(root: TreeNode | null): number[][] { }; ``` -Swift: +Swift: ```swift func levelOrder(_ root: TreeNode?) -> [[Int]] { - var res = [[Int]]() - guard let root = root else { - return res - } - var queue = [TreeNode]() - queue.append(root) + var result = [[Int]]() + guard let root = root else { return result } + // 表示一层 + var queue = [root] while !queue.isEmpty { - let size = queue.count - var sub = [Int]() - for _ in 0 ..< size { + let count = queue.count + var subarray = [Int]() + for _ in 0 ..< count { + // 当前层 let node = queue.removeFirst() - sub.append(node.val) - if let left = node.left { - queue.append(left) - } - if let right = node.right { - queue.append(right) - } + subarray.append(node.val) + // 下一层 + if let node = node.left { queue.append(node) } + if let node = node.right { queue.append(node) } } - res.append(sub) + result.append(subarray) } - return res + + return result } ``` @@ -505,30 +502,29 @@ function levelOrderBottom(root: TreeNode | null): number[][] { }; ``` -Swift: +Swift: ```swift func levelOrderBottom(_ root: TreeNode?) -> [[Int]] { - var res = [[Int]]() - guard let root = root else { - return res - } - var queue: [TreeNode] = [root] + // 表示一层 + var queue = [TreeNode]() + if let node = root { queue.append(node) } + var result = [[Int]]() while !queue.isEmpty { - var sub = [Int]() - for _ in 0 ..< queue.count { + let count = queue.count + var subarray = [Int]() + for _ in 0 ..< count { + // 当前层 let node = queue.removeFirst() - sub.append(node.val) - if let left = node.left { - queue.append(left) - } - if let right = node.right { - queue.append(right) - } + subarray.append(node.val) + // 下一层 + if let node = node.left { queue.append(node) } + if let node = node.right { queue.append(node)} } - res.insert(sub, at: 0) + result.append(subarray) } - return res + + return result.reversed() } ``` @@ -729,37 +725,31 @@ function rightSideView(root: TreeNode | null): number[] { }; ``` -Swift: +Swift: ```swift func rightSideView(_ root: TreeNode?) -> [Int] { - var res = [Int]() - guard let root = root else { - return res - } + // 表示一层 var queue = [TreeNode]() - queue.append(root) + if let node = root { queue.append(node) } + var result = [Int]() while !queue.isEmpty { - let size = queue.count - for i in 0 ..< size { + let count = queue.count + for i in 0 ..< count { + // 当前层 let node = queue.removeFirst() - if i == size - 1 { - // 保存 每层最后一个元素 - res.append(node.val) - } - if let left = node.left { - queue.append(left) - } - if let right = node.right { - queue.append(right) - } + if i == count - 1 { result.append(node.val) } + + // 下一层 + if let node = node.left { queue.append(node) } + if let node = node.right { queue.append(node) } } } - return res + + return result } ``` - # 637.二叉树的层平均值 [力扣题目链接](https://leetcode-cn.com/problems/average-of-levels-in-binary-tree/) @@ -965,32 +955,30 @@ function averageOfLevels(root: TreeNode | null): number[] { }; ``` -Swift: +Swift: ```swift func averageOfLevels(_ root: TreeNode?) -> [Double] { - var res = [Double]() - guard let root = root else { - return res - } + // 表示一层 var queue = [TreeNode]() - queue.append(root) + if let node = root { queue.append(node) } + var result = [Double]() while !queue.isEmpty { - let size = queue.count + let count = queue.count var sum = 0 - for _ in 0 ..< size { + for _ in 0 ..< count { + // 当前层 let node = queue.removeFirst() sum += node.val - if let left = node.left { - queue.append(left) - } - if let right = node.right { - queue.append(right) - } + + // 下一层 + if let node = node.left { queue.append(node) } + if let node = node.right { queue.append(node) } } - res.append(Double(sum) / Double(size)) + result.append(Double(sum) / Double(count)) } - return res + + return result } ``` @@ -1212,29 +1200,28 @@ function levelOrder(root: Node | null): number[][] { }; ``` -Swift: +Swift: ```swift func levelOrder(_ root: Node?) -> [[Int]] { - var res = [[Int]]() - guard let root = root else { - return res - } + // 表示一层 var queue = [Node]() - queue.append(root) + if let node = root { queue.append(node) } + var result = [[Int]]() while !queue.isEmpty { - let size = queue.count - var sub = [Int]() - for _ in 0 ..< size { + let count = queue.count + var subarray = [Int]() + for _ in 0 ..< count { + // 当前层 let node = queue.removeFirst() - sub.append(node.val) - for childNode in node.children { - queue.append(childNode) - } + subarray.append(node.val) + // 下一层 + for node in node.children { queue.append(node) } } - res.append(sub) + result.append(subarray) } - return res + + return result } ``` @@ -1419,34 +1406,30 @@ function largestValues(root: TreeNode | null): number[] { }; ``` -Swift: +Swift: ```swift func largestValues(_ root: TreeNode?) -> [Int] { - var res = [Int]() - guard let root = root else { - return res - } + // 表示一层 var queue = [TreeNode]() - queue.append(root) + if let node = root { queue.append(node) } + var result = [Int]() while !queue.isEmpty { - let size = queue.count - var max: Int = Int.min - for _ in 0 ..< size { + let count = queue.count + var max = queue[0].val + for _ in 0 ..< count { + // 当前层 let node = queue.removeFirst() - if node.val > max { - max = node.val - } - if let left = node.left { - queue.append(left) - } - if let right = node.right { - queue.append(right) - } + if node.val > max { max = node.val } + + // 下一层 + if let node = node.left { queue.append(node) } + if let node = node.right { queue.append(node) } } - res.append(max) + result.append(max) } - return res + + return result } ``` @@ -1456,7 +1439,7 @@ func largestValues(_ root: TreeNode?) -> [Int] { 给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下: -``` +```cpp struct Node { int val; Node *left; @@ -1677,33 +1660,34 @@ func connect(root *Node) *Node { } ``` -Swift: +Swift: + ```swift func connect(_ root: Node?) -> Node? { - guard let root = root else { - return nil - } + // 表示一层 var queue = [Node]() - queue.append(root) + if let node = root { queue.append(node) } while !queue.isEmpty { - let size = queue.count - var preNode: Node? - for i in 0 ..< size { - let node = queue.removeFirst() + let count = queue.count + var current, previous: Node! + for i in 0 ..< count { + // 当前层 if i == 0 { - preNode = node + previous = queue.removeFirst() + current = previous } else { - preNode?.next = node - preNode = node - } - if let left = node.left { - queue.append(left) - } - if let right = node.right { - queue.append(right) + current = queue.removeFirst() + previous.next = current + previous = current } + + // 下一层 + if let node = current.left { queue.append(node) } + if let node = current.right { queue.append(node) } } + previous.next = nil } + return root } ``` @@ -1927,34 +1911,34 @@ func connect(root *Node) *Node { return root } ``` - Swift: + ```swift func connect(_ root: Node?) -> Node? { - guard let root = root else { - return nil - } + // 表示一层 var queue = [Node]() - queue.append(root) + if let node = root { queue.append(node) } while !queue.isEmpty { - let size = queue.count - var preNode: Node? - for i in 0 ..< size { - let node = queue.removeFirst() + let count = queue.count + var current, previous: Node! + for i in 0 ..< count { + // 当前层 if i == 0 { - preNode = node + previous = queue.removeFirst() + current = previous } else { - preNode?.next = node - preNode = node - } - if let left = node.left { - queue.append(left) - } - if let right = node.right { - queue.append(right) + current = queue.removeFirst() + previous.next = current + previous = current } + + // 下一层 + if let node = current.left { queue.append(node) } + if let node = current.right { queue.append(node) } } + previous.next = nil } + return root } ``` @@ -2151,29 +2135,28 @@ function maxDepth(root: TreeNode | null): number { }; ``` -Swift: +Swift: ```swift func maxDepth(_ root: TreeNode?) -> Int { - guard let root = root else { - return 0 - } + guard root != nil else { return 0 } + var depth = 0 var queue = [TreeNode]() - queue.append(root) - var res: Int = 0 + queue.append(root!) while !queue.isEmpty { - for _ in 0 ..< queue.count { + let count = queue.count + depth += 1 + for _ in 0 ..< count { + // 当前层 let node = queue.removeFirst() - if let left = node.left { - queue.append(left) - } - if let right = node.right { - queue.append(right) - } + + // 下一层 + if let node = node.left { queue.append(node) } + if let node = node.right { queue.append(node) } } - res += 1 } - return res + + return depth } ``` @@ -2374,28 +2357,25 @@ Swift: ```swift func minDepth(_ root: TreeNode?) -> Int { - guard let root = root else { - return 0 - } - var res = 0 - var queue = [TreeNode]() - queue.append(root) + guard root != nil else { return 0 } + var depth = 0 + var queue = [root!] while !queue.isEmpty { - res += 1 - for _ in 0 ..< queue.count { + let count = queue.count + depth += 1 + for _ in 0 ..< count { + // 当前层 let node = queue.removeFirst() - if node.left == nil && node.right == nil { - return res - } - if let left = node.left { - queue.append(left) - } - if let right = node.right { - queue.append(right) + if node.left == nil, node.right == nil { // 遇到叶子结点则返回 + return depth } + + // 下一层 + if let node = node.left { queue.append(node) } + if let node = node.right { queue.append(node) } } } - return res + return depth } ``` From 53d4999ad8e7b16a790a8cfcdb6a0f030ec96dfd Mon Sep 17 00:00:00 2001 From: bqlin Date: Sat, 25 Dec 2021 17:14:15 +0800 Subject: [PATCH 134/328] =?UTF-8?q?0226.=E7=BF=BB=E8=BD=AC=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=EF=BC=9A=E4=BC=98=E5=8C=96=E6=8E=92=E7=89=88?= =?UTF-8?q?=EF=BC=8C=E8=A1=A5=E5=85=85Swift=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Conflicts: # problems/0226.翻转二叉树.md --- problems/0226.翻转二叉树.md | 63 +++++++++++++++++++++++++++++++------ 1 file changed, 54 insertions(+), 9 deletions(-) diff --git a/problems/0226.翻转二叉树.md b/problems/0226.翻转二叉树.md index 8108e7ad..a3ebe24d 100644 --- a/problems/0226.翻转二叉树.md +++ b/problems/0226.翻转二叉树.md @@ -47,8 +47,6 @@ ## 递归法 - - 对于二叉树的递归法的前中后序遍历,已经在[二叉树:前中后序递归遍历](https://programmercarl.com/二叉树的递归遍历.html)详细讲解了。 我们下文以前序遍历为例,通过动画来看一下翻转的过程: @@ -63,7 +61,7 @@ 返回值的话其实也不需要,但是题目中给出的要返回root节点的指针,可以直接使用题目定义好的函数,所以就函数的返回类型为`TreeNode*`。 -``` +```cpp TreeNode* invertTree(TreeNode* root) ``` @@ -71,7 +69,7 @@ TreeNode* invertTree(TreeNode* root) 当前节点为空的时候,就返回 -``` +```cpp if (root == NULL) return root; ``` @@ -79,7 +77,7 @@ if (root == NULL) return root; 因为是先前序遍历,所以先进行交换左右孩子节点,然后反转左子树,反转右子树。 -``` +```cpp swap(root->left, root->right); invertTree(root->left); invertTree(root->right); @@ -257,7 +255,7 @@ public: ## 其他语言版本 -### Java: +### Java ```Java //DFS递归 @@ -469,8 +467,6 @@ func invertTree(root *TreeNode) *TreeNode { } ``` - - ### JavaScript 使用递归版本的前序遍历 @@ -690,7 +686,7 @@ function invertTree(root: TreeNode | null): TreeNode | null { }; ``` -### C: +### C 递归法 ```c @@ -775,5 +771,54 @@ func invertTree1(_ root: TreeNode?) -> TreeNode? { } ``` +### Swift + +深度优先递归。 + +```swift +func invertTree(_ root: TreeNode?) -> TreeNode? { + guard let node = root else { return root } + swap(&node.left, &node.right) + _ = invertTree(node.left) + _ = invertTree(node.right) + return root +} +``` + +深度优先迭代,子结点顺序不重要,从根结点出发深度遍历即可。 + +```swift +func invertTree(_ root: TreeNode?) -> TreeNode? { + guard let node = root else { return root } + var stack = [node] + while !stack.isEmpty { + guard let node = stack.popLast() else { break } + swap(&node.left, &node.right) + if let node = node.left { stack.append(node) } + if let node = node.right { stack.append(node) } + } + return root +} +``` + +广度优先迭代。 + +```swift +func invertTree(_ root: TreeNode?) -> TreeNode? { + guard let node = root else { return root } + var queue = [node] + while !queue.isEmpty { + let count = queue.count + for _ in 0 ..< count { + let node = queue.removeFirst() + swap(&node.left, &node.right) + if let node = node.left { queue.append(node) } + if let node = node.right { queue.append(node) } + } + } + return root +} +``` + -----------------------
From 9b991d89948d5793f1f93cedb7d0c2093586506e Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sat, 19 Feb 2022 15:05:26 +0800 Subject: [PATCH 135/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880501.?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E4=BC=97=E6=95=B0.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typesc?= =?UTF-8?q?ript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0501.二叉搜索树中的众数.md | 105 +++++++++++++++++++++++++++- 1 file changed, 103 insertions(+), 2 deletions(-) diff --git a/problems/0501.二叉搜索树中的众数.md b/problems/0501.二叉搜索树中的众数.md index 277f46f5..1be9ee6a 100644 --- a/problems/0501.二叉搜索树中的众数.md +++ b/problems/0501.二叉搜索树中的众数.md @@ -512,7 +512,7 @@ class Solution: self.search_BST(cur.right) ``` - + > 迭代法-中序遍历-不使用额外空间,利用二叉搜索树特性 ```python3 @@ -661,7 +661,7 @@ var findMode = function(root) { } return res; }; -``` +``` 不使用额外空间,利用二叉树性质,中序遍历(有序): @@ -699,6 +699,107 @@ var findMode = function(root) { }; ``` +## TypeScript + +> 辅助Map法 + +```typescript +function findMode(root: TreeNode | null): number[] { + if (root === null) return []; + const countMap: Map = new Map(); + function traverse(root: TreeNode | null): void { + if (root === null) return; + countMap.set(root.val, (countMap.get(root.val) || 0) + 1); + traverse(root.left); + traverse(root.right); + } + traverse(root); + const countArr: number[][] = Array.from(countMap); + countArr.sort((a, b) => { + return b[1] - a[1]; + }) + const resArr: number[] = []; + const maxCount: number = countArr[0][1]; + for (let i of countArr) { + if (i[1] === maxCount) resArr.push(i[0]); + } + return resArr; +}; +``` + +> 递归中直接解决 + +```typescript +function findMode(root: TreeNode | null): number[] { + let preNode: TreeNode | null = null; + let maxCount: number = 0; + let count: number = 0; + let resArr: number[] = []; + function traverse(root: TreeNode | null): void { + if (root === null) return; + traverse(root.left); + if (preNode === null) { // 第一个节点 + count = 1; + } else if (preNode.val === root.val) { + count++; + } else { + count = 1; + } + if (count === maxCount) { + resArr.push(root.val); + } else if (count > maxCount) { + maxCount = count; + resArr.length = 0; + resArr.push(root.val); + } + preNode = root; + traverse(root.right); + } + traverse(root); + return resArr; +}; +``` + +> 迭代法 + +```typescript +function findMode(root: TreeNode | null): number[] { + const helperStack: TreeNode[] = []; + const resArr: number[] = []; + let maxCount: number = 0; + let count: number = 0; + let preNode: TreeNode | null = null; + let curNode: TreeNode | null = root; + while (curNode !== null || helperStack.length > 0) { + if (curNode !== null) { + helperStack.push(curNode); + curNode = curNode.left; + } else { + curNode = helperStack.pop()!; + if (preNode === null) { // 第一个节点 + count = 1; + } else if (preNode.val === curNode.val) { + count++; + } else { + count = 1; + } + if (count === maxCount) { + resArr.push(curNode.val); + } else if (count > maxCount) { + maxCount = count; + resArr.length = 0; + resArr.push(curNode.val); + } + preNode = curNode; + curNode = curNode.right; + } + } + return resArr; +}; +``` + + + -----------------------
From 292fe1eb380622ce4fc19f2d05ef26bb472e855d Mon Sep 17 00:00:00 2001 From: hs-zhangsan <1513157458@qq.com> Date: Sat, 19 Feb 2022 15:55:31 +0800 Subject: [PATCH 136/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E5=89=91=E6=8C=87?= =?UTF-8?q?Offer=2005.=E6=9B=BF=E6=8D=A2=E7=A9=BA=E6=A0=BC=20C=E8=AF=AD?= =?UTF-8?q?=E8=A8=80=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/剑指Offer05.替换空格.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/problems/剑指Offer05.替换空格.md b/problems/剑指Offer05.替换空格.md index 530545fb..9e743887 100644 --- a/problems/剑指Offer05.替换空格.md +++ b/problems/剑指Offer05.替换空格.md @@ -121,6 +121,37 @@ for (int i = 0; i < a.size(); i++) { ## 其他语言版本 +C: +```C +char* replaceSpace(char* s){ + //统计空格数量 + int count = 0; + int len = strlen(s); + for (int i = 0; i < len; i++) { + if (s[i] == ' ') { + count++; + } + } + + //为新数组分配空间 + int newLen = len + count * 2; + char* result = malloc(sizeof(char) * newLen + 1); + //填充新数组并替换空格 + for (int i = len - 1, j = newLen - 1; i >= 0; i--, j--) { + if (s[i] != ' ') { + result[j] = s[i]; + } else { + result[j--] = '0'; + result[j--] = '2'; + result[j] = '%'; + } + } + result[newLen] = '\0'; + + return result; +} +``` + Java: ```Java From bb277e08e19b797a1b5da5bfe0c60ef84b5c9c8e Mon Sep 17 00:00:00 2001 From: K-945 <393763635@qq.com> Date: Sun, 20 Feb 2022 17:56:21 +0800 Subject: [PATCH 137/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A00059.=E8=9E=BA?= =?UTF-8?q?=E6=97=8B=E7=9F=A9=E9=98=B5II.md=20=E5=92=8C=E8=A7=A3=E6=9E=90?= =?UTF-8?q?=E7=9B=B8=E5=90=8C=E7=9A=84python=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0059.螺旋矩阵II.md | 60 ++++++++++++++----------------------- 1 file changed, 22 insertions(+), 38 deletions(-) diff --git a/problems/0059.螺旋矩阵II.md b/problems/0059.螺旋矩阵II.md index 3f7a59ca..a98e72ad 100644 --- a/problems/0059.螺旋矩阵II.md +++ b/problems/0059.螺旋矩阵II.md @@ -192,47 +192,31 @@ python: ```python3 class Solution: - def generateMatrix(self, n: int) -> List[List[int]]: - # 初始化要填充的正方形 - matrix = [[0] * n for _ in range(n)] + nums = [[0] * n for _ in range(n)] + startx, starty = 0, 0 # 起始点 + loop, mid = n // 2, n // 2 # 迭代次数、n为奇数时,矩阵的中心点 + count = 1 # 计数 - left, right, up, down = 0, n - 1, 0, n - 1 - number = 1 # 要填充的数字 + for offset in range(1, loop + 1) : # 每循环一层偏移量加1,偏移量从1开始 + for i in range(starty, n - offset) : # 从左至右,左闭右开 + nums[startx][i] = count + count += 1 + for i in range(startx, n - offset) : # 从上至下 + nums[i][n - offset] = count + count += 1 + for i in range(n - offset, starty, -1) : # 从右至左 + nums[n - offset][i] = count + count += 1 + for i in range(n - offset, startx, -1) : # 从下至上 + nums[i][starty] = count + count += 1 + startx += 1 # 更新起始点 + starty += 1 - while left < right and up < down: - - # 从左到右填充上边 - for x in range(left, right): - matrix[up][x] = number - number += 1 - - # 从上到下填充右边 - for y in range(up, down): - matrix[y][right] = number - number += 1 - - # 从右到左填充下边 - for x in range(right, left, -1): - matrix[down][x] = number - number += 1 - - # 从下到上填充左边 - for y in range(down, up, -1): - matrix[y][left] = number - number += 1 - - # 缩小要填充的范围 - left += 1 - right -= 1 - up += 1 - down -= 1 - - # 如果阶数为奇数,额外填充一次中心 - if n % 2: - matrix[n // 2][n // 2] = number - - return matrix + if n % 2 != 0 : # n为奇数时,填充中心点 + nums[mid][mid] = count + return nums ``` javaScript From ceaaa2fd2d3114c75794b89fbb08005dd991b81c Mon Sep 17 00:00:00 2001 From: Epoch <75031971+messenger1th@users.noreply.github.com> Date: Mon, 21 Feb 2022 14:37:15 +0800 Subject: [PATCH 138/328] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200151.=E7=BF=BB?= =?UTF-8?q?=E8=BD=AC=E5=AD=97=E7=AC=A6=E4=B8=B2=E9=87=8C=E7=9A=84=E5=8D=95?= =?UTF-8?q?=E8=AF=8D=E7=9A=84CPP=E6=9B=B4=E7=AE=80=E6=B4=81=E7=9A=84?= =?UTF-8?q?=E7=89=88=E6=9C=AC2=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 用LC27的原理使得更为简洁。 --- problems/0151.翻转字符串里的单词.md | 35 +++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/problems/0151.翻转字符串里的单词.md b/problems/0151.翻转字符串里的单词.md index ead5fa12..677a8f64 100644 --- a/problems/0151.翻转字符串里的单词.md +++ b/problems/0151.翻转字符串里的单词.md @@ -222,7 +222,42 @@ public: 效率: +```CPP +//版本二: +class Solution { +public: + void reverseWord(string& s,int start,int end){ //这个函数,Carl哥的要更清晰。 + for(int i=start;i<(end-start)/2+start;++i){ + swap(s[i],s[end-1-i+start]); + } + } + void trim(string& s){//去除所有空格并在相邻单词之间添加空格 + int slow = 0; + for(int i=0;i Date: Thu, 24 Feb 2022 00:36:23 +0800 Subject: [PATCH 139/328] Added in one more python solution. Using defaultdict. --- problems/0454.四数相加II.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/problems/0454.四数相加II.md b/problems/0454.四数相加II.md index a7c903eb..a6cd413b 100644 --- a/problems/0454.四数相加II.md +++ b/problems/0454.四数相加II.md @@ -141,7 +141,24 @@ class Solution(object): ``` +```python +class Solution: + def fourSumCount(self, nums1: list, nums2: list, nums3: list, nums4: list) -> int: + from collections import defaultdict # You may use normal dict instead. + rec, cnt = defaultdict(lambda : 0), 0 + # To store the summary of all the possible combinations of nums1 & nums2, together with their frequencies. + for i in nums1: + for j in nums2: + rec[i+j] += 1 + # To add up the frequencies if the corresponding value occurs in the dictionary + for i in nums3: + for j in nums4: + cnt += rec.get(-(i+j), 0) # No matched key, return 0. + return cnt +``` + Go: + ```go func fourSumCount(nums1 []int, nums2 []int, nums3 []int, nums4 []int) int { m := make(map[int]int) From 3652d00e542fc251d479a66eb676c8e1ac910f45 Mon Sep 17 00:00:00 2001 From: Luo <82520819+Jerry-306@users.noreply.github.com> Date: Thu, 24 Feb 2022 17:49:15 +0800 Subject: [PATCH 140/328] =?UTF-8?q?0104=20=E4=BA=8C=E5=8F=89=E6=A0=91?= =?UTF-8?q?=E6=9C=80=E5=A4=A7=E6=B7=B1=E5=BA=A6=20=E9=83=A8=E5=88=86?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=B9=A6=E5=86=99=E9=94=99=E8=AF=AF=E7=BA=A0?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 函数错误,逻辑错误 --- problems/0104.二叉树的最大深度.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/problems/0104.二叉树的最大深度.md b/problems/0104.二叉树的最大深度.md index 3eecdc92..2229a854 100644 --- a/problems/0104.二叉树的最大深度.md +++ b/problems/0104.二叉树的最大深度.md @@ -523,8 +523,8 @@ func maxdepth(root *treenode) int { ```javascript var maxdepth = function(root) { - if (!root) return root - return 1 + math.max(maxdepth(root.left), maxdepth(root.right)) + if (root === null) return 0; + return 1 + Math.max(maxdepth(root.left), maxdepth(root.right)) }; ``` @@ -541,7 +541,7 @@ var maxdepth = function(root) { //3. 确定单层逻辑 let leftdepth=getdepth(node.left); let rightdepth=getdepth(node.right); - let depth=1+math.max(leftdepth,rightdepth); + let depth=1+Math.max(leftdepth,rightdepth); return depth; } return getdepth(root); @@ -591,7 +591,9 @@ var maxDepth = function(root) { count++ while(size--) { let node = queue.shift() - node && (queue = [...queue, ...node.children]) + for (let item of node.children) { + item && queue.push(item); + } } } return count From 5b78393ac4e70db5cf9518090f4cb563c68e11d6 Mon Sep 17 00:00:00 2001 From: Camille0512 Date: Fri, 25 Feb 2022 00:57:43 +0800 Subject: [PATCH 141/328] modified 15. Add a new version with the same idea. --- problems/0015.三数之和.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/problems/0015.三数之和.md b/problems/0015.三数之和.md index e191eabc..1d811b76 100644 --- a/problems/0015.三数之和.md +++ b/problems/0015.三数之和.md @@ -243,7 +243,34 @@ class Solution: right -= 1 return ans ``` +Python (v2): + +```python +class Solution: + def threeSum(self, nums: List[int]) -> List[List[int]]: + if len(nums) < 3: return [] + nums, res = sorted(nums), [] + for i in range(len(nums) - 2): + cur, l, r = nums[i], i + 1, len(nums) - 1 + if res != [] and res[-1][0] == cur: continue # Drop duplicates for the first time. + + while l < r: + if cur + nums[l] + nums[r] == 0: + res.append([cur, nums[l], nums[r]]) + # Drop duplicates for the second time in interation of l & r. Only used when target situation occurs, because that is the reason for dropping duplicates. + while l < r - 1 and nums[l] == nums[l + 1]: + l += 1 + while r > l + 1 and nums[r] == nums[r - 1]: + r -= 1 + if cur + nums[l] + nums[r] > 0: + r -= 1 + else: + l += 1 + return res +``` + Go: + ```Go func threeSum(nums []int)[][]int{ sort.Ints(nums) From 14f91a53702d8df5e1a587e757f739b5df55bb8f Mon Sep 17 00:00:00 2001 From: Luo <82520819+Jerry-306@users.noreply.github.com> Date: Fri, 25 Feb 2022 10:37:17 +0800 Subject: [PATCH 142/328] =?UTF-8?q?0404=20=E5=B7=A6=E5=8F=B6=E5=AD=90?= =?UTF-8?q?=E4=B9=8B=E5=92=8C=20=20=E5=B7=A6=E5=8F=B6=E5=AD=90=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0404.左叶子之和.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/0404.左叶子之和.md b/problems/0404.左叶子之和.md index 09272052..691c0f37 100644 --- a/problems/0404.左叶子之和.md +++ b/problems/0404.左叶子之和.md @@ -19,7 +19,7 @@ **首先要注意是判断左叶子,不是二叉树左侧节点,所以不要上来想着层序遍历。** -因为题目中其实没有说清楚左叶子究竟是什么节点,那么我来给出左叶子的明确定义:**如果左节点不为空,且左节点没有左右孩子,那么这个节点就是左叶子** +因为题目中其实没有说清楚左叶子究竟是什么节点,那么我来给出左叶子的明确定义:**如果左节点不为空,且左节点没有左右孩子,那么这个节点的左节点就是左叶子** 大家思考一下如下图中二叉树,左叶子之和究竟是多少? From 984a3ae5bc7d08bb70b05601d96d57b1b0c9c791 Mon Sep 17 00:00:00 2001 From: cylin2000 Date: Fri, 25 Feb 2022 10:56:23 +0000 Subject: [PATCH 143/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E4=BA=8C=E5=88=86?= =?UTF-8?q?=E6=9F=A5=E6=89=BE=20C#=20=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0704.二分查找.md | 46 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/problems/0704.二分查找.md b/problems/0704.二分查找.md index 379cb5fc..635868a9 100644 --- a/problems/0704.二分查找.md +++ b/problems/0704.二分查找.md @@ -561,5 +561,51 @@ class Solution { } ``` +**C#** +```csharp +//左闭右闭 +public class Solution { + public int Search(int[] nums, int target) { + int left = 0; + int right = nums.Length - 1; + while(left <= right){ + int mid = (right - left ) / 2 + left; + if(nums[mid] == target){ + return mid; + } + else if(nums[mid] < target){ + left = mid+1; + } + else if(nums[mid] > target){ + right = mid-1; + } + } + return -1; + } +} + +//左闭右开 +public class Solution{ + public int Search(int[] nums, int target){ + int left = 0; + int right = nums.Length; + while(left < right){ + int mid = (right - left) / 2 + left; + if(nums[mid] == target){ + return mid; + } + else if(nums[mid] < target){ + left = mid + 1; + } + else if(nums[mid] > target){ + right = mid; + } + } + return -1; + } +} +``` + + -----------------------
From 3f189d4687818313a90bc240524a3dc049f39ec4 Mon Sep 17 00:00:00 2001 From: cylin2000 Date: Fri, 25 Feb 2022 10:57:05 +0000 Subject: [PATCH 144/328] Add : --- problems/0704.二分查找.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/0704.二分查找.md b/problems/0704.二分查找.md index 635868a9..15e096a0 100644 --- a/problems/0704.二分查找.md +++ b/problems/0704.二分查找.md @@ -561,7 +561,7 @@ class Solution { } ``` -**C#** +**C#:** ```csharp //左闭右闭 public class Solution { From 4980496c05aad48ea28cc0ed471cc08ffe36b9d6 Mon Sep 17 00:00:00 2001 From: Camille0512 Date: Fri, 25 Feb 2022 18:59:56 +0800 Subject: [PATCH 145/328] 0001. Add python v2. Making use of the dictionary property. --- problems/0001.两数之和.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/problems/0001.两数之和.md b/problems/0001.两数之和.md index 22b2e7eb..9571a773 100644 --- a/problems/0001.两数之和.md +++ b/problems/0001.两数之和.md @@ -118,6 +118,18 @@ class Solution: return [records[target - val], idx] # 如果存在就返回字典记录索引和当前索引 ``` +Python (v2): + +```python +class Solution: + def twoSum(self, nums: List[int], target: int) -> List[int]: + rec = {} + for i in range(len(nums)): + rest = target - nums[i] + # Use get to get the index of the data, making use of one of the dictionary properties. + if rec.get(rest, None) is not None: return [rec[rest], i] + rec[nums[i]] = i +``` Go: From 0738423c9ed3979fa649ba7a147c4c60ecdec616 Mon Sep 17 00:00:00 2001 From: Camille0512 Date: Sun, 27 Feb 2022 00:24:13 +0800 Subject: [PATCH 146/328] modified 541. Can be more pythonic. --- problems/0541.反转字符串II.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/problems/0541.反转字符串II.md b/problems/0541.反转字符串II.md index 14b8601a..cd9bb0cc 100644 --- a/problems/0541.反转字符串II.md +++ b/problems/0541.反转字符串II.md @@ -204,8 +204,23 @@ class Solution: return ''.join(res) ``` +Python3 (v2): + +```python +class Solution: + def reverseStr(self, s: str, k: int) -> str: + # Two pointers. Another is inside the loop. + p = 0 + while p < len(s): + p2 = p + k + # Written in this could be more pythonic. + s = s[:p] + s[p: p2][::-1] + s[p2:] + p = p + 2 * k + return s +``` Go: + ```go func reverseStr(s string, k int) string { ss := []byte(s) From f862ebf0c70c37c62f83b5ad50b441c830f5850f Mon Sep 17 00:00:00 2001 From: Camille0512 Date: Sun, 27 Feb 2022 00:41:18 +0800 Subject: [PATCH 147/328] modified offer05. Add two python versions. --- problems/剑指Offer05.替换空格.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/problems/剑指Offer05.替换空格.md b/problems/剑指Offer05.替换空格.md index 530545fb..59f74a18 100644 --- a/problems/剑指Offer05.替换空格.md +++ b/problems/剑指Offer05.替换空格.md @@ -260,8 +260,24 @@ class Solution: ``` +```python +class Solution: + def replaceSpace(self, s: str) -> str: + # method 1 - Very rude + return "%20".join(s.split(" ")) + + # method 2 - Reverse the s when counting in for loop, then update from the end. + n = len(s) + for e, i in enumerate(s[::-1]): + print(i, e) + if i == " ": + s = s[: n - (e + 1)] + "%20" + s[n - e:] + print("") + return s +``` javaScript: + ```js /** * @param {string} s From 0fbacd5d9b4c72db15f5f1ddae2c73b320a8c554 Mon Sep 17 00:00:00 2001 From: Camille0512 Date: Sun, 27 Feb 2022 01:19:55 +0800 Subject: [PATCH 148/328] modified 151. Add 2 python versions. No need to implement Carlo's idea in such a complecated way by inviting extra space. --- problems/0151.翻转字符串里的单词.md | 32 +++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/problems/0151.翻转字符串里的单词.md b/problems/0151.翻转字符串里的单词.md index ead5fa12..7588cbd6 100644 --- a/problems/0151.翻转字符串里的单词.md +++ b/problems/0151.翻转字符串里的单词.md @@ -438,6 +438,38 @@ class Solution: ``` +```python +class Solution: + def reverseWords(self, s: str) -> str: + # method 1 - Rude but work & efficient method. + s_list = [i for i in s.split(" ") if len(i) > 0] + return " ".join(s_list[::-1]) + + # method 2 - Carlo's idea + def trim_head_tail_space(ss: str): + p = 0 + while p < len(ss) and ss[p] == " ": + p += 1 + return ss[p:] + + # Trim the head and tail space + s = trim_head_tail_space(s) + s = trim_head_tail_space(s[::-1])[::-1] + + pf, ps, s = 0, 0, s[::-1] # Reverse the string. + while pf < len(s): + if s[pf] == " ": + # Will not excede. Because we have clean the tail space. + if s[pf] == s[pf + 1]: + s = s[:pf] + s[pf + 1:] + continue + else: + s = s[:ps] + s[ps: pf][::-1] + s[pf:] + ps, pf = pf + 1, pf + 2 + else: + pf += 1 + return s[:ps] + s[ps:][::-1] # Must do the last step, because the last word is omit though the pointers are on the correct positions, +``` Go: From ef747f7921ccd6b64a6de661847eac88528bbb40 Mon Sep 17 00:00:00 2001 From: Qiyu Liang <61932152+Guicai996@users.noreply.github.com> Date: Sun, 27 Feb 2022 19:57:40 +0800 Subject: [PATCH 149/328] =?UTF-8?q?Update=200236.=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E6=9C=80=E8=BF=91=E5=85=AC=E5=85=B1=E7=A5=96?= =?UTF-8?q?=E5=85=88.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改了L48-54,增选解释了一种特殊情况:节点本身p(q),它拥有一个子孙节点q(p)。 --- problems/0236.二叉树的最近公共祖先.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/problems/0236.二叉树的最近公共祖先.md b/problems/0236.二叉树的最近公共祖先.md index 6213aeaa..5b2abd18 100644 --- a/problems/0236.二叉树的最近公共祖先.md +++ b/problems/0236.二叉树的最近公共祖先.md @@ -45,9 +45,13 @@ 接下来就看如何判断一个节点是节点q和节点p的公共公共祖先呢。 -**如果找到一个节点,发现左子树出现结点p,右子树出现节点q,或者 左子树出现结点q,右子树出现节点p,那么该节点就是节点p和q的最近公共祖先。** +**首先最容易想到的一个情况:如果找到一个节点,发现左子树出现结点p,右子树出现节点q,或者 左子树出现结点q,右子树出现节点p,那么该节点就是节点p和q的最近公共祖先。** -使用后序遍历,回溯的过程,就是从低向上遍历节点,一旦发现如何这个条件的节点,就是最近公共节点了。 +**但是很多人容易忽略一个情况,就是节点本身p(q),它拥有一个子孙节点q(p)。** + +使用后序遍历,回溯的过程,就是从低向上遍历节点,一旦发现满足第一种情况的节点,就是最近公共节点了。 + +**但是如果p或者q本身就是最近公共祖先呢?其实只需要找到一个节点是p或者q的时候,直接返回当前节点,无需继续递归子树。如果接下来的遍历中找到了后继节点满足第一种情况则修改返回值为后继节点,否则,继续返回已找到的节点即可。为什么满足第一种情况的节点一定是p或q的后继节点呢?大家可以仔细思考一下。** 递归三部曲: From 9712e3f75cbd0525eb40e0d12c264d1aa1952ea6 Mon Sep 17 00:00:00 2001 From: jinyuhang-007 <53509988+jinyuhang-007@users.noreply.github.com> Date: Sun, 27 Feb 2022 17:35:50 -0800 Subject: [PATCH 150/328] =?UTF-8?q?=E6=9B=B4=E6=96=B00005.=E6=9C=80?= =?UTF-8?q?=E9=95=BF=E5=9B=9E=E6=96=87=E5=AD=90=E4=B8=B2.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0005.最长回文子串.md | 37 +++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/problems/0005.最长回文子串.md b/problems/0005.最长回文子串.md index 99458825..8b3af3bb 100644 --- a/problems/0005.最长回文子串.md +++ b/problems/0005.最长回文子串.md @@ -260,7 +260,26 @@ public: # 其他语言版本 -## Java +Java: + +```java +public int[] twoSum(int[] nums, int target) { + int[] res = new int[2]; + if(nums == null || nums.length == 0){ + return res; + } + Map map = new HashMap<>(); + for(int i = 0; i < nums.length; i++){ + int temp = target - nums[i]; + if(map.containsKey(temp)){ + res[1] = i; + res[0] = map.get(temp); + } + map.put(nums[i], i); + } + return res; +} +``` ```java // 双指针 中心扩散法 @@ -291,7 +310,7 @@ class Solution { } ``` -## Python +Python: ```python class Solution: @@ -312,7 +331,8 @@ class Solution: return s[left:right + 1] ``` -> 双指针法: +双指针: + ```python class Solution: def longestPalindrome(self, s: str) -> str: @@ -340,13 +360,13 @@ class Solution: return s[start:end] ``` -## Go +Go: ```go ``` -## JavaScript +JavaScript: ```js //动态规划解法 @@ -462,8 +482,9 @@ var longestPalindrome = function(s) { }; ``` -## C -动态规划: +C: + +动态规划: ```c //初始化dp数组,全部初始为false bool **initDP(int strLen) { @@ -513,7 +534,7 @@ char * longestPalindrome(char * s){ } ``` -双指针: +双指针: ```c int left, maxLength; void extend(char *str, int i, int j, int size) { From ee0e80dae79071d1b48dfcc022e33f827de9c532 Mon Sep 17 00:00:00 2001 From: Luo <82520819+Jerry-306@users.noreply.github.com> Date: Mon, 28 Feb 2022 14:18:29 +0800 Subject: [PATCH 151/328] =?UTF-8?q?0700=20=E4=BA=8C=E5=8F=89=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=E6=A0=91=20=E9=83=A8=E5=88=86=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E6=9B=B4=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 结果没问题,但逻辑不严谨 --- problems/0700.二叉搜索树中的搜索.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/problems/0700.二叉搜索树中的搜索.md b/problems/0700.二叉搜索树中的搜索.md index 1521514a..fd1d21ac 100644 --- a/problems/0700.二叉搜索树中的搜索.md +++ b/problems/0700.二叉搜索树中的搜索.md @@ -200,7 +200,7 @@ class Solution { if (val < root.val) root = root.left; else if (val > root.val) root = root.right; else return root; - return root; + return null; } } ``` @@ -236,7 +236,7 @@ class Solution: if val < root.val: root = root.left elif val > root.val: root = root.right else: return root - return root + return None ``` @@ -271,7 +271,7 @@ func searchBST(root *TreeNode, val int) *TreeNode { break } } - return root + return nil } ``` @@ -301,7 +301,6 @@ var searchBST = function (root, val) { return searchBST(root.left, val); if (root.val < val) return searchBST(root.right, val); - return null; }; ``` @@ -330,7 +329,7 @@ var searchBST = function (root, val) { else return root; } - return root; + return null; }; ``` From 32dada4f6d071c10643dd69c356aeba74601cf21 Mon Sep 17 00:00:00 2001 From: Qiyu Liang <61932152+Guicai996@users.noreply.github.com> Date: Mon, 28 Feb 2022 15:01:23 +0800 Subject: [PATCH 152/328] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200063.=E4=B8=8D?= =?UTF-8?q?=E5=90=8C=E8=B7=AF=E5=BE=84II=E5=A2=9E=E5=8A=A0=E7=A9=BA?= =?UTF-8?q?=E9=97=B4=E4=BC=98=E5=8C=96=E7=89=88=E6=9C=ACc++=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 0063.不同路径II,L159-190 增加空间优化版本c++代码 --- problems/0063.不同路径II.md | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/problems/0063.不同路径II.md b/problems/0063.不同路径II.md index 8e82007e..86c42150 100644 --- a/problems/0063.不同路径II.md +++ b/problems/0063.不同路径II.md @@ -155,6 +155,39 @@ public: * 时间复杂度:$O(n × m)$,n、m 分别为obstacleGrid 长度和宽度 * 空间复杂度:$O(n × m)$ + +同样我们给出空间优化版本: +```CPP +class Solution { +public: + int uniquePathsWithObstacles(vector>& obstacleGrid) { + if (obstacleGrid[0][0] == 1) + return 0; + vector dp(obstacleGrid[0].size()); + for (int j = 0; j < dp.size(); ++j) + if (obstacleGrid[0][j] == 1) + dp[j] = 0; + else if (j == 0) + dp[j] = 1; + else + dp[j] = dp[j-1]; + + for (int i = 1; i < obstacleGrid.size(); ++i) + for (int j = 0; j < dp.size(); ++j){ + if (obstacleGrid[i][j] == 1) + dp[j] = 0; + else if (j != 0) + dp[j] = dp[j] + dp[j-1]; + } + return dp.back(); + } +}; +``` + +* 时间复杂度:$O(n × m)$,n、m 分别为obstacleGrid 长度和宽度 +* 空间复杂度:$O(m)$ + + ## 总结 本题是[62.不同路径](https://programmercarl.com/0062.不同路径.html)的障碍版,整体思路大体一致。 From 37e7d73ec200bd9adefbdaaef24d6f4c2e38f5f7 Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Mon, 28 Feb 2022 20:52:01 +0800 Subject: [PATCH 153/328] Update --- problems/0020.有效的括号.md | 4 ++-- problems/0027.移除元素.md | 2 +- problems/0035.搜索插入位置.md | 2 +- problems/0039.组合总和.md | 4 ++-- problems/0040.组合总和II.md | 4 ++-- problems/0042.接雨水.md | 2 +- problems/0046.全排列.md | 2 +- problems/0059.螺旋矩阵II.md | 4 ++-- problems/0070.爬楼梯完全背包版本.md | 4 ++-- problems/0077.组合优化.md | 2 +- problems/0078.子集.md | 2 +- problems/0084.柱状图中最大的矩形.md | 4 ++-- problems/0093.复原IP地址.md | 2 +- problems/0102.二叉树的层序遍历.md | 4 ++-- problems/0108.将有序数组转换为二叉搜索树.md | 2 +- problems/0110.平衡二叉树.md | 2 +- problems/0129.求根到叶子节点数字之和.md | 2 +- problems/0131.分割回文串.md | 4 ++-- problems/0188.买卖股票的最佳时机IV.md | 2 +- problems/0257.二叉树的所有路径.md | 2 +- problems/0279.完全平方数.md | 2 +- problems/0322.零钱兑换.md | 2 +- problems/0337.打家劫舍III.md | 6 +++--- problems/0376.摆动序列.md | 2 +- problems/0383.赎金信.md | 2 +- problems/0404.左叶子之和.md | 4 ++-- problems/0455.分发饼干.md | 2 +- problems/0463.岛屿的周长.md | 2 +- problems/0474.一和零.md | 2 +- problems/0491.递增子序列.md | 4 ++-- problems/0494.目标和.md | 11 ++++++++--- problems/0496.下一个更大元素I.md | 4 ++-- problems/0501.二叉搜索树中的众数.md | 4 ++-- problems/0503.下一个更大元素II.md | 2 +- problems/0518.零钱兑换II.md | 2 +- problems/0538.把二叉搜索树转换为累加树.md | 2 +- problems/0669.修剪二叉搜索树.md | 2 +- problems/0841.钥匙和房间.md | 1 - problems/1047.删除字符串中的所有相邻重复项.md | 4 ++-- problems/二叉树的递归遍历.md | 2 +- problems/周总结/20201003二叉树周末总结.md | 4 ++-- problems/背包问题理论基础完全背包.md | 2 +- 42 files changed, 64 insertions(+), 60 deletions(-) diff --git a/problems/0020.有效的括号.md b/problems/0020.有效的括号.md index 95d62e42..01fc7b93 100644 --- a/problems/0020.有效的括号.md +++ b/problems/0020.有效的括号.md @@ -159,7 +159,7 @@ class Solution { ``` Python: -```python3 +```python # 方法一,仅使用栈,更省空间 class Solution: def isValid(self, s: str) -> bool: @@ -180,7 +180,7 @@ class Solution: return True if not stack else False ``` -```python3 +```python # 方法二,使用字典 class Solution: def isValid(self, s: str) -> bool: diff --git a/problems/0027.移除元素.md b/problems/0027.移除元素.md index d69f2bcf..dd9155c6 100644 --- a/problems/0027.移除元素.md +++ b/problems/0027.移除元素.md @@ -142,7 +142,7 @@ class Solution { Python: -```python3 +```python class Solution: """双指针法 时间复杂度:O(n) diff --git a/problems/0035.搜索插入位置.md b/problems/0035.搜索插入位置.md index f5f041aa..9a770703 100644 --- a/problems/0035.搜索插入位置.md +++ b/problems/0035.搜索插入位置.md @@ -246,7 +246,7 @@ func searchInsert(nums []int, target int) int { ``` ### Python -```python3 +```python class Solution: def searchInsert(self, nums: List[int], target: int) -> int: left, right = 0, len(nums) - 1 diff --git a/problems/0039.组合总和.md b/problems/0039.组合总和.md index 0f8fe4f6..7a2084dd 100644 --- a/problems/0039.组合总和.md +++ b/problems/0039.组合总和.md @@ -264,7 +264,7 @@ class Solution { ## Python **回溯** -```python3 +```python class Solution: def __init__(self): self.path = [] @@ -296,7 +296,7 @@ class Solution: self.path.pop() # 回溯 ``` **剪枝回溯** -```python3 +```python class Solution: def __init__(self): self.path = [] diff --git a/problems/0040.组合总和II.md b/problems/0040.组合总和II.md index 54384188..49acb8d6 100644 --- a/problems/0040.组合总和II.md +++ b/problems/0040.组合总和II.md @@ -334,7 +334,7 @@ class Solution { ## Python **回溯+巧妙去重(省去使用used** -```python3 +```python class Solution: def __init__(self): self.paths = [] @@ -374,7 +374,7 @@ class Solution: sum_ -= candidates[i] # 回溯,为了下一轮for loop ``` **回溯+去重(使用used)** -```python3 +```python class Solution: def __init__(self): self.paths = [] diff --git a/problems/0042.接雨水.md b/problems/0042.接雨水.md index 27745607..55f80a54 100644 --- a/problems/0042.接雨水.md +++ b/problems/0042.接雨水.md @@ -491,7 +491,7 @@ class Solution: return res ``` 动态规划 -```python3 +```python class Solution: def trap(self, height: List[int]) -> int: leftheight, rightheight = [0]*len(height), [0]*len(height) diff --git a/problems/0046.全排列.md b/problems/0046.全排列.md index 3d31db62..c5369ddd 100644 --- a/problems/0046.全排列.md +++ b/problems/0046.全排列.md @@ -243,7 +243,7 @@ class Solution: usage_list[i] = False ``` **回溯+丢掉usage_list** -```python3 +```python class Solution: def __init__(self): self.path = [] diff --git a/problems/0059.螺旋矩阵II.md b/problems/0059.螺旋矩阵II.md index 3f7a59ca..670d6fc2 100644 --- a/problems/0059.螺旋矩阵II.md +++ b/problems/0059.螺旋矩阵II.md @@ -188,9 +188,9 @@ class Solution { } ``` -python: +python3: -```python3 +```python class Solution: def generateMatrix(self, n: int) -> List[List[int]]: diff --git a/problems/0070.爬楼梯完全背包版本.md b/problems/0070.爬楼梯完全背包版本.md index b5fbb96a..2286de2d 100644 --- a/problems/0070.爬楼梯完全背包版本.md +++ b/problems/0070.爬楼梯完全背包版本.md @@ -143,10 +143,10 @@ class Solution { } ``` -Python: +Python3: -```python3 +```python class Solution: def climbStairs(self, n: int) -> int: dp = [0]*(n + 1) diff --git a/problems/0077.组合优化.md b/problems/0077.组合优化.md index e995fd18..81b4304c 100644 --- a/problems/0077.组合优化.md +++ b/problems/0077.组合优化.md @@ -174,7 +174,7 @@ class Solution { ``` Python: -```python3 +```python class Solution: def combine(self, n: int, k: int) -> List[List[int]]: res=[] #存放符合条件结果的集合 diff --git a/problems/0078.子集.md b/problems/0078.子集.md index 1abf8c95..cdb5f548 100644 --- a/problems/0078.子集.md +++ b/problems/0078.子集.md @@ -203,7 +203,7 @@ class Solution { ``` ## Python -```python3 +```python class Solution: def __init__(self): self.path: List[int] = [] diff --git a/problems/0084.柱状图中最大的矩形.md b/problems/0084.柱状图中最大的矩形.md index 3cb51f1d..439a3bc5 100644 --- a/problems/0084.柱状图中最大的矩形.md +++ b/problems/0084.柱状图中最大的矩形.md @@ -277,9 +277,9 @@ class Solution { } ``` -Python: +Python3: -```python3 +```python # 双指针;暴力解法(leetcode超时) class Solution: diff --git a/problems/0093.复原IP地址.md b/problems/0093.复原IP地址.md index 3e7cd1ad..1fa72cc9 100644 --- a/problems/0093.复原IP地址.md +++ b/problems/0093.复原IP地址.md @@ -339,7 +339,7 @@ class Solution(object): ``` python3: -```python3 +```python class Solution: def __init__(self): self.result = [] diff --git a/problems/0102.二叉树的层序遍历.md b/problems/0102.二叉树的层序遍历.md index 1a92d42f..74485848 100644 --- a/problems/0102.二叉树的层序遍历.md +++ b/problems/0102.二叉树的层序遍历.md @@ -83,10 +83,10 @@ public: }; ``` -python代码: +python3代码: -```python3 +```python class Solution: """二叉树层序遍历迭代解法""" diff --git a/problems/0108.将有序数组转换为二叉搜索树.md b/problems/0108.将有序数组转换为二叉搜索树.md index bd48ea0c..9e008e86 100644 --- a/problems/0108.将有序数组转换为二叉搜索树.md +++ b/problems/0108.将有序数组转换为二叉搜索树.md @@ -305,7 +305,7 @@ class Solution { ## Python **递归** -```python3 +```python # Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): diff --git a/problems/0110.平衡二叉树.md b/problems/0110.平衡二叉树.md index 90cb7336..d9dcf289 100644 --- a/problems/0110.平衡二叉树.md +++ b/problems/0110.平衡二叉树.md @@ -497,7 +497,7 @@ class Solution { ## Python 递归法: -```python3 +```python # Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): diff --git a/problems/0129.求根到叶子节点数字之和.md b/problems/0129.求根到叶子节点数字之和.md index 980779c2..b271ca7d 100644 --- a/problems/0129.求根到叶子节点数字之和.md +++ b/problems/0129.求根到叶子节点数字之和.md @@ -217,7 +217,7 @@ class Solution { ``` Python: -```python3 +```python class Solution: def sumNumbers(self, root: TreeNode) -> int: res = 0 diff --git a/problems/0131.分割回文串.md b/problems/0131.分割回文串.md index 439ad8ea..f50f1c1d 100644 --- a/problems/0131.分割回文串.md +++ b/problems/0131.分割回文串.md @@ -289,7 +289,7 @@ class Solution { ## Python **回溯+正反序判断回文串** -```python3 +```python class Solution: def __init__(self): self.paths = [] @@ -326,7 +326,7 @@ class Solution: continue ``` **回溯+函数判断回文串** -```python3 +```python class Solution: def __init__(self): self.paths = [] diff --git a/problems/0188.买卖股票的最佳时机IV.md b/problems/0188.买卖股票的最佳时机IV.md index 7db75f06..61c558a1 100644 --- a/problems/0188.买卖股票的最佳时机IV.md +++ b/problems/0188.买卖股票的最佳时机IV.md @@ -271,7 +271,7 @@ class Solution: return dp[-1][2*k] ``` 版本二 -```python3 +```python class Solution: def maxProfit(self, k: int, prices: List[int]) -> int: if len(prices) == 0: return 0 diff --git a/problems/0257.二叉树的所有路径.md b/problems/0257.二叉树的所有路径.md index 4078320f..a0c718f4 100644 --- a/problems/0257.二叉树的所有路径.md +++ b/problems/0257.二叉树的所有路径.md @@ -436,7 +436,7 @@ class Solution: 迭代法: -```python3 +```python from collections import deque diff --git a/problems/0279.完全平方数.md b/problems/0279.完全平方数.md index 7bc0c2f7..9bad2085 100644 --- a/problems/0279.完全平方数.md +++ b/problems/0279.完全平方数.md @@ -207,7 +207,7 @@ class Solution { Python: -```python3 +```python class Solution: def numSquares(self, n: int) -> int: '''版本一,先遍历背包, 再遍历物品''' diff --git a/problems/0322.零钱兑换.md b/problems/0322.零钱兑换.md index 8f3438af..3a8d0662 100644 --- a/problems/0322.零钱兑换.md +++ b/problems/0322.零钱兑换.md @@ -207,7 +207,7 @@ class Solution { Python: -```python3 +```python class Solution: def coinChange(self, coins: List[int], amount: int) -> int: '''版本一''' diff --git a/problems/0337.打家劫舍III.md b/problems/0337.打家劫舍III.md index 06831cb6..ecd31d1b 100644 --- a/problems/0337.打家劫舍III.md +++ b/problems/0337.打家劫舍III.md @@ -288,7 +288,7 @@ Python: > 暴力递归 -```python3 +```python # Definition for a binary tree node. # class TreeNode: @@ -315,7 +315,7 @@ class Solution: > 记忆化递归 -```python3 +```python # Definition for a binary tree node. # class TreeNode: @@ -345,7 +345,7 @@ class Solution: ``` > 动态规划 -```python3 +```python # Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): diff --git a/problems/0376.摆动序列.md b/problems/0376.摆动序列.md index d75311eb..5076c9ad 100644 --- a/problems/0376.摆动序列.md +++ b/problems/0376.摆动序列.md @@ -228,7 +228,7 @@ class Solution { ### Python -```python3 +```python class Solution: def wiggleMaxLength(self, nums: List[int]) -> int: preC,curC,res = 0,0,1 #题目里nums长度大于等于1,当长度为1时,其实到不了for循环里去,所以不用考虑nums长度 diff --git a/problems/0383.赎金信.md b/problems/0383.赎金信.md index 31e19b10..00707347 100644 --- a/problems/0383.赎金信.md +++ b/problems/0383.赎金信.md @@ -209,7 +209,7 @@ class Solution(object): Python写法四: -```python3 +```python class Solution: def canConstruct(self, ransomNote: str, magazine: str) -> bool: c1 = collections.Counter(ransomNote) diff --git a/problems/0404.左叶子之和.md b/problems/0404.左叶子之和.md index 09272052..8c6eaddb 100644 --- a/problems/0404.左叶子之和.md +++ b/problems/0404.左叶子之和.md @@ -229,7 +229,7 @@ class Solution { ## Python **递归后序遍历** -```python3 +```python class Solution: def sumOfLeftLeaves(self, root: TreeNode) -> int: if not root: @@ -246,7 +246,7 @@ class Solution: ``` **迭代** -```python3 +```python class Solution: def sumOfLeftLeaves(self, root: TreeNode) -> int: """ diff --git a/problems/0455.分发饼干.md b/problems/0455.分发饼干.md index 1711f638..210b492d 100644 --- a/problems/0455.分发饼干.md +++ b/problems/0455.分发饼干.md @@ -146,7 +146,7 @@ class Solution { ``` ### Python -```python3 +```python class Solution: # 思路1:优先考虑胃饼干 def findContentChildren(self, g: List[int], s: List[int]) -> int: diff --git a/problems/0463.岛屿的周长.md b/problems/0463.岛屿的周长.md index e19e06ee..9911dfe5 100644 --- a/problems/0463.岛屿的周长.md +++ b/problems/0463.岛屿的周长.md @@ -124,7 +124,7 @@ Python: ### 解法1: 扫描每个cell,如果当前位置为岛屿 grid[i][j] == 1, 从当前位置判断四边方向,如果边界或者是水域,证明有边界存在,res矩阵的对应cell加一。 -```python3 +```python class Solution: def islandPerimeter(self, grid: List[List[int]]) -> int: diff --git a/problems/0474.一和零.md b/problems/0474.一和零.md index 67e366f4..964df4a8 100644 --- a/problems/0474.一和零.md +++ b/problems/0474.一和零.md @@ -193,7 +193,7 @@ class Solution { ``` Python: -```python3 +```python class Solution: def findMaxForm(self, strs: List[str], m: int, n: int) -> int: dp = [[0] * (n + 1) for _ in range(m + 1)] # 默认初始化0 diff --git a/problems/0491.递增子序列.md b/problems/0491.递增子序列.md index 6d88119e..70b08d50 100644 --- a/problems/0491.递增子序列.md +++ b/problems/0491.递增子序列.md @@ -233,7 +233,7 @@ class Solution { python3 **回溯** -```python3 +```python class Solution: def __init__(self): self.paths = [] @@ -270,7 +270,7 @@ class Solution: self.path.pop() ``` **回溯+哈希表去重** -```python3 +```python class Solution: def __init__(self): self.paths = [] diff --git a/problems/0494.目标和.md b/problems/0494.目标和.md index f190b734..47d0784e 100644 --- a/problems/0494.目标和.md +++ b/problems/0494.目标和.md @@ -160,11 +160,16 @@ dp[j] 表示:填满j(包括j)这么大容积的包,有dp[j]种方法 那么只要搞到nums[i]的话,凑成dp[j]就有dp[j - nums[i]] 种方法。 -举一个例子,nums[i] = 2: dp[3],填满背包容量为3的话,有dp[3]种方法。 -那么只需要搞到一个2(nums[i]),有dp[3]方法可以凑齐容量为3的背包,相应的就有多少种方法可以凑齐容量为5的背包。 +例如:dp[j],j 为5, -那么需要把 这些方法累加起来就可以了,dp[j] += dp[j - nums[i]] +* 已经有一个1(nums[i]) 的话,有 dp[4]种方法 凑成 dp[5]。 +* 已经有一个2(nums[i]) 的话,有 dp[3]种方法 凑成 dp[5]。 +* 已经有一个3(nums[i]) 的话,有 dp[2]中方法 凑成 dp[5] +* 已经有一个4(nums[i]) 的话,有 dp[1]中方法 凑成 dp[5] +* 已经有一个5 (nums[i])的话,有 dp[0]中方法 凑成 dp[5] + +那么凑整dp[5]有多少方法呢,也就是把 所有的 dp[j - nums[i]] 累加起来。 所以求组合类问题的公式,都是类似这种: diff --git a/problems/0496.下一个更大元素I.md b/problems/0496.下一个更大元素I.md index f039c198..f9dfa308 100644 --- a/problems/0496.下一个更大元素I.md +++ b/problems/0496.下一个更大元素I.md @@ -222,8 +222,8 @@ class Solution { } } ``` -Python: -```python3 +Python3: +```python class Solution: def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]: result = [-1]*len(nums1) diff --git a/problems/0501.二叉搜索树中的众数.md b/problems/0501.二叉搜索树中的众数.md index 277f46f5..a2984ecc 100644 --- a/problems/0501.二叉搜索树中的众数.md +++ b/problems/0501.二叉搜索树中的众数.md @@ -470,7 +470,7 @@ class Solution { > 递归法 -```python3 +```python # Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): @@ -515,7 +515,7 @@ class Solution: > 迭代法-中序遍历-不使用额外空间,利用二叉搜索树特性 -```python3 +```python class Solution: def findMode(self, root: TreeNode) -> List[int]: stack = [] diff --git a/problems/0503.下一个更大元素II.md b/problems/0503.下一个更大元素II.md index c9532a22..36e183e1 100644 --- a/problems/0503.下一个更大元素II.md +++ b/problems/0503.下一个更大元素II.md @@ -124,7 +124,7 @@ class Solution { ``` Python: -```python3 +```python class Solution: def nextGreaterElements(self, nums: List[int]) -> List[int]: dp = [-1] * len(nums) diff --git a/problems/0518.零钱兑换II.md b/problems/0518.零钱兑换II.md index be60ac13..e72c5f85 100644 --- a/problems/0518.零钱兑换II.md +++ b/problems/0518.零钱兑换II.md @@ -207,7 +207,7 @@ class Solution { Python: -```python3 +```python class Solution: def change(self, amount: int, coins: List[int]) -> int: dp = [0]*(amount + 1) diff --git a/problems/0538.把二叉搜索树转换为累加树.md b/problems/0538.把二叉搜索树转换为累加树.md index 1d11d4ee..1b07b803 100644 --- a/problems/0538.把二叉搜索树转换为累加树.md +++ b/problems/0538.把二叉搜索树转换为累加树.md @@ -196,7 +196,7 @@ class Solution { ## Python **递归** -```python3 +```python # Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): diff --git a/problems/0669.修剪二叉搜索树.md b/problems/0669.修剪二叉搜索树.md index d17c0b1c..15f6a040 100644 --- a/problems/0669.修剪二叉搜索树.md +++ b/problems/0669.修剪二叉搜索树.md @@ -264,7 +264,7 @@ class Solution { ## Python **递归** -```python3 +```python # Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): diff --git a/problems/0841.钥匙和房间.md b/problems/0841.钥匙和房间.md index 8397690e..1cd13065 100644 --- a/problems/0841.钥匙和房间.md +++ b/problems/0841.钥匙和房间.md @@ -152,7 +152,6 @@ class Solution { -Python: python3 diff --git a/problems/1047.删除字符串中的所有相邻重复项.md b/problems/1047.删除字符串中的所有相邻重复项.md index 9a0bb1c1..b94e557d 100644 --- a/problems/1047.删除字符串中的所有相邻重复项.md +++ b/problems/1047.删除字符串中的所有相邻重复项.md @@ -194,7 +194,7 @@ class Solution { ``` Python: -```python3 +```python # 方法一,使用栈,推荐! class Solution: def removeDuplicates(self, s: str) -> str: @@ -207,7 +207,7 @@ class Solution: return "".join(res) # 字符串拼接 ``` -```python3 +```python # 方法二,使用双指针模拟栈,如果不让用栈可以作为备选方法。 class Solution: def removeDuplicates(self, s: str) -> str: diff --git a/problems/二叉树的递归遍历.md b/problems/二叉树的递归遍历.md index c481fd11..2fef68da 100644 --- a/problems/二叉树的递归遍历.md +++ b/problems/二叉树的递归遍历.md @@ -168,7 +168,7 @@ class Solution { ``` Python: -```python3 +```python # 前序遍历-递归-LC144_二叉树的前序遍历 class Solution: def preorderTraversal(self, root: TreeNode) -> List[int]: diff --git a/problems/周总结/20201003二叉树周末总结.md b/problems/周总结/20201003二叉树周末总结.md index a0b8c2dd..18bbf37f 100644 --- a/problems/周总结/20201003二叉树周末总结.md +++ b/problems/周总结/20201003二叉树周末总结.md @@ -34,8 +34,8 @@ public: // 此时就是:左右节点都不为空,且数值相同的情况 // 此时才做递归,做下一层的判断 - bool outside = compare(left->left, right->right); // 左子树:左、 右子树:左 (相对于求对称二叉树,只需改一下这里的顺序) - bool inside = compare(left->right, right->left); // 左子树:右、 右子树:右 + bool outside = compare(left->left, right->left); // 左子树:左、 右子树:左 (相对于求对称二叉树,只需改一下这里的顺序) + bool inside = compare(left->right, right->right); // 左子树:右、 右子树:右 bool isSame = outside && inside; // 左子树:中、 右子树:中 (逻辑处理) return isSame; diff --git a/problems/背包问题理论基础完全背包.md b/problems/背包问题理论基础完全背包.md index cea69c72..7abaf160 100644 --- a/problems/背包问题理论基础完全背包.md +++ b/problems/背包问题理论基础完全背包.md @@ -216,7 +216,7 @@ private static void testCompletePackAnotherWay(){ Python: -```python3 +```python # 先遍历物品,再遍历背包 def test_complete_pack1(): weight = [1, 3, 4] From 4b1542f8643f63ca9a09103642c680e05996e1a8 Mon Sep 17 00:00:00 2001 From: Jack Date: Mon, 28 Feb 2022 21:02:53 +0800 Subject: [PATCH 154/328] =?UTF-8?q?1002=E6=9F=A5=E6=89=BE=E5=B8=B8?= =?UTF-8?q?=E7=94=A8=E5=AD=97=E7=AC=A6=E6=B7=BB=E5=8A=A0typescript?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/1002.查找常用字符.md | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/problems/1002.查找常用字符.md b/problems/1002.查找常用字符.md index 7c5566d3..e3d4d774 100644 --- a/problems/1002.查找常用字符.md +++ b/problems/1002.查找常用字符.md @@ -253,6 +253,41 @@ var commonChars = function (words) { return res }; ``` +TypeScript +```ts + console.time("test") + let str: string = "" + //设置一个用字母组成的map字典 + let map = new Map() + //给所有map设置初始值为0 + let wordInitial: [string, number][] = words[0] + .split("") + .map((item) => [item, 0]) + //如果有重复字母,就把重复字母的数量加1 + for (let word of words[0]) { + map.set(word, map.has(word) ? map.get(word) + 1 : 1) + } + for (let i = 1; i < words.length; i++) { + const mapWord = new Map(wordInitial) + for (let j = 0; j < words[i].length; j++) { + if (!map.has(words[i][j])) continue + //mapWord中的字母的个数不能高于当前map的个数,多于则不能添加 + if (map.get(words[i][j]) > mapWord.get(words[i][j])) { + mapWord.set( + words[i][j], + mapWord.has(words[i][j]) ? mapWord!.get(words[i][j]) + 1 : 1 + ) + } + } + //每次重新初始化map + map = mapWord + } + for (let [key, value] of map) { + str += key.repeat(value) + } + console.timeEnd("test") + return str.split("") +``` GO ```golang func commonChars(words []string) []string { From fc5b272bd604dfe409a5c699d8253fde515b83ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E4=BC=97=E8=B1=AA?= Date: Tue, 1 Mar 2022 08:56:51 +0800 Subject: [PATCH 155/328] =?UTF-8?q?fix:=200053.=E5=8A=A8=E6=80=81=E8=A7=84?= =?UTF-8?q?=E5=88=92=20js=E4=BB=A3=E7=A0=81=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0053.最大子序和(动态规划).md | 1 + 1 file changed, 1 insertion(+) diff --git a/problems/0053.最大子序和(动态规划).md b/problems/0053.最大子序和(动态规划).md index 37de9bbe..703e1dd6 100644 --- a/problems/0053.最大子序和(动态规划).md +++ b/problems/0053.最大子序和(动态规划).md @@ -174,6 +174,7 @@ const maxSubArray = nums => { // 数组长度,dp初始化 const len = nums.length; let dp = new Array(len).fill(0); + dp[0] = nums[0]; // 最大值初始化为dp[0] let max = dp[0]; for (let i = 1; i < len; i++) { From 66c3aab86a1c979ca14244c65ee2564be6e288d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8F=82=E7=8F=82?= Date: Tue, 1 Mar 2022 11:27:42 +0800 Subject: [PATCH 156/328] =?UTF-8?q?=E5=AF=B9=E4=BA=8E09=E8=BF=99=E6=A0=B7?= =?UTF-8?q?=E7=9A=84=E5=88=A4=E6=96=AD=E5=8F=AF=E4=BB=A5=E4=B8=8D=E5=81=9A?= =?UTF-8?q?=EF=BC=8C=E7=9B=B4=E6=8E=A5=E7=94=A8String.valueOf=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E5=B0=B1=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0738.单调递增的数字.md | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/problems/0738.单调递增的数字.md b/problems/0738.单调递增的数字.md index e670bb31..c8ce8a2b 100644 --- a/problems/0738.单调递增的数字.md +++ b/problems/0738.单调递增的数字.md @@ -148,23 +148,19 @@ java版本1中创建了String数组,多次使用Integer.parseInt了方法, 版本2 class Solution { public int monotoneIncreasingDigits(int n) { - if (n==0)return 0; - char[] chars= Integer.toString(n).toCharArray(); - int start=Integer.MAX_VALUE;//start初始值设为最大值,这是为了防止当数字本身是单调递增时,没有一位数字需要改成9的情况 - for (int i=chars.length-1;i>0;i--){ - if (chars[i]= 0; i--) { + if (chars[i] > chars[i + 1]) { + chars[i]--; + start = i+1; } } - StringBuilder res=new StringBuilder(); - for (int i=0;i=start){ - res.append('9'); - }else res.append(chars[i]); + for (int i = start; i < s.length(); i++) { + chars[i] = '9'; } - return Integer.parseInt(res.toString()); + return Integer.parseInt(String.valueOf(chars)); } } ``` From 1ed3e9e8f4dff921e983e636f85f963a38839e05 Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Tue, 1 Mar 2022 17:12:19 +0800 Subject: [PATCH 157/328] Update --- problems/二叉树总结篇.md | 2 +- problems/动态规划总结篇.md | 2 +- problems/回溯总结.md | 2 +- problems/贪心算法总结篇.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/problems/二叉树总结篇.md b/problems/二叉树总结篇.md index d1332e09..73faffa6 100644 --- a/problems/二叉树总结篇.md +++ b/problems/二叉树总结篇.md @@ -152,7 +152,7 @@ ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211030125421.png) -这个图是 [代码随想录知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) 成员:[青](https://wx.zsxq.com/dweb2/index/footprint/185251215558842),所画,总结的非常好,分享给大家。 +这个图是 [代码随想录知识星球](https://programmercarl.com/other/kstar.html) 成员:[青](https://wx.zsxq.com/dweb2/index/footprint/185251215558842),所画,总结的非常好,分享给大家。 **最后,二叉树系列就这么完美结束了,估计这应该是最长的系列了,感谢大家33天的坚持与陪伴,接下来我们又要开始新的系列了「回溯算法」!** diff --git a/problems/动态规划总结篇.md b/problems/动态规划总结篇.md index 699d4435..cc973b23 100644 --- a/problems/动态规划总结篇.md +++ b/problems/动态规划总结篇.md @@ -118,7 +118,7 @@ ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211121223754.png) -这个图是 [代码随想录知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) 成员:[青](https://wx.zsxq.com/dweb2/index/footprint/185251215558842),所画,总结的非常好,分享给大家。 +这个图是 [代码随想录知识星球](https://programmercarl.com/other/kstar.html) 成员:[青](https://wx.zsxq.com/dweb2/index/footprint/185251215558842),所画,总结的非常好,分享给大家。 这已经是全网对动规最深刻的讲解系列了。 diff --git a/problems/回溯总结.md b/problems/回溯总结.md index af171243..671e0a4e 100644 --- a/problems/回溯总结.md +++ b/problems/回溯总结.md @@ -432,7 +432,7 @@ N皇后问题分析: ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211030124742.png) -这个图是 [代码随想录知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) 成员:[莫非毛](https://wx.zsxq.com/dweb2/index/footprint/828844212542),所画,总结的非常好,分享给大家。 +这个图是 [代码随想录知识星球](https://programmercarl.com/other/kstar.html) 成员:[莫非毛](https://wx.zsxq.com/dweb2/index/footprint/828844212542),所画,总结的非常好,分享给大家。 **回溯算法系列正式结束,新的系列终将开始,录友们准备开启新的征程!** diff --git a/problems/贪心算法总结篇.md b/problems/贪心算法总结篇.md index 6da43ea3..1db9b4dc 100644 --- a/problems/贪心算法总结篇.md +++ b/problems/贪心算法总结篇.md @@ -129,7 +129,7 @@ Carl个人认为:如果找出局部最优并可以推出全局最优,就是 ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211110121605.png) -这个图是 [代码随想录知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) 成员:[青](https://wx.zsxq.com/dweb2/index/footprint/185251215558842)所画,总结的非常好,分享给大家。 +这个图是 [代码随想录知识星球](https://programmercarl.com/other/kstar.html) 成员:[青](https://wx.zsxq.com/dweb2/index/footprint/185251215558842)所画,总结的非常好,分享给大家。 很多没有接触过贪心的同学都会感觉贪心有啥可学的,但只要跟着「代码随想录」坚持下来之后,就会发现,贪心是一种很重要的算法思维而且并不简单,贪心往往妙的出其不意,触不及防! From e67bf9d4330aa3c7cf08f899aef2b11b3bba8cb8 Mon Sep 17 00:00:00 2001 From: Dawn-private <404232992@qq.com> Date: Tue, 1 Mar 2022 19:51:18 +0800 Subject: [PATCH 158/328] =?UTF-8?q?Update=200300.=E6=9C=80=E9=95=BF?= =?UTF-8?q?=E4=B8=8A=E5=8D=87=E5=AD=90=E5=BA=8F=E5=88=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改300.最长递增子序列动态数组的定义 --- problems/0300.最长上升子序列.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/0300.最长上升子序列.md b/problems/0300.最长上升子序列.md index ed61a30e..dfdd5125 100644 --- a/problems/0300.最长上升子序列.md +++ b/problems/0300.最长上升子序列.md @@ -37,7 +37,7 @@ 1. dp[i]的定义 -**dp[i]表示i之前包括i的最长上升子序列的长度**。 +**dp[i]表示i之前包括i的以nums[i]结尾最长上升子序列的长度** 2. 状态转移方程 From 10c49296ff3b7d9d97fd1d061beb8db77e771be9 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Tue, 1 Mar 2022 21:28:59 +0800 Subject: [PATCH 159/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880236.?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84=E6=9C=80=E8=BF=91=E5=85=AC?= =?UTF-8?q?=E5=85=B1=E7=A5=96=E5=85=88.md=EF=BC=89=EF=BC=9A=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0236.二叉树的最近公共祖先.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/problems/0236.二叉树的最近公共祖先.md b/problems/0236.二叉树的最近公共祖先.md index 6213aeaa..ca5fba77 100644 --- a/problems/0236.二叉树的最近公共祖先.md +++ b/problems/0236.二叉树的最近公共祖先.md @@ -325,6 +325,20 @@ var lowestCommonAncestor = function(root, p, q) { }; ``` +## TypeScript + +```typescript +function lowestCommonAncestor(root: TreeNode | null, p: TreeNode | null, q: TreeNode | null): TreeNode | null { + if (root === null || root === p || root === q) return root; + const left = lowestCommonAncestor(root.left, p, q); + const right = lowestCommonAncestor(root.right, p, q); + if (left !== null && right !== null) return root; + if (left !== null) return left; + if (right !== null) return right; + return null; +}; +``` + ----------------------- From d4e3da4c3db7729441397b7555b5a26b62fb8e2c Mon Sep 17 00:00:00 2001 From: Qiyu Liang <61932152+Guicai996@users.noreply.github.com> Date: Tue, 1 Mar 2022 23:33:54 +0800 Subject: [PATCH 160/328] =?UTF-8?q?Update=200139.=E5=8D=95=E8=AF=8D?= =?UTF-8?q?=E6=8B=86=E5=88=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 删除原Line 102,修改memory数组为bool型 因为根据执行顺序,Line 101的if判断句,只有在前一个判断返回true的时候才会递归,因此若执行到memory[startIndex] = 1时,程序已经完成了遍历,memory[startIndex] = 1的情况完全没用的上。而memory用上的情况为false重复,即程序已经判断过startIndex开头无法分割。 --- problems/0139.单词拆分.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/problems/0139.单词拆分.md b/problems/0139.单词拆分.md index 1653a81a..e04cb173 100644 --- a/problems/0139.单词拆分.md +++ b/problems/0139.单词拆分.md @@ -89,27 +89,26 @@ class Solution { private: bool backtracking (const string& s, const unordered_set& wordSet, - vector& memory, + vector& memory, int startIndex) { if (startIndex >= s.size()) { return true; } // 如果memory[startIndex]不是初始值了,直接使用memory[startIndex]的结果 - if (memory[startIndex] != -1) return memory[startIndex]; + if (!memory[startIndex]) return memory[startIndex]; for (int i = startIndex; i < s.size(); i++) { string word = s.substr(startIndex, i - startIndex + 1); if (wordSet.find(word) != wordSet.end() && backtracking(s, wordSet, memory, i + 1)) { - memory[startIndex] = 1; // 记录以startIndex开始的子串是可以被拆分的 return true; } } - memory[startIndex] = 0; // 记录以startIndex开始的子串是不可以被拆分的 + memory[startIndex] = false; // 记录以startIndex开始的子串是不可以被拆分的 return false; } public: bool wordBreak(string s, vector& wordDict) { unordered_set wordSet(wordDict.begin(), wordDict.end()); - vector memory(s.size(), -1); // -1 表示初始化状态 + vector memory(s.size(), 1); // -1 表示初始化状态 return backtracking(s, wordSet, memory, 0); } }; From 58ffbd146ba7250eba350b688f2bed095495e012 Mon Sep 17 00:00:00 2001 From: leeeeeeewii <54872662+leeeeeeewii@users.noreply.github.com> Date: Tue, 1 Mar 2022 23:40:17 +0800 Subject: [PATCH 161/328] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=200116.=E5=A1=AB?= =?UTF-8?q?=E5=85=85=E6=AF=8F=E4=B8=AA=E8=8A=82=E7=82=B9=E7=9A=84=E4=B8=8B?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=E5=8F=B3=E4=BE=A7=E8=8A=82=E7=82=B9=E6=8C=87?= =?UTF-8?q?=E9=92=88.md=20Go=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0116.填充每个节点的下一个右侧节点指针.md | 47 ++++++++++++++++++- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/problems/0116.填充每个节点的下一个右侧节点指针.md b/problems/0116.填充每个节点的下一个右侧节点指针.md index bc3a8c6b..2c443de5 100644 --- a/problems/0116.填充每个节点的下一个右侧节点指针.md +++ b/problems/0116.填充每个节点的下一个右侧节点指针.md @@ -211,9 +211,52 @@ class Solution: return root ``` ## Go - ```go - +// 迭代法 +func connect(root *Node) *Node { + if root == nil { + return root + } + stack := make([]*Node, 0) + stack = append(stack, root) + for len(stack) > 0 { + n := len(stack) // 记录当前层节点个数 + for i := 0; i < n; i++ { + node := stack[0] // 依次弹出节点 + stack = stack[1:] + if i == n - 1 { // 如果是这层最右的节点,next指向nil + node.Next = nil + } else { + node.Next = stack[0] // 如果不是最右的节点,next指向右边的节点 + } + if node.Left != nil { // 如果存在左子节点,放入栈中 + stack = append(stack, node.Left) + } + if node.Right != nil { // 如果存在右子节点,放入栈中 + stack = append(stack, node.Right) + } + } + } + return root +} +``` +```go +// 常量级额外空间,使用next +func connect(root *Node) *Node { + if root == nil { + return root + } + for cur := root; cur.Left != nil; cur = cur.Left { // 遍历每层最左边的节点 + for node := cur; node != nil; node = node.Next { // 当前层从左到右遍历 + node.Left.Next = node.Right // 左子节点next指向右子节点 + if node.Next != nil { //如果node next有值,右子节点指向next节点的左子节点 + node.Right.Next = node.Next.Left + } + + } + } + return root +} ``` ## JavaScript From 246bbe921c5a09cc0f440bb97a75cf92067fd950 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Wed, 2 Mar 2022 14:20:44 +0800 Subject: [PATCH 162/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880235.?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=E7=9A=84=E6=9C=80?= =?UTF-8?q?=E8=BF=91=E5=85=AC=E5=85=B1=E7=A5=96=E5=85=88.md=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0235.二叉搜索树的最近公共祖先.md | 33 +++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/problems/0235.二叉搜索树的最近公共祖先.md b/problems/0235.二叉搜索树的最近公共祖先.md index b9d0a0bf..f7f1427a 100644 --- a/problems/0235.二叉搜索树的最近公共祖先.md +++ b/problems/0235.二叉搜索树的最近公共祖先.md @@ -350,6 +350,39 @@ var lowestCommonAncestor = function(root, p, q) { }; ``` +## TypeScript + +> 递归法: + +```typescript +function lowestCommonAncestor(root: TreeNode | null, p: TreeNode | null, q: TreeNode | null): TreeNode | null { + if (root.val > p.val && root.val > q.val) + return lowestCommonAncestor(root.left, p, q); + if (root.val < p.val && root.val < q.val) + return lowestCommonAncestor(root.right, p, q); + return root; +}; +``` + +> 迭代法: + +```typescript +function lowestCommonAncestor(root: TreeNode | null, p: TreeNode | null, q: TreeNode | null): TreeNode | null { + while (root !== null) { + if (root.val > p.val && root.val > q.val) { + root = root.left; + } else if (root.val < p.val && root.val < q.val) { + root = root.right; + } else { + return root; + }; + }; + return null; +}; +``` + + + -----------------------
From 32c54b4a5604aecab1681a84a8a58ed29b9a1151 Mon Sep 17 00:00:00 2001 From: Wayne <3522373084@qq.com> Date: Wed, 2 Mar 2022 16:03:14 +0800 Subject: [PATCH 163/328] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20968=20=E7=9B=91?= =?UTF-8?q?=E6=8E=A7=E4=BA=8C=E5=8F=89=E6=A0=91=20Java=20=E4=BB=A3?= =?UTF-8?q?=E7=A0=81,=E5=A2=9E=E5=8A=A0=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0968.监控二叉树.md | 50 ++++++++++++++++++++++++------------- 1 file changed, 33 insertions(+), 17 deletions(-) diff --git a/problems/0968.监控二叉树.md b/problems/0968.监控二叉树.md index 433060a5..35c3ccdc 100644 --- a/problems/0968.监控二叉树.md +++ b/problems/0968.监控二叉树.md @@ -316,28 +316,44 @@ public: ### Java ```java class Solution { - private int count = 0; + int res=0; public int minCameraCover(TreeNode root) { - if (trval(root) == 0) count++; - return count; + // 对根节点的状态做检验,防止根节点是无覆盖状态 . + if(minCame(root)==0){ + res++; + } + return res; } - - private int trval(TreeNode root) { - if (root == null) return -1; - - int left = trval(root.left); - int right = trval(root.right); - - if (left == 0 || right == 0) { - count++; + /** + 节点的状态值: + 0 表示无覆盖 + 1 表示 有摄像头 + 2 表示有覆盖 + 后序遍历,根据左右节点的情况,来判读 自己的状态 + */ + public int minCame(TreeNode root){ + if(root==null){ + // 空节点默认为 有覆盖状态,避免在叶子节点上放摄像头 return 2; } - - if (left == 2 || right == 2) { + int left=minCame(root.left); + int right=minCame(root.right); + + // 如果左右节点都覆盖了的话, 那么本节点的状态就应该是无覆盖,没有摄像头 + if(left==2&&right==2){ + //(2,2) + return 0; + }else if(left==0||right==0){ + // 左右节点都是无覆盖状态,那 根节点此时应该放一个摄像头 + // (0,0) (0,1) (0,2) (1,0) (2,0) + // 状态值为 1 摄像头数 ++; + res++; return 1; + }else{ + // 左右节点的 状态为 (1,1) (1,2) (2,1) 也就是左右节点至少存在 1个摄像头, + // 那么本节点就是处于被覆盖状态 + return 2; } - - return 0; } } ``` @@ -391,7 +407,7 @@ class Solution: result += 1 return result -``` +``` ### Go ```go From f4b55a1e4abb3e0ac0ae49c8126ee6a827c19447 Mon Sep 17 00:00:00 2001 From: ashing Date: Wed, 2 Mar 2022 21:10:26 +0800 Subject: [PATCH 164/328] =?UTF-8?q?Update=20=E8=83=8C=E5=8C=85=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80=E5=A4=9A=E9=87=8D?= =?UTF-8?q?=E8=83=8C=E5=8C=85.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 补充 go 多重背包理论 --- problems/背包问题理论基础多重背包.md | 87 ++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/problems/背包问题理论基础多重背包.md b/problems/背包问题理论基础多重背包.md index 80b9f8a1..d05c3445 100644 --- a/problems/背包问题理论基础多重背包.md +++ b/problems/背包问题理论基础多重背包.md @@ -245,7 +245,94 @@ if __name__ == '__main__': Go: +```go +package theory +import "log" + +// 多重背包可以化解为 01 背包 +func multiplePack(weight, value, nums []int, bagWeight int) int { + + for i := 0; i < len(nums); i++ { + for nums[i] > 1 { + weight = append(weight, weight[i]) + value = append(value, value[i]) + nums[i]-- + } + } + log.Println(weight) + log.Println(value) + + res := make([]int, bagWeight+1) + for i := 0; i < len(weight); i++ { + for j := bagWeight; j >= weight[i]; j-- { + res[j] = getMax(res[j], res[j-weight[i]]+value[i]) + } + log.Println(res) + } + + return res[bagWeight] +} +``` + +> 单元测试 + +```go +package theory + +import "testing" + +func Test_multiplePack(t *testing.T) { + type args struct { + weight []int + value []int + nums []int + bagWeight int + } + tests := []struct { + name string + args args + want int + }{ + { + name: "one", + args: args{ + weight: []int{1, 3, 4}, + value: []int{15, 20, 30}, + nums: []int{2, 3, 2}, + bagWeight: 10, + }, + want: 90, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := multiplePack(tt.args.weight, tt.args.value, tt.args.nums, tt.args.bagWeight); got != tt.want { + t.Errorf("multiplePack() = %v, want %v", got, tt.want) + } + }) + } +} +``` + +> 输出 + +``` +=== RUN Test_multiplePack +=== RUN Test_multiplePack/one +2022/03/02 21:09:05 [1 3 4 1 3 3 4] +2022/03/02 21:09:05 [15 20 30 15 20 20 30] +2022/03/02 21:09:05 [0 15 15 15 15 15 15 15 15 15 15] +2022/03/02 21:09:05 [0 15 15 20 35 35 35 35 35 35 35] +2022/03/02 21:09:05 [0 15 15 20 35 45 45 50 65 65 65] +2022/03/02 21:09:05 [0 15 30 30 35 50 60 60 65 80 80] +2022/03/02 21:09:05 [0 15 30 30 35 50 60 60 70 80 80] +2022/03/02 21:09:05 [0 15 30 30 35 50 60 60 70 80 80] +2022/03/02 21:09:05 [0 15 30 30 35 50 60 60 70 80 90] +--- PASS: Test_multiplePack (0.00s) + --- PASS: Test_multiplePack/one (0.00s) +PASS +``` ----------------------- From f2c75c27af3bd0ed9881faaa820529730068e353 Mon Sep 17 00:00:00 2001 From: kinsozheng Date: Wed, 2 Mar 2022 22:25:00 +0800 Subject: [PATCH 165/328] =?UTF-8?q?=E4=BF=AE=E6=94=B90018=E5=9B=9B?= =?UTF-8?q?=E6=95=B0=E4=B9=8B=E5=92=8C=20Python=E7=89=88=E6=9C=AC=20?= =?UTF-8?q?=E5=93=88=E5=B8=8C=E8=A1=A8=E6=B3=95=E8=A7=A3=E6=B3=95=20?= =?UTF-8?q?=E8=A7=A3=E5=86=B3=E7=94=A8set()=E5=AD=98=E5=82=A8=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E7=BB=93=E6=9E=9C=E4=BD=86=E6=98=AF=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E6=8A=A5=E9=94=99=E7=9A=84=E9=97=AE=E9=A2=98=20=E5=90=8C?= =?UTF-8?q?=E6=97=B6=E5=8A=A0=E5=85=A5=E4=BB=A5list()=E5=AD=98=E5=82=A8?= =?UTF-8?q?=E7=BB=93=E6=9E=9C=E7=9A=84=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0018.四数之和.md | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/problems/0018.四数之和.md b/problems/0018.四数之和.md index bad258c1..348f2f73 100644 --- a/problems/0018.四数之和.md +++ b/problems/0018.四数之和.md @@ -212,6 +212,7 @@ class Solution(object): # good thing about using python is you can use set to drop duplicates. ans = set() + # ans = [] # save results by list() for i in range(len(nums)): for j in range(i + 1, len(nums)): for k in range(j + 1, len(nums)): @@ -220,10 +221,16 @@ class Solution(object): # make sure no duplicates. count = (nums[i] == val) + (nums[j] == val) + (nums[k] == val) if hashmap[val] > count: - ans.add(tuple(sorted([nums[i], nums[j], nums[k], val]))) - else: - continue - return ans + ans_tmp = tuple(sorted([nums[i], nums[j], nums[k], val])) + ans.add(ans_tmp) + # Avoiding duplication in list manner but it cause time complexity increases + # if ans_tmp not in ans: + # ans.append(ans_tmp) + else: + continue + return list(ans) + # if used list() to save results, just + # return ans ``` From 70ea2c76eab540df65f34f79f5ba425ba50c54c7 Mon Sep 17 00:00:00 2001 From: wangming Date: Thu, 3 Mar 2022 16:29:41 +0800 Subject: [PATCH 166/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A00309.=E6=9C=80?= =?UTF-8?q?=E4=BD=B3=E4=B9=B0=E5=8D=96=E8=82=A1=E7=A5=A8=E6=97=B6=E6=9C=BA?= =?UTF-8?q?=E5=90=AB=E5=86=B7=E5=86=BB=E6=9C=9Fjs=E7=A9=BA=E9=97=B4?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0309.最佳买卖股票时机含冷冻期.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/problems/0309.最佳买卖股票时机含冷冻期.md b/problems/0309.最佳买卖股票时机含冷冻期.md index 2dc1e874..bb8909cd 100644 --- a/problems/0309.最佳买卖股票时机含冷冻期.md +++ b/problems/0309.最佳买卖股票时机含冷冻期.md @@ -284,6 +284,24 @@ const maxProfit = (prices) => { }; ``` +```javascript +// 一维数组空间优化 +const maxProfit = (prices) => { + const n = prices.length + const dp = new Array(4).fill(0) + dp[0] = -prices[0] + for (let i = 1; i < n; i ++) { + const temp = dp[0] // 缓存上一次的状态 + const temp1 = dp[2] + dp[0] = Math.max(dp[0], Math.max(dp[3] - prices[i], dp[1] - prices[i])) // 持有状态 + dp[1] = Math.max(dp[1], dp[3]) // 今天不操作且不持有股票 + dp[2] = temp + prices[i] // 今天卖出股票 + dp[3] = temp1 // 冷冻期 + } + return Math.max(...dp) +}; +``` + -----------------------
From cc302a9e8d43440605c4a61bde398784800c2b5e Mon Sep 17 00:00:00 2001 From: Aaron-Lin-74 <84072071+Aaron-Lin-74@users.noreply.github.com> Date: Fri, 4 Mar 2022 10:52:42 +1100 Subject: [PATCH 167/328] =?UTF-8?q?Update=200203.=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E9=93=BE=E8=A1=A8=E5=85=83=E7=B4=A0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The variable cur could be null, should add the union to the type of cur. --- problems/0203.移除链表元素.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/0203.移除链表元素.md b/problems/0203.移除链表元素.md index 4e7bdd34..c0e0be3e 100644 --- a/problems/0203.移除链表元素.md +++ b/problems/0203.移除链表元素.md @@ -324,7 +324,7 @@ function removeElements(head: ListNode | null, val: number): ListNode | null { head = head.next; } if (head === null) return head; - let pre: ListNode = head, cur: ListNode = head.next; + let pre: ListNode = head, cur: ListNode | null = head.next; // 删除非头部节点 while (cur) { if (cur.val === val) { From 09c1bd818abf8da2c1c426a06e46f2063b0089b0 Mon Sep 17 00:00:00 2001 From: Aaron-Lin-74 <84072071+Aaron-Lin-74@users.noreply.github.com> Date: Fri, 4 Mar 2022 11:12:33 +1100 Subject: [PATCH 168/328] =?UTF-8?q?Update=200203.=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E9=93=BE=E8=A1=A8=E5=85=83=E7=B4=A0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Creating a dummy head variable makes the logic clear. --- problems/0203.移除链表元素.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/problems/0203.移除链表元素.md b/problems/0203.移除链表元素.md index 4e7bdd34..d2ba1ae8 100644 --- a/problems/0203.移除链表元素.md +++ b/problems/0203.移除链表元素.md @@ -342,14 +342,14 @@ function removeElements(head: ListNode | null, val: number): ListNode | null { ```typescript function removeElements(head: ListNode | null, val: number): ListNode | null { - head = new ListNode(0, head); - let pre: ListNode = head, cur: ListNode = head.next; + let dummyHead = new ListNode(0, head); + let pre: ListNode = dummyHead, cur: ListNode | null = dummyHead.next; // 删除非头部节点 while (cur) { if (cur.val === val) { pre.next = cur.next; } else { - pre = pre.next; + pre = cur; } cur = cur.next; } From e83846db0413bdcb6be0509eb987d3d2d685de50 Mon Sep 17 00:00:00 2001 From: ClorisMoQi <748709762@qq.com> Date: Thu, 3 Mar 2022 22:40:31 -0800 Subject: [PATCH 169/328] add explanation for go slice --- problems/O(n)的算法居然超时了,此时的n究竟是多大?.md | 6 ++++++ problems/根据身高重建队列(vector原理讲解).md | 8 ++++++++ 2 files changed, 14 insertions(+) diff --git a/problems/O(n)的算法居然超时了,此时的n究竟是多大?.md b/problems/O(n)的算法居然超时了,此时的n究竟是多大?.md index 4de56597..66db2b83 100644 --- a/problems/O(n)的算法居然超时了,此时的n究竟是多大?.md +++ b/problems/O(n)的算法居然超时了,此时的n究竟是多大?.md @@ -226,7 +226,13 @@ Python: Go: +Go中slice的`append`操作和C++中vector的扩容机制基本相同。 +说是基本呢,其实是因为大家平时刷题和工作中遇到的数据不会特别大。 + +具体来说,当当前slice的长度小于**1024**时,执行`append`操作,新slice的capacity会变成当前的2倍;而当slice长度大于等于**1024**时,slice的扩容变成了每次增加当前slice长度的**1/4**。 + +在Go Slice的底层实现中,如果capacity不够时,会做一个reslice的操作,底层数组也会重新被复制到另一块内存区域中,所以`append`一个元素,不一定是O(1), 也可能是O(n)哦。 ----------------------- diff --git a/problems/根据身高重建队列(vector原理讲解).md b/problems/根据身高重建队列(vector原理讲解).md index 11a72e2d..28317e6c 100644 --- a/problems/根据身高重建队列(vector原理讲解).md +++ b/problems/根据身高重建队列(vector原理讲解).md @@ -171,6 +171,14 @@ Python: Go: +Go中slice的`append`操作和C++中vector的扩容机制基本相同。 + +说是基本呢,其实是因为大家平时刷题和工作中遇到的数据不会特别大。 + +具体来说,当当前slice的长度小于**1024**时,执行`append`操作,新slice的capacity会变成当前的2倍;而当slice长度大于等于**1024**时,slice的扩容变成了每次增加当前slice长度的**1/4**。 + +在Go Slice的底层实现中,如果capacity不够时,会做一个reslice的操作,底层数组也会重新被复制到另一块内存区域中,所以`append`一个元素,不一定是O(1), 也可能是O(n)哦。 + From 3ec2f7ff537407c036edabfab126d9190e0d299b Mon Sep 17 00:00:00 2001 From: ClorisMoQi <748709762@qq.com> Date: Thu, 3 Mar 2022 22:42:07 -0800 Subject: [PATCH 170/328] add explanation for go slice --- problems/O(n)的算法居然超时了,此时的n究竟是多大?.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/problems/O(n)的算法居然超时了,此时的n究竟是多大?.md b/problems/O(n)的算法居然超时了,此时的n究竟是多大?.md index 66db2b83..4de56597 100644 --- a/problems/O(n)的算法居然超时了,此时的n究竟是多大?.md +++ b/problems/O(n)的算法居然超时了,此时的n究竟是多大?.md @@ -226,13 +226,7 @@ Python: Go: -Go中slice的`append`操作和C++中vector的扩容机制基本相同。 -说是基本呢,其实是因为大家平时刷题和工作中遇到的数据不会特别大。 - -具体来说,当当前slice的长度小于**1024**时,执行`append`操作,新slice的capacity会变成当前的2倍;而当slice长度大于等于**1024**时,slice的扩容变成了每次增加当前slice长度的**1/4**。 - -在Go Slice的底层实现中,如果capacity不够时,会做一个reslice的操作,底层数组也会重新被复制到另一块内存区域中,所以`append`一个元素,不一定是O(1), 也可能是O(n)哦。 ----------------------- From 8cf3fabb60a29966bb725b223ada9d92d7aa5bb1 Mon Sep 17 00:00:00 2001 From: Aaron-Lin-74 <84072071+Aaron-Lin-74@users.noreply.github.com> Date: Sat, 5 Mar 2022 11:41:05 +1100 Subject: [PATCH 171/328] =?UTF-8?q?Update=200024.=E4=B8=A4=E4=B8=A4?= =?UTF-8?q?=E4=BA=A4=E6=8D=A2=E9=93=BE=E8=A1=A8=E4=B8=AD=E7=9A=84=E8=8A=82?= =?UTF-8?q?=E7=82=B9.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit TypeScript version code that better matches your c++ code example. --- problems/0024.两两交换链表中的节点.md | 40 ++++++++++----------------- 1 file changed, 14 insertions(+), 26 deletions(-) diff --git a/problems/0024.两两交换链表中的节点.md b/problems/0024.两两交换链表中的节点.md index bf1fd5e1..ce75e0d7 100644 --- a/problems/0024.两两交换链表中的节点.md +++ b/problems/0024.两两交换链表中的节点.md @@ -254,32 +254,20 @@ TypeScript: ```typescript function swapPairs(head: ListNode | null): ListNode | null { - /** - * 初始状态: - * curNode -> node1 -> node2 -> tmepNode - * 转换过程: - * curNode -> node2 - * curNode -> node2 -> node1 - * curNode -> node2 -> node1 -> tempNode - * curNode = node1 - */ - let retNode: ListNode | null = new ListNode(0, head), - curNode: ListNode | null = retNode, - node1: ListNode | null = null, - node2: ListNode | null = null, - tempNode: ListNode | null = null; - - while (curNode && curNode.next && curNode.next.next) { - node1 = curNode.next; - node2 = curNode.next.next; - tempNode = node2.next; - curNode.next = node2; - node2.next = node1; - node1.next = tempNode; - curNode = node1; - } - return retNode.next; -}; + const dummyHead: ListNode = new ListNode(0, head); + let cur: ListNode = dummyHead; + while(cur.next !== null && cur.next.next !== null) { + const tem: ListNode = cur.next; + const tem1: ListNode = cur.next.next.next; + + cur.next = cur.next.next; // step 1 + cur.next.next = tem; // step 2 + cur.next.next.next = tem1; // step 3 + + cur = cur.next.next; + } + return dummyHead.next; +} ``` Kotlin: From d701e5e2aa80d44a24fbc54e241d6589e34d4b12 Mon Sep 17 00:00:00 2001 From: Wayne <3522373084@qq.com> Date: Sat, 5 Mar 2022 10:59:03 +0800 Subject: [PATCH 172/328] =?UTF-8?q?=E4=BF=AE=E6=94=B9739=20=E6=AF=8F?= =?UTF-8?q?=E6=97=A5=E6=B8=A9=E5=BA=A6=E7=9A=84=20Java=20=E4=BB=A3?= =?UTF-8?q?=E7=A0=81,=E5=B9=B6=E5=A2=9E=E5=8A=A0=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0739.每日温度.md | 76 ++++++++++++++++++++++++++------------- 1 file changed, 51 insertions(+), 25 deletions(-) diff --git a/problems/0739.每日温度.md b/problems/0739.每日温度.md index d7489028..bdc75b96 100644 --- a/problems/0739.每日温度.md +++ b/problems/0739.每日温度.md @@ -177,34 +177,60 @@ public: Java: ```java -/** - * 单调栈,栈内顺序要么从大到小 要么从小到大,本题从大到小 - *

- * 入站元素要和当前栈内栈首元素进行比较 - * 若大于栈首则 则与元素下标做差 - * 若大于等于则放入 - * - * @param temperatures - * @return - */ - public static int[] dailyTemperatures(int[] temperatures) { - Stack stack = new Stack<>(); - int[] res = new int[temperatures.length]; - for (int i = 0; i < temperatures.length; i++) { - /** - * 取出下标进行元素值的比较 - */ - while (!stack.isEmpty() && temperatures[i] > temperatures[stack.peek()]) { - int preIndex = stack.pop(); - res[preIndex] = i - preIndex; + +class Solution { + // 版本 1 + public int[] dailyTemperatures(int[] temperatures) { + + int lens=temperatures.length; + int []res=new int[lens]; + + /** + 如果当前遍历的元素 大于栈顶元素,表示 栈顶元素的 右边的最大的元素就是 当前遍历的元素, + 所以弹出 栈顶元素,并记录 + 如果栈不空的话,还要考虑新的栈顶与当前元素的大小关系 + 否则的话,可以直接入栈。 + 注意,单调栈里 加入的元素是 下标。 + */ + Stackstack=new Stack<>(); + stack.push(0); + for(int i=1;itemperatures[stack.peek()]){ + res[stack.peek()]=i-stack.peek(); + stack.pop(); + } + stack.push(i); } - /** - * 注意 放入的是元素位置 - */ - stack.push(i); } - return res; + + return res; } + + //--------这 是一条分界线 + // 版本 2 + class Solution { + public int[] dailyTemperatures(int[] temperatures) { + int lens=temperatures.length; + int []res=new int[lens]; + Stackstack=new Stack<>(); + for(int i=0;itemperatures[stack.peek()]){ + res[stack.peek()]=i-stack.peek(); + stack.pop(); + } + stack.push(i); + } + + return res; + } +} + +} ``` Python: ``` Python3 From ecde43b2fc292edbfaa1fec6b16d6941e879507f Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Sat, 5 Mar 2022 17:12:34 +0800 Subject: [PATCH 173/328] update --- problems/0392.判断子序列.md | 2 +- problems/背包总结篇.md | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/problems/0392.判断子序列.md b/problems/0392.判断子序列.md index d64e1fd0..671576f7 100644 --- a/problems/0392.判断子序列.md +++ b/problems/0392.判断子序列.md @@ -77,7 +77,7 @@ if (s[i - 1] != t[j - 1]),此时相当于t要删除元素,t如果把当前 如果要是定义的dp[i][j]是以下标i为结尾的字符串s和以下标j为结尾的字符串t,初始化就比较麻烦了。 -这里dp[i][0]和dp[0][j]是没有含义的,仅仅是为了给递推公式做前期铺垫,所以初始化为0。 +dp[i][0] 表示以下标i-1为结尾的字符串,与空字符串的相同子序列长度,所以为0. dp[0][j]同理。 **其实这里只初始化dp[i][0]就够了,但一起初始化也方便,所以就一起操作了**,代码如下: diff --git a/problems/背包总结篇.md b/problems/背包总结篇.md index f80bcf29..a7852de3 100644 --- a/problems/背包总结篇.md +++ b/problems/背包总结篇.md @@ -82,6 +82,7 @@ ## 总结 + **这篇背包问题总结篇是对背包问题的高度概括,讲最关键的两部:递推公式和遍历顺序,结合力扣上的题目全都抽象出来了**。 **而且每一个点,我都给出了对应的力扣题目**。 @@ -90,7 +91,11 @@ 如果把我本篇总结出来的内容都掌握的话,可以说对背包问题理解的就很深刻了,用来对付面试中的背包问题绰绰有余! +背包问题总结: +![](https://code-thinking-1253855093.file.myqcloud.com/pics/背包问题1.jpeg) + +这个图是 [代码随想录知识星球](https://programmercarl.com/other/kstar.html) 成员:[海螺人](https://wx.zsxq.com/dweb2/index/footprint/844412858822412),所画结的非常好,分享给大家。 From f6360c701f5e1d251ad69e15c94c05273ff4235c Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Sun, 6 Mar 2022 11:44:39 +0800 Subject: [PATCH 174/328] Update --- README.md | 5 ++--- problems/前序/ACM模式如何构建二叉树.md | 16 +--------------- 2 files changed, 3 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index c1761f7b..0bf7fcdf 100644 --- a/README.md +++ b/README.md @@ -89,8 +89,7 @@ ## 前序 -* [「代码随想录」后序安排](https://mp.weixin.qq.com/s/4eeGJREy6E-v6D7cR_5A4g) -* [「代码随想录」学习社区](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) +* [「代码随想录」学习社区](https://programmercarl.com/other/kstar.html) * 编程语言 @@ -124,7 +123,7 @@ * 算法性能分析 * [关于时间复杂度,你不知道的都在这里!](./problems/前序/关于时间复杂度,你不知道的都在这里!.md) - * [$O(n)$的算法居然超时了,此时的n究竟是多大?](./problems/前序/On的算法居然超时了,此时的n究竟是多大?.md) + * [O(n)的算法居然超时了,此时的n究竟是多大?](./problems/前序/On的算法居然超时了,此时的n究竟是多大?.md) * [通过一道面试题目,讲一讲递归算法的时间复杂度!](./problems/前序/通过一道面试题目,讲一讲递归算法的时间复杂度!.md) * [本周小结!(算法性能分析系列一)](./problems/周总结/20201210复杂度分析周末总结.md) * [关于空间复杂度,可能有几个疑问?](./problems/前序/关于空间复杂度,可能有几个疑问?.md) diff --git a/problems/前序/ACM模式如何构建二叉树.md b/problems/前序/ACM模式如何构建二叉树.md index fc7a1823..28c4b6f7 100644 --- a/problems/前序/ACM模式如何构建二叉树.md +++ b/problems/前序/ACM模式如何构建二叉树.md @@ -45,21 +45,7 @@ ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210914223147.png) -那么此时大家是不是应该知道了,数组如何转化成 二叉树了。**如果父节点的数组下标是i,那么它的左孩子下标就是i * 2 + 1,右孩子下标就是 i * 2 + 2**。计算过程为: - -如果父节点在第$k$层,第$m,m \in [0,2^k]$个节点,则其左孩子所在的位置必然为$k+1$层,第$2*(m-1)+1$个节点。 - -- 计算父节点在数组中的索引: - $$ - index_{father}=(\sum_{i=0}^{i=k-1}2^i)+m-1=2^k-1+m-1 - $$ - -- 计算左子节点在数组的索引: - $$ - index_{left}=(\sum_{i=0}^{i=k}2^i)+2*m-1-1=2^{k+1}+2m-3 - $$ - -- 故左孩子的下表为$index_{left}=index_{father}\times2+1$,同理可得到右子孩子的索引关系。也可以直接在左子孩子的基础上`+1`。 +那么此时大家是不是应该知道了,数组如何转化成 二叉树了。**如果父节点的数组下标是i,那么它的左孩子下标就是i * 2 + 1,右孩子下标就是 i * 2 + 2**。 那么这里又有同学疑惑了,这些我都懂了,但我还是不知道 应该 怎么构造。 From d285d3d6b812a607bc31501a73a50a63222398d3 Mon Sep 17 00:00:00 2001 From: Younglesszzz <61218410+Younglesszzz@users.noreply.github.com> Date: Sun, 6 Mar 2022 20:54:25 +0800 Subject: [PATCH 175/328] =?UTF-8?q?=E6=9B=B4=E6=94=B9=E4=BA=86=E5=9B=9E?= =?UTF-8?q?=E6=BA=AF+=E8=AE=B0=E5=BF=86=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 经过提交验证,其实memo[startIndex] = 1的这个逻辑根本没有用到,因为如果返回true,那么会如同dfs一样直接返回,不会再进行下一步的backtracking搜索,本题的记忆法核心是令memo[startIndex]置为-1,来避免从相同的startIndex开始拆分,导致程序进行大量重复运算,这应该也是本题剪枝方法的核心。 --- problems/0139.单词拆分.md | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/problems/0139.单词拆分.md b/problems/0139.单词拆分.md index 1653a81a..a54b849a 100644 --- a/problems/0139.单词拆分.md +++ b/problems/0139.单词拆分.md @@ -251,30 +251,34 @@ class Solution { // 回溯法+记忆化 class Solution { + private Set set; + private int[] memo; public boolean wordBreak(String s, List wordDict) { - Set wordDictSet = new HashSet(wordDict); - int[] memory = new int[s.length()]; - return backTrack(s, wordDictSet, 0, memory); + memo = new int[s.length()]; + set = new HashSet<>(wordDict); + return backtracking(s, 0); } - - public boolean backTrack(String s, Set wordDictSet, int startIndex, int[] memory) { - // 结束条件 - if (startIndex >= s.length()) { + + public boolean backtracking(String s, int startIndex) { + // System.out.println(startIndex); + if (startIndex == s.length()) { return true; } - if (memory[startIndex] != 0) { - // 此处认为:memory[i] = 1 表示可以拼出i 及以后的字符子串, memory[i] = -1 表示不能 - return memory[startIndex] == 1 ? true : false; + if (memo[startIndex] == -1) { + return false; } - for (int i = startIndex; i < s.length(); ++i) { - // 处理 递归 回溯 循环不变量:[startIndex, i + 1) - String word = s.substring(startIndex, i + 1); - if (wordDictSet.contains(word) && backTrack(s, wordDictSet, i + 1, memory)) { - memory[startIndex] = 1; - return true; + + for (int i = startIndex; i < s.length(); i++) { + String sub = s.substring(startIndex, i + 1); + // 拆分出来的单词无法匹配 + if (!set.contains(sub)) { + continue; } + boolean res = backtracking(s, i + 1); + if (res) return true; } - memory[startIndex] = -1; + // 这里是关键,找遍了startIndex~s.length()也没能完全匹配,标记从startIndex开始不能找到 + memo[startIndex] = -1; return false; } } From 6e3f394893c39edae8864fffc71eee986e81361f Mon Sep 17 00:00:00 2001 From: Camille0512 Date: Mon, 7 Mar 2022 00:33:30 +0800 Subject: [PATCH 176/328] Add level order traversal --- problems/0101.对称二叉树.md | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/problems/0101.对称二叉树.md b/problems/0101.对称二叉树.md index e4e232c8..0007b4d4 100644 --- a/problems/0101.对称二叉树.md +++ b/problems/0101.对称二叉树.md @@ -437,6 +437,41 @@ class Solution: return True ``` +层序遍历 + +```python +class Solution: + def isSymmetric(self, root: TreeNode) -> bool: + if not root: return True + que, cnt = [[root.left, root.right]], 1 + while que: + nodes, tmp, sign = que.pop(), [], False + for node in nodes: + if not node: + tmp.append(None) + tmp.append(None) + else: + if node.left: + tmp.append(node.left) + sign = True + else: + tmp.append(None) + if node.right: + tmp.append(node.right) + sign = True + else: + tmp.append(None) + p1, p2 = 0, len(nodes) - 1 + while p1 < p2: + if (not nodes[p1] and nodes[p2]) or (nodes[p1] and not nodes[p2]): return False + elif nodes[p1] and nodes[p2] and nodes[p1].val != nodes[p2].val: return False + p1 += 1 + p2 -= 1 + if sign: que.append(tmp) + cnt += 1 + return True +``` + ## Go ```go From 94bf8916eef21cd40b2eb7b04cf67b2bf32ed6f6 Mon Sep 17 00:00:00 2001 From: Aaron-Lin-74 <84072071+Aaron-Lin-74@users.noreply.github.com> Date: Mon, 7 Mar 2022 10:15:06 +1100 Subject: [PATCH 177/328] =?UTF-8?q?Update=201002.=E6=9F=A5=E6=89=BE?= =?UTF-8?q?=E5=B8=B8=E7=94=A8=E5=AD=97=E7=AC=A6.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add TypeScript solution. --- problems/1002.查找常用字符.md | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/problems/1002.查找常用字符.md b/problems/1002.查找常用字符.md index 7c5566d3..efad1e6a 100644 --- a/problems/1002.查找常用字符.md +++ b/problems/1002.查找常用字符.md @@ -253,6 +253,41 @@ var commonChars = function (words) { return res }; ``` + +TypeScript +```ts +function commonChars(words: string[]): string[] { + let result: string[] = []; + if (words.length === 0) return result; + const size: number = 26; + const hash: number[] = new Array(size).fill(0); + const otherHash: number[] = new Array(size).fill(0); + let pivot: number = 'a'.charCodeAt(0); + // First word + for (let character of words[0]) { + hash[character.charCodeAt(0) - pivot]++; + } + // Other words + for (let i = 1; i < words.length; i++) { + for (let character of words[i]) { + otherHash[character.charCodeAt(0) - pivot]++; + } + // Update the first hash with min + for (let j = 0; j < size; j++) { + hash[j] = Math.min(hash[j], otherHash[j]); + } + // Reset otherHash + otherHash.fill(0); + } + // Construct the result + hash.forEach((element, index) => { + while (element-- > 0) { + result.push(String.fromCharCode(index + pivot)); + } + }); + return result; +} +``` GO ```golang func commonChars(words []string) []string { From b79f3e0fb75ceefdc7b7db1b9f60fd53e3c3fee0 Mon Sep 17 00:00:00 2001 From: wutianjue Date: Mon, 7 Mar 2022 14:38:03 +0800 Subject: [PATCH 178/328] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=AF=8F=E4=B8=AA?= =?UTF-8?q?=E6=A0=91=E8=A1=8C=E4=B8=AD=E6=89=BE=E6=9C=80=E5=A4=A7=E5=80=BC?= =?UTF-8?q?Java=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0102.二叉树的层序遍历.md | 34 +++++++++++++++---------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/problems/0102.二叉树的层序遍历.md b/problems/0102.二叉树的层序遍历.md index 74485848..42380b15 100644 --- a/problems/0102.二叉树的层序遍历.md +++ b/problems/0102.二叉树的层序遍历.md @@ -1300,23 +1300,23 @@ java代码: ```java class Solution { public List largestValues(TreeNode root) { - List retVal = new ArrayList(); - Queue tmpQueue = new LinkedList(); - if (root != null) tmpQueue.add(root); - - while (tmpQueue.size() != 0){ - int size = tmpQueue.size(); - List lvlVals = new ArrayList(); - for (int index = 0; index < size; index++){ - TreeNode node = tmpQueue.poll(); - lvlVals.add(node.val); - if (node.left != null) tmpQueue.add(node.left); - if (node.right != null) tmpQueue.add(node.right); - } - retVal.add(Collections.max(lvlVals)); - } - - return retVal; + if(root == null){ + return Collections.emptyList(); + } + List result = new ArrayList(); + Queue queue = new LinkedList(); + queue.offer(root); + while(!queue.isEmpty()){ + int max = Integer.MIN_VALUE; + for(int i = queue.size(); i > 0; i--){ + TreeNode node = queue.poll(); + max = Math.max(max, node.val); + if(node.left != null) queue.offer(node.left); + if(node.right != null) queue.offer(node.right); + } + result.add(max); + } + return result; } } ``` From a33f315175ff76061cbafc2b53a309f75db9890f Mon Sep 17 00:00:00 2001 From: tlylt Date: Mon, 7 Mar 2022 15:26:18 +0800 Subject: [PATCH 179/328] Fix spelling error --- problems/0416.分割等和子集.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/problems/0416.分割等和子集.md b/problems/0416.分割等和子集.md index 9da1f8d5..a4e780ab 100644 --- a/problems/0416.分割等和子集.md +++ b/problems/0416.分割等和子集.md @@ -253,14 +253,14 @@ Python: ```python class Solution: def canPartition(self, nums: List[int]) -> bool: - taraget = sum(nums) - if taraget % 2 == 1: return False - taraget //= 2 + target = sum(nums) + if target % 2 == 1: return False + target //= 2 dp = [0] * 10001 for i in range(len(nums)): - for j in range(taraget, nums[i] - 1, -1): + for j in range(target, nums[i] - 1, -1): dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]) - return taraget == dp[taraget] + return target == dp[target] ``` Go: ```go From 5a848b76c184a447bdc96d8afe40071bbf7f9cd0 Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Wed, 9 Mar 2022 11:22:51 +0800 Subject: [PATCH 180/328] Update --- problems/0127.单词接龙.md | 1 - problems/二叉树理论基础.md | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/problems/0127.单词接龙.md b/problems/0127.单词接龙.md index fb403a5b..407596c0 100644 --- a/problems/0127.单词接龙.md +++ b/problems/0127.单词接龙.md @@ -9,7 +9,6 @@ [力扣题目链接](https://leetcode-cn.com/problems/word-ladder/) - 字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列: * 序列中第一个单词是 beginWord 。 * 序列中最后一个单词是 endWord 。 diff --git a/problems/二叉树理论基础.md b/problems/二叉树理论基础.md index 62e3b19a..9c151e32 100644 --- a/problems/二叉树理论基础.md +++ b/problems/二叉树理论基础.md @@ -33,7 +33,7 @@ 什么是完全二叉树? -完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2^h -1  个节点。 +完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2^(h-1)  个节点。 **大家要自己看完全二叉树的定义,很多同学对完全二叉树其实不是真正的懂了。** From ea31f6e70c277b527f90fce96dacb59a660f8956 Mon Sep 17 00:00:00 2001 From: berserk-112 <40333359+berserk-112@users.noreply.github.com> Date: Wed, 9 Mar 2022 12:05:30 +0800 Subject: [PATCH 181/328] =?UTF-8?q?Update=200309.=E6=9C=80=E4=BD=B3?= =?UTF-8?q?=E4=B9=B0=E5=8D=96=E8=82=A1=E7=A5=A8=E6=97=B6=E6=9C=BA=E5=90=AB?= =?UTF-8?q?=E5=86=B7=E5=86=BB=E6=9C=9F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加了java版本的另一种解题思路,无需考虑多种状态,还是只考虑持有与未持有两种状态 --- problems/0309.最佳买卖股票时机含冷冻期.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/problems/0309.最佳买卖股票时机含冷冻期.md b/problems/0309.最佳买卖股票时机含冷冻期.md index 2dc1e874..53caa46e 100644 --- a/problems/0309.最佳买卖股票时机含冷冻期.md +++ b/problems/0309.最佳买卖股票时机含冷冻期.md @@ -205,6 +205,29 @@ class Solution { } } ``` +```java +//另一种解题思路 +class Solution { + public int maxProfit(int[] prices) { + int[][] dp = new int[prices.length + 1][2]; + dp[1][0] = -prices[0]; + + for (int i = 2; i <= prices.length; i++) { + /* + dp[i][0] 第i天未持有股票收益; + dp[i][1] 第i天持有股票收益; + 情况一:第i天是冷静期,不能以dp[i-1][1]购买股票,所以以dp[i - 2][1]买股票,没问题 + 情况二:第i天不是冷静期,理论上应该以dp[i-1][1]购买股票,但是第i天不是冷静期说明,第i-1天没有卖出股票, + 则dp[i-1][1]=dp[i-2][1],所以可以用dp[i-2][1]买股票,没问题 + */ + dp[i][0] = Math.max(dp[i - 1][0], dp[i - 2][1] - prices[i - 1]); + dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] + prices[i - 1]); + } + + return dp[prices.length][1]; + } +} +``` Python: From 6c3c8c7bff1bf90f4a79259c0b7abd2434fd9d72 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 11 Mar 2022 11:35:14 +0800 Subject: [PATCH 182/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880701.?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E6=8F=92=E5=85=A5=E6=93=8D=E4=BD=9C.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0701.二叉搜索树中的插入操作.md | 72 +++++++++++++++++++++++-- 1 file changed, 69 insertions(+), 3 deletions(-) diff --git a/problems/0701.二叉搜索树中的插入操作.md b/problems/0701.二叉搜索树中的插入操作.md index 5e9fbdfe..df6a3954 100644 --- a/problems/0701.二叉搜索树中的插入操作.md +++ b/problems/0701.二叉搜索树中的插入操作.md @@ -280,7 +280,7 @@ class Solution: # 返回更新后的以当前root为根节点的新树 return roo -``` +``` **递归法** - 无返回值 ```python @@ -308,7 +308,7 @@ class Solution: return __traverse(root, val) return root -``` +``` **递归法** - 无返回值 - another easier way ```python @@ -378,7 +378,7 @@ func insertIntoBST(root *TreeNode, val int) *TreeNode { } return root } -``` +``` 迭代法 @@ -520,5 +520,71 @@ var insertIntoBST = function (root, val) { }; ``` +## TypeScript + +> 递归-有返回值 + +```typescript +function insertIntoBST(root: TreeNode | null, val: number): TreeNode | null { + if (root === null) return new TreeNode(val); + if (root.val > val) { + root.left = insertIntoBST(root.left, val); + } else { + root.right = insertIntoBST(root.right, val); + } + return root; +}; +``` + +> 递归-无返回值 + +```typescript +function insertIntoBST(root: TreeNode | null, val: number): TreeNode | null { + if (root === null) return new TreeNode(val); + function recur(root: TreeNode | null, val: number) { + if (root === null) { + if (parentNode.val > val) { + parentNode.left = new TreeNode(val); + } else { + parentNode.right = new TreeNode(val); + } + return; + } + parentNode = root; + if (root.val > val) recur(root.left, val); + if (root.val < val) recur(root.right, val); + } + let parentNode: TreeNode = root; + recur(root, val); + return root; +}; +``` + +> 迭代法 + +```typescript +function insertIntoBST(root: TreeNode | null, val: number): TreeNode | null { + if (root === null) return new TreeNode(val); + let curNode: TreeNode | null = root; + let parentNode: TreeNode = root; + while (curNode !== null) { + parentNode = curNode; + if (curNode.val > val) { + curNode = curNode.left + } else { + curNode = curNode.right; + } + } + if (parentNode.val > val) { + parentNode.left = new TreeNode(val); + } else { + parentNode.right = new TreeNode(val); + } + return root; +}; +``` + + + -----------------------

From 301dd3e13984a2d6de4711bc08417aa3bd2a1e8d Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sat, 12 Mar 2022 00:15:06 +0800 Subject: [PATCH 183/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880450.?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91?= =?UTF-8?q?=E4=B8=AD=E7=9A=84=E8=8A=82=E7=82=B9.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0450.删除二叉搜索树中的节点.md | 64 +++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/problems/0450.删除二叉搜索树中的节点.md b/problems/0450.删除二叉搜索树中的节点.md index 2e333530..cc29bea4 100644 --- a/problems/0450.删除二叉搜索树中的节点.md +++ b/problems/0450.删除二叉搜索树中的节点.md @@ -518,6 +518,70 @@ var deleteNode = function (root, key) { } ``` +## TypeScript + +> 递归法: + +```typescript +function deleteNode(root: TreeNode | null, key: number): TreeNode | null { + if (root === null) return null; + if (root.val === key) { + if (root.left === null && root.right === null) return null; + if (root.left === null) return root.right; + if (root.right === null) return root.left; + let curNode: TreeNode = root.right; + while (curNode.left !== null) { + curNode = curNode.left; + } + curNode.left = root.left; + return root.right; + } + if (root.val > key) root.left = deleteNode(root.left, key); + if (root.val < key) root.right = deleteNode(root.right, key); + return root; +}; +``` + +> 迭代法: + +```typescript +function deleteNode(root: TreeNode | null, key: number): TreeNode | null { + function removeTargetNode(root: TreeNode): TreeNode | null { + if (root.left === null && root.right === null) return null; + if (root.right === null) return root.left; + if (root.left === null) return root.right; + let curNode: TreeNode | null = root.right; + while (curNode.left !== null) { + curNode = curNode.left; + } + curNode.left = root.left; + return root.right; + } + let preNode: TreeNode | null = null, + curNode: TreeNode | null = root; + while (curNode !== null) { + if (curNode.val === key) break; + preNode = curNode; + if (curNode.val > key) { + curNode = curNode.left; + } else { + curNode = curNode.right; + } + } + if (curNode === null) return root; + if (preNode === null) { + // 删除头节点 + return removeTargetNode(curNode); + } + if (preNode.val > key) { + preNode.left = removeTargetNode(curNode); + } else { + preNode.right = removeTargetNode(curNode); + } + return root; +}; +``` + ----------------------- From 4549ca38bfbd438d2505f7925d6051ed146c53b4 Mon Sep 17 00:00:00 2001 From: Epoch <75031971+messenger1th@users.noreply.github.com> Date: Mon, 14 Mar 2022 13:33:40 +0800 Subject: [PATCH 184/328] =?UTF-8?q?Update=200151.=E7=BF=BB=E8=BD=AC?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2=E9=87=8C=E7=9A=84=E5=8D=95=E8=AF=8D?= =?UTF-8?q?=20=E5=90=8C=E7=90=86CPP=20=E7=89=88=E6=9C=AC2=E7=AE=80?= =?UTF-8?q?=E6=B4=81=E5=AE=9E=E7=8E=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 规范代码,优化留白。 同时添加详细注解, 并给出同理题目练习链接。 --- problems/0151.翻转字符串里的单词.md | 36 +++++++++++++++-------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/problems/0151.翻转字符串里的单词.md b/problems/0151.翻转字符串里的单词.md index 677a8f64..e7abd1d8 100644 --- a/problems/0151.翻转字符串里的单词.md +++ b/problems/0151.翻转字符串里的单词.md @@ -224,34 +224,36 @@ public: ```CPP //版本二: +//原理同版本1,更简洁实现。 class Solution { public: - void reverseWord(string& s,int start,int end){ //这个函数,Carl哥的要更清晰。 - for(int i=start;i<(end-start)/2+start;++i){ - swap(s[i],s[end-1-i+start]); + void reverse(string& s, int start, int end){ //翻转,区间写法:闭区间 [] + for (int i = start, j = end; i < j; i++, j--) { + swap(s[i], s[j]); } } - void trim(string& s){//去除所有空格并在相邻单词之间添加空格 - int slow = 0; - for(int i=0;i Date: Mon, 14 Mar 2022 18:58:24 +0800 Subject: [PATCH 185/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880669.?= =?UTF-8?q?=E4=BF=AE=E5=89=AA=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91?= =?UTF-8?q?.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0669.修剪二叉搜索树.md | 50 +++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/problems/0669.修剪二叉搜索树.md b/problems/0669.修剪二叉搜索树.md index 15f6a040..385b2268 100644 --- a/problems/0669.修剪二叉搜索树.md +++ b/problems/0669.修剪二叉搜索树.md @@ -405,6 +405,56 @@ var trimBST = function (root,low,high) { } ``` +## TypeScript + +> 递归法 + +```typescript +function trimBST(root: TreeNode | null, low: number, high: number): TreeNode | null { + if (root === null) return null; + if (root.val < low) { + return trimBST(root.right, low, high); + } + if (root.val > high) { + return trimBST(root.left, low, high); + } + root.left = trimBST(root.left, low, high); + root.right = trimBST(root.right, low, high); + return root; +}; +``` + +> 迭代法 + +```typescript +function trimBST(root: TreeNode | null, low: number, high: number): TreeNode | null { + while (root !== null && (root.val < low || root.val > high)) { + if (root.val < low) { + root = root.right; + } else if (root.val > high) { + root = root.left; + } + } + let curNode: TreeNode | null = root; + while (curNode !== null) { + while (curNode.left !== null && curNode.left.val < low) { + curNode.left = curNode.left.right; + } + curNode = curNode.left; + } + curNode = root; + while (curNode !== null) { + while (curNode.right !== null && curNode.right.val > high) { + curNode.right = curNode.right.left; + } + curNode = curNode.right; + } + return root; +}; +``` + + + -----------------------
From e03a51264b584d83838a4847983b40ee1b7d7ddb Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Tue, 15 Mar 2022 00:08:01 +0800 Subject: [PATCH 186/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880108.?= =?UTF-8?q?=E5=B0=86=E6=9C=89=E5=BA=8F=E6=95=B0=E7=BB=84=E8=BD=AC=E6=8D=A2?= =?UTF-8?q?=E4=B8=BA=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91.md?= =?UTF-8?q?=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0108.将有序数组转换为二叉搜索树.md | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/problems/0108.将有序数组转换为二叉搜索树.md b/problems/0108.将有序数组转换为二叉搜索树.md index 9e008e86..bd5915fd 100644 --- a/problems/0108.将有序数组转换为二叉搜索树.md +++ b/problems/0108.将有序数组转换为二叉搜索树.md @@ -251,7 +251,7 @@ class Solution { return root; } } -``` +``` 迭代: 左闭右闭 [left,right] ```java @@ -373,7 +373,24 @@ var sortedArrayToBST = function (nums) { }; ``` +## TypeScript + +```typescript +function sortedArrayToBST(nums: number[]): TreeNode | null { + function recur(nums: number[], left: number, right: number): TreeNode | null { + if (left > right) return null; + let mid: number = Math.floor((left + right) / 2); + const root: TreeNode = new TreeNode(nums[mid]); + root.left = recur(nums, left, mid - 1); + root.right = recur(nums, mid + 1, right); + return root; + } + return recur(nums, 0, nums.length - 1); +}; +``` + ## C + 递归 ```c struct TreeNode* traversal(int* nums, int left, int right) { From 56272922060f1ccff4196269dff1091e5315f2ad Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Wed, 16 Mar 2022 22:05:03 +0800 Subject: [PATCH 187/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880538.?= =?UTF-8?q?=E6=8A=8A=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=E8=BD=AC?= =?UTF-8?q?=E6=8D=A2=E4=B8=BA=E7=B4=AF=E5=8A=A0=E6=A0=91.md=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0538.把二叉搜索树转换为累加树.md | 42 +++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/problems/0538.把二叉搜索树转换为累加树.md b/problems/0538.把二叉搜索树转换为累加树.md index 1b07b803..37eb7d0f 100644 --- a/problems/0538.把二叉搜索树转换为累加树.md +++ b/problems/0538.把二叉搜索树转换为累加树.md @@ -312,5 +312,47 @@ struct TreeNode* convertBST(struct TreeNode* root){ } ``` +## TypeScript + +> 递归法 + +```typescript +function convertBST(root: TreeNode | null): TreeNode | null { + let pre: number = 0; + function recur(root: TreeNode | null): void { + if (root === null) return; + recur(root.right); + root.val += pre; + pre = root.val; + recur(root.left); + } + recur(root); + return root; +}; +``` + +> 迭代法 + +```typescript +function convertBST(root: TreeNode | null): TreeNode | null { + const helperStack: TreeNode[] = []; + let curNode: TreeNode | null = root; + let pre: number = 0; + while (curNode !== null || helperStack.length > 0) { + while (curNode !== null) { + helperStack.push(curNode); + curNode = curNode.right; + } + curNode = helperStack.pop()!; + curNode.val += pre; + pre = curNode.val; + curNode = curNode.left; + } + return root; +}; +``` + + + -----------------------
From 1856401654174c3b50185471b9bc2888c04237c0 Mon Sep 17 00:00:00 2001 From: Speed <48878102+speedzjy@users.noreply.github.com> Date: Wed, 16 Mar 2022 22:26:46 +0800 Subject: [PATCH 188/328] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200134.=E5=8A=A0?= =?UTF-8?q?=E6=B2=B9=E7=AB=99.md=EF=BC=8C=20=E5=B0=86=E6=9A=B4=E5=8A=9B?= =?UTF-8?q?=E8=A7=A3=E6=B3=95=E4=BB=A3=E7=A0=81=E5=9D=97=E5=90=8E=E7=9A=84?= =?UTF-8?q?=E7=A9=BA=E9=97=B4=E5=A4=8D=E6=9D=82=E5=BA=A6=E8=AF=B4=E6=98=8E?= =?UTF-8?q?=E7=94=B1O(n)=E6=94=B9=E4=B8=BAO(1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0134.加油站.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/0134.加油站.md b/problems/0134.加油站.md index ca95af67..1062a91c 100644 --- a/problems/0134.加油站.md +++ b/problems/0134.加油站.md @@ -78,7 +78,7 @@ public: ``` * 时间复杂度:$O(n^2)$ -* 空间复杂度:$O(n)$ +* 空间复杂度:$O(1)$ C++暴力解法在leetcode上提交也可以过。 From e1f3bdd973c88cada2a59dbc28fecbe0b798d246 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Thu, 17 Mar 2022 16:30:06 +0800 Subject: [PATCH 189/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880077.?= =?UTF-8?q?=E7=BB=84=E5=90=88.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typesc?= =?UTF-8?q?ript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0077.组合.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/problems/0077.组合.md b/problems/0077.组合.md index 2bd7a287..a1403c37 100644 --- a/problems/0077.组合.md +++ b/problems/0077.组合.md @@ -456,6 +456,27 @@ const combineHelper = (n, k, startIndex) => { } ``` +## TypeScript + +```typescript +function combine(n: number, k: number): number[][] { + let resArr: number[][] = []; + function backTracking(n: number, k: number, startIndex: number, tempArr: number[]): void { + if (tempArr.length === k) { + resArr.push(tempArr.slice()); + return; + } + for (let i = startIndex; i <= n - k + 1 + tempArr.length; i++) { + tempArr.push(i); + backTracking(n, k, i + 1, tempArr); + tempArr.pop(); + } + } + backTracking(n, k, 1, []); + return resArr; +}; +``` + ## Go From a90db6e830474a70dd445a77cef578627374ca5e Mon Sep 17 00:00:00 2001 From: SianXiaoCHN Date: Thu, 17 Mar 2022 13:38:45 -0500 Subject: [PATCH 190/328] =?UTF-8?q?0941.=E6=9C=89=E6=95=88=E7=9A=84?= =?UTF-8?q?=E5=B1=B1=E8=84=89=E6=95=B0=E7=BB=84=20python3=20=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E5=8F=8C=E6=8C=87=E9=92=88=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 0941.有效的山脉数组 python3 从原方法更新到双指针方法 --- problems/0941.有效的山脉数组.md | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/problems/0941.有效的山脉数组.md b/problems/0941.有效的山脉数组.md index a2444cc1..4b7a978c 100644 --- a/problems/0941.有效的山脉数组.md +++ b/problems/0941.有效的山脉数组.md @@ -106,22 +106,15 @@ class Solution { ```python class Solution: def validMountainArray(self, arr: List[int]) -> bool: - if len(arr) < 3 : - return False - - i = 1 - flagIncrease = False # 上升 - flagDecrease = False # 下降 - - while i < len(arr) and arr[i-1] < arr[i]: - flagIncrease = True - i += 1 - - while i < len(arr) and arr[i-1] > arr[i]: - flagDecrease = True - i += 1 - - return i == len(arr) and flagIncrease and flagDecrease + left, right = 0, len(arr)-1 + + while left < len(arr)-1 and arr[left+1] > arr[left]: + left += 1 + + while right > 0 and arr[right-1] > arr[right]: + right -= 1 + + return left == right and right != 0 and left != len(arr)-1 ``` From a95b24a2290c72197e9107e38e91e11ffa92ef3d Mon Sep 17 00:00:00 2001 From: SianXiaoCHN Date: Thu, 17 Mar 2022 13:43:03 -0500 Subject: [PATCH 191/328] =?UTF-8?q?0225.=E7=94=A8=E9=98=9F=E5=88=97?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E6=A0=88=20python3=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 0225.用队列实现栈 python3 更新优化方法(只使用一个队列) --- problems/0225.用队列实现栈.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/problems/0225.用队列实现栈.md b/problems/0225.用队列实现栈.md index c45917db..3457c4b3 100644 --- a/problems/0225.用队列实现栈.md +++ b/problems/0225.用队列实现栈.md @@ -354,6 +354,32 @@ class MyStack: return len(self.queue_in) == 0 ``` +优化,使用一个队列实现 +```python +class MyStack: + + def __init__(self): + self.que = deque() + + def push(self, x: int) -> None: + self.que.append(x) + + def pop(self) -> int: + if self.empty(): + return None + for i in range(len(self.que)-1): + self.que.append(self.que.popleft()) + return self.que.popleft() + + def top(self) -> int: + if self.empty(): + return None + return self.que[-1] + + def empty(self) -> bool: + return not self.que +``` + Go: From c77840639653808f528af05cd90ebef0c160cbf0 Mon Sep 17 00:00:00 2001 From: IcePigZDB Date: Sat, 19 Mar 2022 20:05:04 +0800 Subject: [PATCH 192/328] fix some small typo Signed-off-by: IcePigZDB --- problems/0020.有效的括号.md | 2 +- problems/0112.路径总和.md | 2 +- problems/0239.滑动窗口最大值.md | 2 +- problems/0377.组合总和Ⅳ.md | 2 +- problems/0647.回文子串.md | 4 ++-- problems/栈与队列理论基础.md | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/problems/0020.有效的括号.md b/problems/0020.有效的括号.md index 01fc7b93..7bb7f746 100644 --- a/problems/0020.有效的括号.md +++ b/problems/0020.有效的括号.md @@ -125,7 +125,7 @@ public: } }; ``` -技巧性的东西没有固定的学习方法,还是要多看多练,自己总灵活运用了。 +技巧性的东西没有固定的学习方法,还是要多看多练,自己灵活运用了。 ## 其他语言版本 diff --git a/problems/0112.路径总和.md b/problems/0112.路径总和.md index 5db36687..f80cf59c 100644 --- a/problems/0112.路径总和.md +++ b/problems/0112.路径总和.md @@ -212,7 +212,7 @@ public: }; ``` -如果大家完全理解了本地的递归方法之后,就可以顺便把leetcode上113. 路径总和ii做了。 +如果大家完全理解了本题的递归方法之后,就可以顺便把leetcode上113. 路径总和ii做了。 # 113. 路径总和ii diff --git a/problems/0239.滑动窗口最大值.md b/problems/0239.滑动窗口最大值.md index ce215a7e..f269450f 100644 --- a/problems/0239.滑动窗口最大值.md +++ b/problems/0239.滑动窗口最大值.md @@ -193,7 +193,7 @@ public: # 扩展 -大家貌似对单调队列 都有一些疑惑,首先要明确的是,题解中单调队列里的pop和push接口,仅适用于本题哈。单调队列不是一成不变的,而是不同场景不同写法,总之要保证队列里单调递减或递增的原则,所以叫做单调队列。 不要以为本地中的单调队列实现就是固定的写法哈。 +大家貌似对单调队列 都有一些疑惑,首先要明确的是,题解中单调队列里的pop和push接口,仅适用于本题哈。单调队列不是一成不变的,而是不同场景不同写法,总之要保证队列里单调递减或递增的原则,所以叫做单调队列。 不要以为本题中的单调队列实现就是固定的写法哈。 大家貌似对deque也有一些疑惑,C++中deque是stack和queue默认的底层实现容器(这个我们之前已经讲过啦),deque是可以两边扩展的,而且deque里元素并不是严格的连续分布的。 diff --git a/problems/0377.组合总和Ⅳ.md b/problems/0377.组合总和Ⅳ.md index 940d81b8..aaf27e61 100644 --- a/problems/0377.组合总和Ⅳ.md +++ b/problems/0377.组合总和Ⅳ.md @@ -127,7 +127,7 @@ public: ``` -C++测试用例有超过两个树相加超过int的数据,所以需要在if里加上dp[i] < INT_MAX - dp[i - num]。 +C++测试用例有两个数相加超过int的数据,所以需要在if里加上dp[i] < INT_MAX - dp[i - num]。 但java就不用考虑这个限制,java里的int也是四个字节吧,也有可能leetcode后台对不同语言的测试数据不一样。 diff --git a/problems/0647.回文子串.md b/problems/0647.回文子串.md index d9928b8f..913aec65 100644 --- a/problems/0647.回文子串.md +++ b/problems/0647.回文子串.md @@ -54,7 +54,7 @@ 当s[i]与s[j]相等时,这就复杂一些了,有如下三种情况 * 情况一:下标i 与 j相同,同一个字符例如a,当然是回文子串 -* 情况二:下标i 与 j相差为1,例如aa,也是文子串 +* 情况二:下标i 与 j相差为1,例如aa,也是回文子串 * 情况三:下标:i 与 j相差大于1的时候,例如cabac,此时s[i]与s[j]已经相同了,我们看i到j区间是不是回文子串就看aba是不是回文就可以了,那么aba的区间就是 i+1 与 j-1区间,这个区间是不是回文就看dp[i + 1][j - 1]是否为true。 以上三种情况分析完了,那么递归公式如下: @@ -178,7 +178,7 @@ public: 动态规划的空间复杂度是偏高的,我们再看一下双指针法。 -首先确定回文串,就是找中心然后想两边扩散看是不是对称的就可以了。 +首先确定回文串,就是找中心然后向两边扩散看是不是对称的就可以了。 **在遍历中心点的时候,要注意中心点有两种情况**。 diff --git a/problems/栈与队列理论基础.md b/problems/栈与队列理论基础.md index 44fcbdd5..8c76614f 100644 --- a/problems/栈与队列理论基础.md +++ b/problems/栈与队列理论基础.md @@ -15,7 +15,7 @@ 那么我这里在列出四个关于栈的问题,大家可以思考一下。以下是以C++为例,相信使用其他编程语言的同学也对应思考一下,自己使用的编程语言里栈和队列是什么样的。 1. C++中stack 是容器么? -2. 我们使用的stack是属于那个版本的STL? +2. 我们使用的stack是属于哪个版本的STL? 3. 我们使用的STL中stack是如何实现的? 4. stack 提供迭代器来遍历stack空间么? From 907204559fb56504a0035d70cbe478996152e8d3 Mon Sep 17 00:00:00 2001 From: IcePigZDB Date: Sat, 19 Mar 2022 20:15:24 +0800 Subject: [PATCH 193/328] =?UTF-8?q?=E5=AD=90=E9=9B=86II=20cpp=20=E4=BB=A3?= =?UTF-8?q?=E7=A0=81formate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: IcePigZDB --- problems/0090.子集II.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/problems/0090.子集II.md b/problems/0090.子集II.md index 16bd1f2c..d08707b4 100644 --- a/problems/0090.子集II.md +++ b/problems/0090.子集II.md @@ -87,7 +87,7 @@ class Solution { private: vector> result; vector path; - void backtracking(vector& nums, int startIndex, vector& used) { + void backtracking(vector& nums, int startIndex) { result.push_back(path); unordered_set uset; for (int i = startIndex; i < nums.size(); i++) { @@ -96,7 +96,7 @@ private: } uset.insert(nums[i]); path.push_back(nums[i]); - backtracking(nums, i + 1, used); + backtracking(nums, i + 1); path.pop_back(); } } @@ -105,9 +105,8 @@ public: vector> subsetsWithDup(vector& nums) { result.clear(); path.clear(); - vector used(nums.size(), false); sort(nums.begin(), nums.end()); // 去重需要排序 - backtracking(nums, 0, used); + backtracking(nums, 0); return result; } }; From 493d6ba16a1a2359ebfe110c338818de74632476 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sun, 20 Mar 2022 20:54:32 +0800 Subject: [PATCH 194/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880077.?= =?UTF-8?q?=E7=BB=84=E5=90=88=E4=BC=98=E5=8C=96.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- node_modules/.yarn-integrity | 10 ++++++++++ problems/0077.组合优化.md | 22 ++++++++++++++++++++++ yarn.lock | 4 ++++ 3 files changed, 36 insertions(+) create mode 100644 node_modules/.yarn-integrity create mode 100644 yarn.lock diff --git a/node_modules/.yarn-integrity b/node_modules/.yarn-integrity new file mode 100644 index 00000000..29e4357c --- /dev/null +++ b/node_modules/.yarn-integrity @@ -0,0 +1,10 @@ +{ + "systemParams": "win32-x64-83", + "modulesFolders": [], + "flags": [], + "linkedModules": [], + "topLevelPatterns": [], + "lockfileEntries": {}, + "files": [], + "artifacts": {} +} \ No newline at end of file diff --git a/problems/0077.组合优化.md b/problems/0077.组合优化.md index 81b4304c..94608ec1 100644 --- a/problems/0077.组合优化.md +++ b/problems/0077.组合优化.md @@ -240,7 +240,29 @@ var combine = function(n, k) { }; ``` +TypeScript: + +```typescript +function combine(n: number, k: number): number[][] { + let resArr: number[][] = []; + function backTracking(n: number, k: number, startIndex: number, tempArr: number[]): void { + if (tempArr.length === k) { + resArr.push(tempArr.slice()); + return; + } + for (let i = startIndex; i <= n - k + 1 + tempArr.length; i++) { + tempArr.push(i); + backTracking(n, k, i + 1, tempArr); + tempArr.pop(); + } + } + backTracking(n, k, 1, []); + return resArr; +}; +``` + C: + ```c int* path; int pathTop; diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 00000000..3ff608ae --- /dev/null +++ b/yarn.lock @@ -0,0 +1,4 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + From 8ad12370b69a4b37f3baffe8e1102e82c394ac4a Mon Sep 17 00:00:00 2001 From: "Neil.Liu" <88214924@qq.com> Date: Sun, 20 Mar 2022 22:32:34 +0800 Subject: [PATCH 195/328] =?UTF-8?q?Update=200332.=E9=87=8D=E6=96=B0?= =?UTF-8?q?=E5=AE=89=E6=8E=92=E8=A1=8C=E7=A8=8B.md=20Go=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0332.重新安排行程.md | 58 +++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/problems/0332.重新安排行程.md b/problems/0332.重新安排行程.md index 01f81c4d..041a7f03 100644 --- a/problems/0332.重新安排行程.md +++ b/problems/0332.重新安排行程.md @@ -342,6 +342,64 @@ class Solution: return path ``` +### Go +```go +type pair struct { + target string + visited bool +} +type pairs []*pair + +func (p pairs) Len() int { + return len(p) +} +func (p pairs) Swap(i, j int) { + p[i], p[j] = p[j], p[i] +} +func (p pairs) Less(i, j int) bool { + return p[i].target < p[j].target +} + +func findItinerary(tickets [][]string) []string { + result := []string{} + // map[出发机场] pair{目的地,是否被访问过} + targets := make(map[string]pairs) + for _, ticket := range tickets { + if targets[ticket[0]] == nil { + targets[ticket[0]] = make(pairs, 0) + } + targets[ticket[0]] = append(targets[ticket[0]], &pair{target: ticket[1], visited: false}) + } + for k, _ := range targets { + sort.Sort(targets[k]) + } + result = append(result, "JFK") + var backtracking func() bool + backtracking = func() bool { + if len(tickets)+1 == len(result) { + return true + } + // 取出起飞航班对应的目的地 + for _, pair := range targets[result[len(result)-1]] { + if pair.visited == false { + result = append(result, pair.target) + pair.visited = true + if backtracking() { + return true + } + result = result[:len(result)-1] + pair.visited = false + } + } + return false + } + + backtracking() + + return result +} +``` + ### C语言 ```C From 21f6068e2e3fd0c3d40971df3c0ea3b35a9ec248 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sun, 20 Mar 2022 23:24:57 +0800 Subject: [PATCH 196/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880216.?= =?UTF-8?q?=E7=BB=84=E5=90=88=E6=80=BB=E5=92=8CIII.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0216.组合总和III.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/problems/0216.组合总和III.md b/problems/0216.组合总和III.md index 0bb42192..32b1347e 100644 --- a/problems/0216.组合总和III.md +++ b/problems/0216.组合总和III.md @@ -396,6 +396,30 @@ var combinationSum3 = function(k, n) { }; ``` +## TypeScript + +```typescript +function combinationSum3(k: number, n: number): number[][] { + const resArr: number[][] = []; + function backTracking(k: number, n: number, sum: number, startIndex: number, tempArr: number[]): void { + if (sum > n) return; + if (tempArr.length === k) { + if (sum === n) { + resArr.push(tempArr.slice()); + } + return; + } + for (let i = startIndex; i <= 9 - (k - tempArr.length) + 1; i++) { + tempArr.push(i); + backTracking(k, n, sum + i, i + 1, tempArr); + tempArr.pop(); + } + } + backTracking(k, n, 0, 1, []); + return resArr; +}; +``` + ## C ```c From 82feee15424aa110e5d30b333ea3c0a83245b3c2 Mon Sep 17 00:00:00 2001 From: dcj_hp <294487055@qq.com> Date: Mon, 21 Mar 2022 12:04:13 +0800 Subject: [PATCH 197/328] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20647.=E5=9B=9E?= =?UTF-8?q?=E6=96=87=E5=AD=90=E4=B8=B2=20=E6=96=87=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0647.回文子串.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/0647.回文子串.md b/problems/0647.回文子串.md index d9928b8f..739146f1 100644 --- a/problems/0647.回文子串.md +++ b/problems/0647.回文子串.md @@ -54,7 +54,7 @@ 当s[i]与s[j]相等时,这就复杂一些了,有如下三种情况 * 情况一:下标i 与 j相同,同一个字符例如a,当然是回文子串 -* 情况二:下标i 与 j相差为1,例如aa,也是文子串 +* 情况二:下标i 与 j相差为1,例如aa,也是回文子串 * 情况三:下标:i 与 j相差大于1的时候,例如cabac,此时s[i]与s[j]已经相同了,我们看i到j区间是不是回文子串就看aba是不是回文就可以了,那么aba的区间就是 i+1 与 j-1区间,这个区间是不是回文就看dp[i + 1][j - 1]是否为true。 以上三种情况分析完了,那么递归公式如下: From c408f7babc6f944cde16e51916c2741c5ab8a43e Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Tue, 22 Mar 2022 09:29:32 +0800 Subject: [PATCH 198/328] Update --- problems/0042.接雨水.md | 10 +++++----- problems/0077.组合.md | 4 ++-- problems/0337.打家劫舍III.md | 10 +++++----- problems/0416.分割等和子集.md | 10 ++++------ problems/前序/ACM模式如何构建二叉树.md | 9 --------- .../BAT级别技术面试流程和注意事项都在这里了.md | 9 +-------- .../On的算法居然超时了,此时的n究竟是多大?.md | 18 ++++++----------- problems/前序/上海互联网公司总结.md | 8 -------- .../什么是核心代码模式,什么又是ACM模式?.md | 8 +------- problems/前序/代码风格.md | 17 +--------------- .../关于时间复杂度,你不知道的都在这里!.md | 8 +------- .../前序/关于空间复杂度,可能有几个疑问?.md | 8 -------- ...了这么多题,你了解自己代码的内存消耗么?.md | 9 +-------- .../前序/力扣上的代码想在本地编译运行?.md | 8 +------- problems/前序/北京互联网公司总结.md | 11 ++-------- problems/前序/广州互联网公司总结.md | 10 ++-------- problems/前序/成都互联网公司总结.md | 12 ++--------- problems/前序/杭州互联网公司总结.md | 11 ++-------- problems/前序/深圳互联网公司总结.md | 10 ++-------- problems/前序/程序员写文档工具.md | 12 +++-------- problems/前序/程序员简历.md | 13 +----------- .../前序/递归算法的时间与空间复杂度分析.md | 8 -------- ...一道面试题目,讲一讲递归算法的时间复杂度!.md | 10 ---------- problems/回溯总结.md | 20 +++++++++---------- problems/知识星球精选/HR特意刁难非科班.md | 4 ++-- problems/知识星球精选/HR面注意事项.md | 6 +++--- problems/知识星球精选/offer对比-决赛圈.md | 4 ++-- .../知识星球精选/offer总决赛,何去何从.md | 4 ++-- problems/知识星球精选/offer的选择.md | 4 ++-- problems/知识星球精选/不一样的七夕.md | 4 ++-- problems/知识星球精选/不喜欢写代码怎么办.md | 2 +- problems/知识星球精选/不少录友想放弃秋招.md | 8 ++++---- problems/知识星球精选/专业技能可以这么写.md | 4 ++-- .../知识星球精选/入职后担心代码能力跟不上.md | 4 ++-- problems/知识星球精选/关于实习大家的疑问.md | 4 ++-- problems/知识星球精选/关于提前批的一些建议.md | 4 ++-- problems/知识星球精选/写简历的一些问题.md | 4 ++-- .../知识星球精选/初入大三选择考研VS工作.md | 4 ++-- problems/知识星球精选/刷力扣用不用库函数.md | 4 ++-- problems/知识星球精选/刷题攻略要刷两遍.md | 4 ++-- problems/知识星球精选/博士转行计算机.md | 4 ++-- problems/知识星球精选/合适自己的就是最好的.md | 6 +++--- problems/知识星球精选/备战2022届秋招.md | 4 ++-- problems/知识星球精选/大厂新人培养体系.md | 4 ++-- problems/知识星球精选/天下乌鸦一般黑.md | 4 ++-- .../知识星球精选/如何权衡实习与秋招复习.md | 4 ++-- problems/知识星球精选/客三消.md | 6 +++--- .../知识星球精选/技术不好如何选择技术方向.md | 4 ++-- problems/知识星球精选/提前批已经开始了.md | 4 ++-- .../知识星球精选/秋招下半场依然没offer.md | 12 +++++------ problems/知识星球精选/秋招开奖.md | 4 ++-- problems/知识星球精选/秋招总结1.md | 4 ++-- problems/知识星球精选/秋招总结2.md | 4 ++-- problems/知识星球精选/秋招总结3.md | 4 ++-- problems/知识星球精选/秋招的上半场.md | 4 ++-- .../知识星球精选/秋招进行中的迷茫与焦虑.md | 4 ++-- problems/知识星球精选/英语到底重不重要.md | 4 ++-- problems/知识星球精选/要不要考研.md | 4 ++-- problems/知识星球精选/逼签.md | 2 +- problems/知识星球精选/非科班2021秋招总结.md | 4 ++-- problems/知识星球精选/非科班的困扰.md | 4 ++-- problems/知识星球精选/面试中发散性问题.md | 4 ++-- 62 files changed, 135 insertions(+), 284 deletions(-) diff --git a/problems/0042.接雨水.md b/problems/0042.接雨水.md index 55f80a54..75152eb7 100644 --- a/problems/0042.接雨水.md +++ b/problems/0042.接雨水.md @@ -365,7 +365,7 @@ public: ## 其他语言版本 -Java: +### Java: 双指针法 ```java @@ -468,7 +468,7 @@ class Solution { } ``` -Python: +### Python: 双指针法 ```python3 @@ -575,7 +575,7 @@ class Solution: ``` -Go: +### Go ```go func trap(height []int) int { @@ -642,7 +642,7 @@ func min(a,b int)int{ -JavaScript: +### JavaScript: ```javascript //双指针 @@ -744,7 +744,7 @@ var trap = function(height) { }; ``` -C: +### C: 一种更简便的双指针方法: diff --git a/problems/0077.组合.md b/problems/0077.组合.md index 2bd7a287..e582daf6 100644 --- a/problems/0077.组合.md +++ b/problems/0077.组合.md @@ -423,8 +423,8 @@ class Solution: if len(path) == k: res.append(path[:]) return - for i in range(startIndex,n - (k - len(path)) + 2): #优化的地方 - path.append(i) #处理节点 + for i in range(startIndex,n-(k-len(path))+2): #优化的地方 + path.append(i) #处理节点 backtrack(n,k,i+1) #递归 path.pop() #回溯,撤销处理的节点 backtrack(n,k,1) diff --git a/problems/0337.打家劫舍III.md b/problems/0337.打家劫舍III.md index ecd31d1b..a4d8f6b2 100644 --- a/problems/0337.打家劫舍III.md +++ b/problems/0337.打家劫舍III.md @@ -216,7 +216,7 @@ public: ## 其他语言版本 -Java: +### Java ```Java class Solution { // 1.递归去偷,超时 @@ -284,7 +284,7 @@ class Solution { } ``` -Python: +### Python > 暴力递归 @@ -367,7 +367,7 @@ class Solution: return (val1, val2) ``` -Go: +### Go 动态规划 @@ -402,7 +402,7 @@ func robTree(cur *TreeNode) []int { } ``` -JavaScript: +### JavaScript > 动态规划 @@ -429,7 +429,7 @@ const rob = root => { }; ``` -Go: +### Go ```go // 打家劫舍Ⅲ 动态规划 // 时间复杂度O(n) 空间复杂度O(logn) diff --git a/problems/0416.分割等和子集.md b/problems/0416.分割等和子集.md index 9da1f8d5..4b26d188 100644 --- a/problems/0416.分割等和子集.md +++ b/problems/0416.分割等和子集.md @@ -127,9 +127,9 @@ for(int i = 0; i < nums.size(); i++) { 5. 举例推导dp数组 -dp[i]的数值一定是小于等于i的。 +dp[j]的数值一定是小于等于j的。 -**如果dp[i] == i 说明,集合中的子集总和正好可以凑成总和i,理解这一点很重要。** +**如果dp[j] == j 说明,集合中的子集总和正好可以凑成总和j,理解这一点很重要。** 用例1,输入[1,5,11,5] 为例,如图: @@ -168,8 +168,8 @@ public: }; ``` -* 时间复杂度:$O(n^2)$ -* 空间复杂度:$O(n)$,虽然dp数组大小为一个常数,但是大常数 +* 时间复杂度:O(n^2) +* 空间复杂度:O(n),虽然dp数组大小为一个常数,但是大常数 ## 总结 @@ -180,8 +180,6 @@ public: 看代码的话,就可以发现,基本就是按照01背包的写法来的。 - - ## 其他语言版本 diff --git a/problems/前序/ACM模式如何构建二叉树.md b/problems/前序/ACM模式如何构建二叉树.md index 28c4b6f7..bd2e9780 100644 --- a/problems/前序/ACM模式如何构建二叉树.md +++ b/problems/前序/ACM模式如何构建二叉树.md @@ -1,13 +1,4 @@ -

- - - - -

-

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

- - # 力扣上如何自己构造二叉树输入用例? 经常有录友问,二叉树的题目中输入用例在ACM模式下应该怎么构造呢? diff --git a/problems/前序/BAT级别技术面试流程和注意事项都在这里了.md b/problems/前序/BAT级别技术面试流程和注意事项都在这里了.md index 6678860d..27940f1b 100644 --- a/problems/前序/BAT级别技术面试流程和注意事项都在这里了.md +++ b/problems/前序/BAT级别技术面试流程和注意事项都在这里了.md @@ -1,12 +1,5 @@ -

- - - - -

-

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

- +# 大厂技术面试流程和注意事项 大型互联网企业一般通过几轮技术面试来考察大家的各项能力,一般流程如下: diff --git a/problems/前序/On的算法居然超时了,此时的n究竟是多大?.md b/problems/前序/On的算法居然超时了,此时的n究竟是多大?.md index 5257ceb9..20a48e19 100644 --- a/problems/前序/On的算法居然超时了,此时的n究竟是多大?.md +++ b/problems/前序/On的算法居然超时了,此时的n究竟是多大?.md @@ -1,18 +1,12 @@ -

- - - - -

-

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+# On的算法居然超时了,此时的n究竟是多大? 一些同学可能对计算机运行的速度还没有概念,就是感觉计算机运行速度应该会很快,那么在leetcode上做算法题目的时候为什么会超时呢? 计算机究竟1s可以执行多少次操作呢? 接下来探讨一下这个问题。 -# 超时是怎么回事 +## 超时是怎么回事 ![程序超时](https://img-blog.csdnimg.cn/20200729112716117.png) @@ -24,7 +18,7 @@ 如果n的规模已经足够让$O(n)$的算法运行时间超过了1s,就应该考虑log(n)的解法了。 -# 从硬件配置看计算机的性能 +## 从硬件配置看计算机的性能 计算机的运算速度主要看CPU的配置,以2015年MacPro为例,CPU配置:2.7 GHz Dual-Core Intel Core i5 。 @@ -43,7 +37,7 @@ 所以我们的程序在计算机上究竟1s真正能执行多少次操作呢? -# 做个测试实验 +## 做个测试实验 在写测试程序测1s内处理多大数量级数据的时候,有三点需要注意: @@ -152,7 +146,7 @@ $O(n\log n)$的算法,1s内大概计算机可以运行 2 * (10^7)次计算, 至于 $O(\log n)$ 和 $O(n^3)$ 等等这些时间复杂度在1s内可以处理的多大的数据规模,大家可以自己写一写代码去测一下了。 -# 完整测试代码 +## 完整测试代码 ```CPP #include @@ -264,7 +258,7 @@ public class TimeComplexity { } ``` -# 总结 +## 总结 本文详细分析了在leetcode上做题程序为什么会有超时,以及从硬件配置上大体知道CPU的执行速度,然后亲自做一个实验来看看$O(n)$的算法,跑一秒钟,这个n究竟是做大,最后给出不同时间复杂度,一秒内可以运算出来的n的大小。 diff --git a/problems/前序/上海互联网公司总结.md b/problems/前序/上海互联网公司总结.md index ffcbe77b..6309ef58 100644 --- a/problems/前序/上海互联网公司总结.md +++ b/problems/前序/上海互联网公司总结.md @@ -1,11 +1,3 @@ -

- - - - -

-

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

- # 上海互联网公司总结 diff --git a/problems/前序/什么是核心代码模式,什么又是ACM模式?.md b/problems/前序/什么是核心代码模式,什么又是ACM模式?.md index 54c5b6ec..0b9d230f 100644 --- a/problems/前序/什么是核心代码模式,什么又是ACM模式?.md +++ b/problems/前序/什么是核心代码模式,什么又是ACM模式?.md @@ -1,11 +1,5 @@ -

- - - - -

-

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+# 什么是核心代码模式,什么又是ACM模式? 现在很多企业都在牛客上进行面试,**很多录友和我反馈说搞不懂牛客上输入代码的ACM模式**。 diff --git a/problems/前序/代码风格.md b/problems/前序/代码风格.md index b48665e5..4ab94a51 100644 --- a/problems/前序/代码风格.md +++ b/problems/前序/代码风格.md @@ -1,13 +1,3 @@ -

- - - - -

-

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

- - - # 看了这么多代码,谈一谈代码风格! @@ -142,11 +132,6 @@ Google规范是 大括号和 控制语句保持同一行的,我个人也很认 就酱,以后我还会陆续分享,关于代码,求职,学习工作之类的内容。 - - - ----------------------- -* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) -* B站视频:[代码随想录](https://space.bilibili.com/525438321) -* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) +
diff --git a/problems/前序/关于时间复杂度,你不知道的都在这里!.md b/problems/前序/关于时间复杂度,你不知道的都在这里!.md index 478b82e4..b2acb7dd 100644 --- a/problems/前序/关于时间复杂度,你不知道的都在这里!.md +++ b/problems/前序/关于时间复杂度,你不知道的都在这里!.md @@ -1,11 +1,5 @@ -

- - - - -

-

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+# 关于时间复杂度,你不知道的都在这里! 相信每一位录友都接触过时间复杂度,但又对时间复杂度的认识处于一种朦胧的状态,所以是时候对时间复杂度来一个深度的剖析了。 diff --git a/problems/前序/关于空间复杂度,可能有几个疑问?.md b/problems/前序/关于空间复杂度,可能有几个疑问?.md index d49b42a2..162dfe96 100644 --- a/problems/前序/关于空间复杂度,可能有几个疑问?.md +++ b/problems/前序/关于空间复杂度,可能有几个疑问?.md @@ -1,11 +1,3 @@ -

- - - - -

-

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

- # 空间复杂度分析 diff --git a/problems/前序/刷了这么多题,你了解自己代码的内存消耗么?.md b/problems/前序/刷了这么多题,你了解自己代码的内存消耗么?.md index 0364fc8b..f4aa4b6e 100644 --- a/problems/前序/刷了这么多题,你了解自己代码的内存消耗么?.md +++ b/problems/前序/刷了这么多题,你了解自己代码的内存消耗么?.md @@ -1,13 +1,6 @@ -

- - - - -

-

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

- +# 刷了这么多题,你了解自己代码的内存消耗么? 理解代码的内存消耗,最关键是要知道自己所用编程语言的内存管理。 diff --git a/problems/前序/力扣上的代码想在本地编译运行?.md b/problems/前序/力扣上的代码想在本地编译运行?.md index dca6eec3..bcef3886 100644 --- a/problems/前序/力扣上的代码想在本地编译运行?.md +++ b/problems/前序/力扣上的代码想在本地编译运行?.md @@ -1,10 +1,4 @@ -

- - - - -

-

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+# 力扣上的代码想在本地编译运行? 很多录友都问过我一个问题,就是力扣上的代码如何在本地编译运行? diff --git a/problems/前序/北京互联网公司总结.md b/problems/前序/北京互联网公司总结.md index 02a877b7..a10cab06 100644 --- a/problems/前序/北京互联网公司总结.md +++ b/problems/前序/北京互联网公司总结.md @@ -1,15 +1,8 @@ -

- - - - -

+# 北京互联网公司总结 +

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

- -# 北京互联网公司总结 - **个人总结难免有所疏忽,欢迎大家补充,公司好坏没有排名哈!** 如果要在北京找工作,这份list可以作为一个大纲,寻找自己合适的公司。 diff --git a/problems/前序/广州互联网公司总结.md b/problems/前序/广州互联网公司总结.md index e83fcd2b..b8b1641b 100644 --- a/problems/前序/广州互联网公司总结.md +++ b/problems/前序/广州互联网公司总结.md @@ -1,14 +1,8 @@ -

- - - - -

+# 广州互联网公司总结 +

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

-# 广州互联网公司总结 - **个人总结难免有所疏忽,欢迎大家补充,公司好坏没有排名哈!** ## 一线互联网 diff --git a/problems/前序/成都互联网公司总结.md b/problems/前序/成都互联网公司总结.md index 7964f23c..f6a575f6 100644 --- a/problems/前序/成都互联网公司总结.md +++ b/problems/前序/成都互联网公司总结.md @@ -1,15 +1,7 @@ -

- - - - -

-

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

- - - # 成都互联网公司总结 +

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ **排名不分先后,个人总结难免有所疏漏,欢迎补充!** diff --git a/problems/前序/杭州互联网公司总结.md b/problems/前序/杭州互联网公司总结.md index 029ee380..6154cfe5 100644 --- a/problems/前序/杭州互联网公司总结.md +++ b/problems/前序/杭州互联网公司总结.md @@ -1,15 +1,8 @@ -

- - - - -

+# 杭州互联网公司总结 +

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

- -# 杭州互联网公司总结 - **个人总结难免有所疏忽,欢迎大家补充,公司好坏没有排名哈!** ## 一线互联网 diff --git a/problems/前序/深圳互联网公司总结.md b/problems/前序/深圳互联网公司总结.md index 61bd52e8..3d548abb 100644 --- a/problems/前序/深圳互联网公司总结.md +++ b/problems/前序/深圳互联网公司总结.md @@ -1,14 +1,8 @@ -

- - - - -

-

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

- # 深圳互联网公司总结 +

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

+ **个人总结难免有所疏忽,欢迎大家补充,公司好坏没有排名哈!** ## 一线互联网 diff --git a/problems/前序/程序员写文档工具.md b/problems/前序/程序员写文档工具.md index 5504ae7a..a2f6ee3b 100644 --- a/problems/前序/程序员写文档工具.md +++ b/problems/前序/程序员写文档工具.md @@ -1,16 +1,10 @@ -

- - - - -

+ +# 程序员应该用什么用具来写文档? +

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

- -# 程序员应该用什么用具来写文档? - Carl平时写东西,都是统一使用markdown,包括题解啊,笔记啊,所以这里给大家安利一波markdown对程序员的重要性! 程序员为什么要学习markdown呢? diff --git a/problems/前序/程序员简历.md b/problems/前序/程序员简历.md index 522fc5f7..e64f547a 100644 --- a/problems/前序/程序员简历.md +++ b/problems/前序/程序员简历.md @@ -1,16 +1,5 @@ -

- - - - -

-

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

- - - # 程序员的简历应该这么写!!(附简历模板) - Carl校招社招都拿过大厂的offer,同时也看过很多应聘者的简历,这里把自己总结的简历技巧以及常见问题给大家梳理一下。 ## 简历篇幅 @@ -116,7 +105,7 @@ Carl校招社招都拿过大厂的offer,同时也看过很多应聘者的简 ![简历模板](https://img-blog.csdnimg.cn/20200803175538158.png) -这里是简历模板中Markdown的代码:https://github.com/youngyangyang04/Markdown-Resume-Template ,可以fork到自己Github仓库上,按照这个模板来修改自己的简历。 +这里是简历模板中Markdown的代码:[https://github.com/youngyangyang04/Markdown-Resume-Template](https://github.com/youngyangyang04/Markdown-Resume-Template) ,可以fork到自己Github仓库上,按照这个模板来修改自己的简历。 **Word版本的简历,大家可以在公众号「代码随想录」后台回复:简历模板,就可以获取!** diff --git a/problems/前序/递归算法的时间与空间复杂度分析.md b/problems/前序/递归算法的时间与空间复杂度分析.md index 914cccfd..3c0d219c 100644 --- a/problems/前序/递归算法的时间与空间复杂度分析.md +++ b/problems/前序/递归算法的时间与空间复杂度分析.md @@ -1,11 +1,3 @@ -

- - - - -

-

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

- # 递归算法的时间与空间复杂度分析! diff --git a/problems/前序/通过一道面试题目,讲一讲递归算法的时间复杂度!.md b/problems/前序/通过一道面试题目,讲一讲递归算法的时间复杂度!.md index 849a025d..12af4dd8 100644 --- a/problems/前序/通过一道面试题目,讲一讲递归算法的时间复杂度!.md +++ b/problems/前序/通过一道面试题目,讲一讲递归算法的时间复杂度!.md @@ -1,13 +1,3 @@ -

- - - - -

-

欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

- - - # 通过一道面试题目,讲一讲递归算法的时间复杂度! diff --git a/problems/回溯总结.md b/problems/回溯总结.md index 671e0a4e..bd0db575 100644 --- a/problems/回溯总结.md +++ b/problems/回溯总结.md @@ -380,24 +380,24 @@ used数组可是全局变量,每层与每层之间公用一个used数组,所 以下在计算空间复杂度的时候我都把系统栈(不是数据结构里的栈)所占空间算进去。 子集问题分析: -* 时间复杂度:$O(2^n)$,因为每一个元素的状态无外乎取与不取,所以时间复杂度为$O(2^n)$ -* 空间复杂度:$O(n)$,递归深度为n,所以系统栈所用空间为$O(n)$,每一层递归所用的空间都是常数级别,注意代码里的result和path都是全局变量,就算是放在参数里,传的也是引用,并不会新申请内存空间,最终空间复杂度为$O(n)$ +* 时间复杂度:O(2^n),因为每一个元素的状态无外乎取与不取,所以时间复杂度为$O(2^n)$ +* 空间复杂度:O(n),递归深度为n,所以系统栈所用空间为$O(n)$,每一层递归所用的空间都是常数级别,注意代码里的result和path都是全局变量,就算是放在参数里,传的也是引用,并不会新申请内存空间,最终空间复杂度为$O(n)$ 排列问题分析: -* 时间复杂度:$O(n!)$,这个可以从排列的树形图中很明显发现,每一层节点为n,第二层每一个分支都延伸了n-1个分支,再往下又是n-2个分支,所以一直到叶子节点一共就是 n * n-1 * n-2 * ..... 1 = n!。 -* 空间复杂度:$O(n)$,和子集问题同理。 +* 时间复杂度:O(n!),这个可以从排列的树形图中很明显发现,每一层节点为n,第二层每一个分支都延伸了n-1个分支,再往下又是n-2个分支,所以一直到叶子节点一共就是 n * n-1 * n-2 * ..... 1 = n!。 +* 空间复杂度:O(n),和子集问题同理。 组合问题分析: -* 时间复杂度:$O(2^n)$,组合问题其实就是一种子集的问题,所以组合问题最坏的情况,也不会超过子集问题的时间复杂度。 -* 空间复杂度:$O(n)$,和子集问题同理。 +* 时间复杂度:O(2^n),组合问题其实就是一种子集的问题,所以组合问题最坏的情况,也不会超过子集问题的时间复杂度。 +* 空间复杂度:O(n),和子集问题同理。 N皇后问题分析: -* 时间复杂度:$O(n!)$ ,其实如果看树形图的话,直觉上是$O(n^n)$,但皇后之间不能见面所以在搜索的过程中是有剪枝的,最差也就是O(n!),n!表示n * (n-1) * .... * 1。 -* 空间复杂度:$O(n)$,和子集问题同理。 +* 时间复杂度:O(n!) ,其实如果看树形图的话,直觉上是$O(n^n)$,但皇后之间不能见面所以在搜索的过程中是有剪枝的,最差也就是O(n!),n!表示n * (n-1) * .... * 1。 +* 空间复杂度:O(n),和子集问题同理。 解数独问题分析: -* 时间复杂度:$O(9^m)$ , m是'.'的数目。 -* 空间复杂度:$O(n^2)$,递归的深度是n^2 +* 时间复杂度:O(9^m) , m是'.'的数目。 +* 空间复杂度:O(n^2),递归的深度是n^2 **一般说道回溯算法的复杂度,都说是指数级别的时间复杂度,这也算是一个概括吧!** diff --git a/problems/知识星球精选/HR特意刁难非科班.md b/problems/知识星球精选/HR特意刁难非科班.md index c59debf2..d5d39fe3 100644 --- a/problems/知识星球精选/HR特意刁难非科班.md +++ b/problems/知识星球精选/HR特意刁难非科班.md @@ -1,6 +1,6 @@

- + @@ -8,7 +8,7 @@ 不少录友都是非科班转程序员,或者进军互联网的,但有一些HR在HR面的时候特意刁难大家。 -正如[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里,这位录友所遭受的情景。 +正如[知识星球](https://programmercarl.com/other/kstar.html)里,这位录友所遭受的情景。 ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211006230202.png) diff --git a/problems/知识星球精选/HR面注意事项.md b/problems/知识星球精选/HR面注意事项.md index 6a0a26f1..5dba672c 100644 --- a/problems/知识星球精选/HR面注意事项.md +++ b/problems/知识星球精选/HR面注意事项.md @@ -1,12 +1,12 @@

- + # HR面注意事项 -[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里已经有一些录友开始准备HR面。 +[知识星球](https://programmercarl.com/other/kstar.html)里已经有一些录友开始准备HR面。 ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210807155107.png) @@ -86,4 +86,4 @@ HR朋友的回答是:你不说真相,我会认为你可能对技术有追求 --------------- -加入「代码随想录」知识星球,[点击这里](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) +加入「代码随想录」知识星球,[点击这里](https://programmercarl.com/other/kstar.html) diff --git a/problems/知识星球精选/offer对比-决赛圈.md b/problems/知识星球精选/offer对比-决赛圈.md index 1f91730f..081ae5ec 100644 --- a/problems/知识星球精选/offer对比-决赛圈.md +++ b/problems/知识星球精选/offer对比-决赛圈.md @@ -1,5 +1,5 @@

- + @@ -7,7 +7,7 @@ 秋招已经结束了,该开奖的差不多都陆续开奖了,很多录友的也进入了offer决赛圈。 -我每天都在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里,回答十几个offer对比的问题,我也是结合自己过来人的经验给大家做做分析,我也选几个案例,在公众号上也给大家分享一下,希望对大家有所启发。 +我每天都在[知识星球](https://programmercarl.com/other/kstar.html)里,回答十几个offer对比的问题,我也是结合自己过来人的经验给大家做做分析,我也选几个案例,在公众号上也给大家分享一下,希望对大家有所启发。 以下是知识星球里的部分问答: diff --git a/problems/知识星球精选/offer总决赛,何去何从.md b/problems/知识星球精选/offer总决赛,何去何从.md index 01745ae3..e22c5d4a 100644 --- a/problems/知识星球精选/offer总决赛,何去何从.md +++ b/problems/知识星球精选/offer总决赛,何去何从.md @@ -1,12 +1,12 @@

- + # offer总决赛,何去何从! -最近在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)上,给至少300位录友做了offer选择,准对大家的情况,结合我的经验做一做分析。 +最近在[知识星球](https://programmercarl.com/other/kstar.html)上,给至少300位录友做了offer选择,准对大家的情况,结合我的经验做一做分析。 希望可以给大家带来不一样的分析视角,帮大家少走弯路。 diff --git a/problems/知识星球精选/offer的选择.md b/problems/知识星球精选/offer的选择.md index b9b40dea..106bc5f8 100644 --- a/problems/知识星球精选/offer的选择.md +++ b/problems/知识星球精选/offer的选择.md @@ -1,6 +1,6 @@

- + @@ -10,7 +10,7 @@ 不过大部分同学应该拿到的是 两个大厂offer,或者说拿到两个小厂offer,还要考虑岗位,业务,公司前景,那么就要纠结如何选择了。 -在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里,我已经给很多录友提供了选择offer的建议,这里也分享出来,希望对大家在选择offer上有所启发。 +在[知识星球](https://programmercarl.com/other/kstar.html)里,我已经给很多录友提供了选择offer的建议,这里也分享出来,希望对大家在选择offer上有所启发。 ## 保研与工作 diff --git a/problems/知识星球精选/不一样的七夕.md b/problems/知识星球精选/不一样的七夕.md index a670e078..40d15ecd 100644 --- a/problems/知识星球精选/不一样的七夕.md +++ b/problems/知识星球精选/不一样的七夕.md @@ -1,11 +1,11 @@

- + # 特殊的七夕 -昨天在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)发了一个状态: +昨天在[知识星球](https://programmercarl.com/other/kstar.html)发了一个状态: ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210815084126.png) diff --git a/problems/知识星球精选/不喜欢写代码怎么办.md b/problems/知识星球精选/不喜欢写代码怎么办.md index 9bc624bb..84d372f0 100644 --- a/problems/知识星球精选/不喜欢写代码怎么办.md +++ b/problems/知识星球精选/不喜欢写代码怎么办.md @@ -1,7 +1,7 @@ # 看到代码就抵触!怎么办? -最近在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里,看到了不少录友,其实是不喜欢写代码,看到 哪些八股文都是很抵触的。 +最近在[知识星球](https://programmercarl.com/other/kstar.html)里,看到了不少录友,其实是不喜欢写代码,看到 哪些八股文都是很抵触的。 其实是一个普遍现象,我在星球里分享了一下,我对这一情况的一些想法。 diff --git a/problems/知识星球精选/不少录友想放弃秋招.md b/problems/知识星球精选/不少录友想放弃秋招.md index 721a9313..81c99503 100644 --- a/problems/知识星球精选/不少录友想放弃秋招.md +++ b/problems/知识星球精选/不少录友想放弃秋招.md @@ -1,5 +1,5 @@

- + @@ -7,7 +7,7 @@ 马上就要九月份了,互联网大厂的秋招的序幕早已拉开。 -发现[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里有一部分录友想放弃秋招,直接准备明年的春招,估计关注公众号的录友也有不少有这种想法的。 +发现[知识星球](https://programmercarl.com/other/kstar.html)里有一部分录友想放弃秋招,直接准备明年的春招,估计关注公众号的录友也有不少有这种想法的。 ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210813103515.png) @@ -50,7 +50,7 @@ 所以也给明年找工作的录友们(2023届)提一个醒,现在就要系统性的准备起来了,因为明年春季实习招聘 是一个很好的进大厂的机会,剩下的时间也不是很多了。 -来看看[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里,一位准大三的录友准备的情况 +来看看[知识星球](https://programmercarl.com/other/kstar.html)里,一位准大三的录友准备的情况 ![](https://code-thinking-1253855093.file.myqcloud.com/pics/星球大三.jpg) @@ -60,7 +60,7 @@ **我已经预感到 这两位 等到秋招的时候就是稳稳的offer收割机**。 -[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)还有很多已经开始提前准备,或者看了 星球发文状态就开始着手准备的录友了。 +[知识星球](https://programmercarl.com/other/kstar.html)还有很多已经开始提前准备,或者看了 星球发文状态就开始着手准备的录友了。 所以 **所谓的大牛,都是 很早就规划自己要学的东西,很早就开始向过来人请教应该如何找工作,很早就知道自己应该学哪些技术,看哪些书, 这样等到找工作的时候,才是剑锋出鞘的时候**。 diff --git a/problems/知识星球精选/专业技能可以这么写.md b/problems/知识星球精选/专业技能可以这么写.md index dd616713..a1b7ba3a 100644 --- a/problems/知识星球精选/专业技能可以这么写.md +++ b/problems/知识星球精选/专业技能可以这么写.md @@ -1,5 +1,5 @@

- + @@ -8,7 +8,7 @@ # 你简历里的「专业技能」写的够专业么? -其实我几乎每天都要看一些简历,有一些写的不错的,我都会在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里分享一下。 +其实我几乎每天都要看一些简历,有一些写的不错的,我都会在[知识星球](https://programmercarl.com/other/kstar.html)里分享一下。 ![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210626172902.png) 这次呢,我再专门说一说简历中的【专业技能】这一栏应该怎么写。 diff --git a/problems/知识星球精选/入职后担心代码能力跟不上.md b/problems/知识星球精选/入职后担心代码能力跟不上.md index c2704525..58b8c32c 100644 --- a/problems/知识星球精选/入职后担心代码能力跟不上.md +++ b/problems/知识星球精选/入职后担心代码能力跟不上.md @@ -1,12 +1,12 @@

- + # 入职后担心代码能力跟不上 -在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)上,很多录友已经担心自己去了公司工作以后,代码能力跟不上,会压力很大。 +在[知识星球](https://programmercarl.com/other/kstar.html)上,很多录友已经担心自己去了公司工作以后,代码能力跟不上,会压力很大。 ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211031202952.png) diff --git a/problems/知识星球精选/关于实习大家的疑问.md b/problems/知识星球精选/关于实习大家的疑问.md index 5d4e695b..88de4436 100644 --- a/problems/知识星球精选/关于实习大家的疑问.md +++ b/problems/知识星球精选/关于实习大家的疑问.md @@ -1,11 +1,11 @@

- + # 关于实习,大家可能有点迷茫! -我在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里回答了很多关于实习相关的问题,其实很多录友可能都有这么样的疑问,主要关于实习的问题有如下四点: +我在[知识星球](https://programmercarl.com/other/kstar.html)里回答了很多关于实习相关的问题,其实很多录友可能都有这么样的疑问,主要关于实习的问题有如下四点: * 秋招什么时候开始准备 * 要不要准备实习 diff --git a/problems/知识星球精选/关于提前批的一些建议.md b/problems/知识星球精选/关于提前批的一些建议.md index 415a8b2f..6a316bd2 100644 --- a/problems/知识星球精选/关于提前批的一些建议.md +++ b/problems/知识星球精选/关于提前批的一些建议.md @@ -1,5 +1,5 @@

- + @@ -9,7 +9,7 @@ 以前提前批,都是 8月份,8月份中序左右,而不少大厂现在就已经提前批了。 -不少录友在 公众号留言,和[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里,表示提前批来的还是有点快。 +不少录友在 公众号留言,和[知识星球](https://programmercarl.com/other/kstar.html)里,表示提前批来的还是有点快。 ![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210618162214.png) diff --git a/problems/知识星球精选/写简历的一些问题.md b/problems/知识星球精选/写简历的一些问题.md index af42cea1..426eb2a6 100644 --- a/problems/知识星球精选/写简历的一些问题.md +++ b/problems/知识星球精选/写简历的一些问题.md @@ -1,11 +1,11 @@

- + # 程序员应该这么写简历! -自运营[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)以来,我已经给星球里的录友们看了 一百多份简历,并准对大家简历上的问题都给出了对应的详细建议。 +自运营[知识星球](https://programmercarl.com/other/kstar.html)以来,我已经给星球里的录友们看了 一百多份简历,并准对大家简历上的问题都给出了对应的详细建议。 社招,校招,实习的都有,其实大家的简历看多了,发现有很多共性的问题,这里就和大家分享一下。 diff --git a/problems/知识星球精选/初入大三选择考研VS工作.md b/problems/知识星球精选/初入大三选择考研VS工作.md index ba675761..f602e9e9 100644 --- a/problems/知识星球精选/初入大三选择考研VS工作.md +++ b/problems/知识星球精选/初入大三选择考研VS工作.md @@ -1,6 +1,6 @@

- + @@ -8,7 +8,7 @@ 9月份开学季,已过,一些录友也升入大三了,升入大三摆在自己面前最大的问题就是,考研还是找工作? -在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里就有录友问我这样一个问题, 其实每个人情况不一样,做出的选择也不一样,这里给大家分享一下,相信对你也会有启发。 +在[知识星球](https://programmercarl.com/other/kstar.html)里就有录友问我这样一个问题, 其实每个人情况不一样,做出的选择也不一样,这里给大家分享一下,相信对你也会有启发。 ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211002110618.png) diff --git a/problems/知识星球精选/刷力扣用不用库函数.md b/problems/知识星球精选/刷力扣用不用库函数.md index 73f2a2d5..b52e4d03 100644 --- a/problems/知识星球精选/刷力扣用不用库函数.md +++ b/problems/知识星球精选/刷力扣用不用库函数.md @@ -1,11 +1,11 @@

- + # 究竟什么时候用库函数,什么时候要自己实现 -在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里有录友问我,刷题究竟要不要用库函数? 刷题的时候总是禁不住库函数的诱惑,如果都不用库函数一些题目做起来还很麻烦。 +在[知识星球](https://programmercarl.com/other/kstar.html)里有录友问我,刷题究竟要不要用库函数? 刷题的时候总是禁不住库函数的诱惑,如果都不用库函数一些题目做起来还很麻烦。 估计不少录友都有这个困惑,我来说一说对于库函数的使用。 diff --git a/problems/知识星球精选/刷题攻略要刷两遍.md b/problems/知识星球精选/刷题攻略要刷两遍.md index 1f4fd7f9..285a5728 100644 --- a/problems/知识星球精选/刷题攻略要刷两遍.md +++ b/problems/知识星球精选/刷题攻略要刷两遍.md @@ -1,5 +1,5 @@

- + @@ -27,7 +27,7 @@ 第三遍基本就得心应手了。 -在[「代码随想录」知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)中,我都是强调大家要至少刷两遍,有时间的话刷三遍, +在[「代码随想录」知识星球](https://programmercarl.com/other/kstar.html)中,我都是强调大家要至少刷两遍,有时间的话刷三遍, 可以看看星球里录友们的打卡: diff --git a/problems/知识星球精选/博士转行计算机.md b/problems/知识星球精选/博士转行计算机.md index 66769264..4da79e97 100644 --- a/problems/知识星球精选/博士转行计算机.md +++ b/problems/知识星球精选/博士转行计算机.md @@ -1,11 +1,11 @@

- + # 本硕非计算机博士,如果找计算机相关工作 -在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里,有一位博士录友,本硕都不是计算机,博士转的计算机,问了这样一个问题 +在[知识星球](https://programmercarl.com/other/kstar.html)里,有一位博士录友,本硕都不是计算机,博士转的计算机,问了这样一个问题 ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210903213924.png) diff --git a/problems/知识星球精选/合适自己的就是最好的.md b/problems/知识星球精选/合适自己的就是最好的.md index fda51afa..dc31f5a7 100644 --- a/problems/知识星球精选/合适自己的就是最好的.md +++ b/problems/知识星球精选/合适自己的就是最好的.md @@ -1,5 +1,5 @@

- + @@ -7,7 +7,7 @@ 秋招已经进入下半场了,不少同学也拿到了offer,但不是说非要进大厂,每个人情况都不一样,**合适自己的,就是最好的!**。 -[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里有一位录友,就终于拿到了合适自己的offer,并不是大厂,是南京的一家公司,**但很合适自己,其实就非常值得开心**。 +[知识星球](https://programmercarl.com/other/kstar.html)里有一位录友,就终于拿到了合适自己的offer,并不是大厂,是南京的一家公司,**但很合适自己,其实就非常值得开心**。 ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210910232502.png) @@ -33,5 +33,5 @@ 我在发文的时候 看了一遍她这几个月完整的打卡过程,还是深有感触的。 -[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里还有很多很多这样的录友在每日奋斗着,**我相信 等大家拿到offer之后,在回头看一下当初星球里曾经每日打卡的点点滴滴,不仅会感动自己 也会感动每一位见证者**。 +[知识星球](https://programmercarl.com/other/kstar.html)里还有很多很多这样的录友在每日奋斗着,**我相信 等大家拿到offer之后,在回头看一下当初星球里曾经每日打卡的点点滴滴,不仅会感动自己 也会感动每一位见证者**。 diff --git a/problems/知识星球精选/备战2022届秋招.md b/problems/知识星球精选/备战2022届秋招.md index 207a5e2a..55c2a3bf 100644 --- a/problems/知识星球精选/备战2022届秋招.md +++ b/problems/知识星球精选/备战2022届秋招.md @@ -1,11 +1,11 @@

- + # 要开始准备2022届的秋招了 -在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里准备秋招的录友还真不少,也会回答过不少关于秋招的问题。 +在[知识星球](https://programmercarl.com/other/kstar.html)里准备秋招的录友还真不少,也会回答过不少关于秋招的问题。 ![](https://img-blog.csdnimg.cn/20210507195443924.png) diff --git a/problems/知识星球精选/大厂新人培养体系.md b/problems/知识星球精选/大厂新人培养体系.md index ccd2f1c2..0e905e42 100644 --- a/problems/知识星球精选/大厂新人培养体系.md +++ b/problems/知识星球精选/大厂新人培养体系.md @@ -1,11 +1,11 @@

- + # 大厂的新人培养体系是什么样的 -之前我一直在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)和大家讲,能进大厂一定要进大厂,大厂有比较好的培养体系。 +之前我一直在[知识星球](https://programmercarl.com/other/kstar.html)和大家讲,能进大厂一定要进大厂,大厂有比较好的培养体系。 也有录友在星球里问我,究竟培养体系应该是什么样的呢? 大厂都会这么培养新人么? diff --git a/problems/知识星球精选/天下乌鸦一般黑.md b/problems/知识星球精选/天下乌鸦一般黑.md index 29543747..ccd1c326 100644 --- a/problems/知识星球精选/天下乌鸦一般黑.md +++ b/problems/知识星球精选/天下乌鸦一般黑.md @@ -1,6 +1,6 @@

- + @@ -8,7 +8,7 @@ 相信大家应该经常在 各大论坛啊之类的 看到对各个互联网公司的评价,有风评好的,也有风评不好的。 -在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里有录友问我这样一个问题: +在[知识星球](https://programmercarl.com/other/kstar.html)里有录友问我这样一个问题: ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211004095707.png) diff --git a/problems/知识星球精选/如何权衡实习与秋招复习.md b/problems/知识星球精选/如何权衡实习与秋招复习.md index 275588df..07e2bba6 100644 --- a/problems/知识星球精选/如何权衡实习与秋招复习.md +++ b/problems/知识星球精选/如何权衡实习与秋招复习.md @@ -1,11 +1,11 @@

- + # 已经在实习的录友如何准备秋招? -最近在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)一位录友问了实习生如何权衡工作和准备秋招的问题。 +最近在[知识星球](https://programmercarl.com/other/kstar.html)一位录友问了实习生如何权衡工作和准备秋招的问题。 ![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210703230618.png) diff --git a/problems/知识星球精选/客三消.md b/problems/知识星球精选/客三消.md index 8a7b5fc6..6b81ab2c 100644 --- a/problems/知识星球精选/客三消.md +++ b/problems/知识星球精选/客三消.md @@ -1,5 +1,5 @@

- + @@ -17,7 +17,7 @@ 然后朋友圈就炸了,上百条的留言,问我这是为啥。 -其实这个问题在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里也有录友问过我。 +其实这个问题在[知识星球](https://programmercarl.com/other/kstar.html)里也有录友问过我。 ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210905091037.png) @@ -87,7 +87,7 @@ # 总结 -以上就是我在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里的详细回答。 +以上就是我在[知识星球](https://programmercarl.com/other/kstar.html)里的详细回答。 注意我这里说的一般情况,当然各个岗位都有佼佼者,或者说大牛,客户端也有大牛,也很香,不过这是极少数,就不在讨论范围内了。 diff --git a/problems/知识星球精选/技术不好如何选择技术方向.md b/problems/知识星球精选/技术不好如何选择技术方向.md index dd13f46b..4ad4659b 100644 --- a/problems/知识星球精选/技术不好如何选择技术方向.md +++ b/problems/知识星球精选/技术不好如何选择技术方向.md @@ -1,11 +1,11 @@

- + # 技术不太好,也不知道对技术有没有兴趣,我该怎么选? -最近在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里解答了不少录友们的疑惑,其实发现一个挺普遍的问题: +最近在[知识星球](https://programmercarl.com/other/kstar.html)里解答了不少录友们的疑惑,其实发现一个挺普遍的问题: * 我技术很一般 * 对技术也没有什么追求 diff --git a/problems/知识星球精选/提前批已经开始了.md b/problems/知识星球精选/提前批已经开始了.md index ba05b5a9..3e255746 100644 --- a/problems/知识星球精选/提前批已经开始了.md +++ b/problems/知识星球精选/提前批已经开始了.md @@ -1,5 +1,5 @@

- + @@ -7,7 +7,7 @@ 最近华为提前批已经开始了,不少同学已经陆续参加了提前批的面试。 -在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)上就有录友问我这么个问题: +在[知识星球](https://programmercarl.com/other/kstar.html)上就有录友问我这么个问题: ![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210711002802.png) diff --git a/problems/知识星球精选/秋招下半场依然没offer.md b/problems/知识星球精选/秋招下半场依然没offer.md index 829f82ba..5862dd32 100644 --- a/problems/知识星球精选/秋招下半场依然没offer.md +++ b/problems/知识星球精选/秋招下半场依然没offer.md @@ -1,11 +1,11 @@

- + # 秋招下半场依然没offer,怎么办? -[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里一些录友拿到了满意的offer,也有一些录友,依然没有offer,每天的状态已经不能用焦虑来形容了。 +[知识星球](https://programmercarl.com/other/kstar.html)里一些录友拿到了满意的offer,也有一些录友,依然没有offer,每天的状态已经不能用焦虑来形容了。 在星球里就有录友向我提问了这样一个问题: @@ -52,7 +52,7 @@ ## 在学点技术,冲春招? -[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里还有一位录友,也是类似的情况,秋招感觉很艰难,要不要在学一学微服务分布式之类的,再冲春招。 +[知识星球](https://programmercarl.com/other/kstar.html)里还有一位录友,也是类似的情况,秋招感觉很艰难,要不要在学一学微服务分布式之类的,再冲春招。 ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210921103343.png) @@ -71,13 +71,13 @@ ## 给参加明年秋招录友的劝告 -其实我在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里,**看到了太多太多 参加今年秋招的录友 埋怨自己 准备的太晚了,没想到要看的东西这么多,没想到竞争这么激烈**。 +其实我在[知识星球](https://programmercarl.com/other/kstar.html)里,**看到了太多太多 参加今年秋招的录友 埋怨自己 准备的太晚了,没想到要看的东西这么多,没想到竞争这么激烈**。 所以明年参加秋招的录友,要提前就开始准备,明确自己的岗位,知道岗位的要求,制定自己的计划,然后按计划执行。 **其实多早开始准备,都不算早!** -很多在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里的准大三,研一的录友,都能在星球里感受到 秋招的竞争与激烈。 +很多在[知识星球](https://programmercarl.com/other/kstar.html)里的准大三,研一的录友,都能在星球里感受到 秋招的竞争与激烈。 所以他们也就早早的开始准备了。 @@ -87,7 +87,7 @@ 估计大多数准大三或者准研一的同学都还没有这种意识。 -**但在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里,通过每天录友们的打卡,每天都能感受到这种紧迫感**。 +**但在[知识星球](https://programmercarl.com/other/kstar.html)里,通过每天录友们的打卡,每天都能感受到这种紧迫感**。 正如一位星球里的录友这么说: diff --git a/problems/知识星球精选/秋招开奖.md b/problems/知识星球精选/秋招开奖.md index 368596b6..82686785 100644 --- a/problems/知识星球精选/秋招开奖.md +++ b/problems/知识星球精选/秋招开奖.md @@ -1,6 +1,6 @@

- + @@ -8,7 +8,7 @@ 最近秋招的录友已经陆续开奖了,同时开奖多少,也是offer选择的一个重要因素,毕竟谁能和钱过意不去呢。 -[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里这位录友拿到的百度offer薪资确实很高 +[知识星球](https://programmercarl.com/other/kstar.html)里这位录友拿到的百度offer薪资确实很高 ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211023102430.png) diff --git a/problems/知识星球精选/秋招总结1.md b/problems/知识星球精选/秋招总结1.md index efec67ee..2aec24dc 100644 --- a/problems/知识星球精选/秋招总结1.md +++ b/problems/知识星球精选/秋招总结1.md @@ -1,5 +1,5 @@

- + @@ -11,7 +11,7 @@ 时间总是过得很快,但曾经焦虑的小伙,现在也拿到几个offer了,不一定人人都要冲大厂,卷算法,卷后端,合适自己就好,要不然会把自己搞的很累。 -以下是他的秋招总结,**写的很用心,说了很多面试中使用的方法,发在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里,立刻就引来星球小伙伴们的围观**,算是给星球里明年要秋招的录友做了一个参考。 +以下是他的秋招总结,**写的很用心,说了很多面试中使用的方法,发在[知识星球](https://programmercarl.com/other/kstar.html)里,立刻就引来星球小伙伴们的围观**,算是给星球里明年要秋招的录友做了一个参考。 ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211109231150.png) diff --git a/problems/知识星球精选/秋招总结2.md b/problems/知识星球精选/秋招总结2.md index 7f4b6770..897a7ec3 100644 --- a/problems/知识星球精选/秋招总结2.md +++ b/problems/知识星球精选/秋招总结2.md @@ -1,10 +1,10 @@ -

+

# 倒霉透顶,触底反弹! -星球里不少录友秋招已经陆续结束了,很多录友都在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里写下了自己的秋招总结,但今天这位录友很特殊,甚至我给她修改简历的时候我都“有点愁”。 +星球里不少录友秋招已经陆续结束了,很多录友都在[知识星球](https://programmercarl.com/other/kstar.html)里写下了自己的秋招总结,但今天这位录友很特殊,甚至我给她修改简历的时候我都“有点愁”。 他的秋招过程也是极其坎坷,**逼签、被养鱼最后收到感谢信、校招流程收到实习offer,还有数不清的简历挂……**,可能是太倒霉了,最后触底反弹,接到了百度的offer,虽然是白菜价,但真的很不错了。 diff --git a/problems/知识星球精选/秋招总结3.md b/problems/知识星球精选/秋招总结3.md index 895c1b8c..05a677ed 100644 --- a/problems/知识星球精选/秋招总结3.md +++ b/problems/知识星球精选/秋招总结3.md @@ -1,4 +1,4 @@ -

+

@@ -6,7 +6,7 @@ 其实无论社招,还是校招,心态都很重要,例如,别人那个一堆offer,自己陷入深深的焦虑。 面试分明感觉自己表现的不错,结果就是挂了。面试中遇到了面试官的否定,然后就开始自我怀疑,等等等。 -如果你也遇到这些问题,可以认真读完[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里一位录友的总结,他是非科班,机械转码,今年5月份加入的星球,坚持打卡几个月,如果也获得自己心仪的offer,他的心路历程对大家会很有启发。 +如果你也遇到这些问题,可以认真读完[知识星球](https://programmercarl.com/other/kstar.html)里一位录友的总结,他是非科班,机械转码,今年5月份加入的星球,坚持打卡几个月,如果也获得自己心仪的offer,他的心路历程对大家会很有启发。 ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211121093438.png) diff --git a/problems/知识星球精选/秋招的上半场.md b/problems/知识星球精选/秋招的上半场.md index f404e611..6c817577 100644 --- a/problems/知识星球精选/秋招的上半场.md +++ b/problems/知识星球精选/秋招的上半场.md @@ -1,11 +1,11 @@

- + # 秋招上半场的总结 -八月份已经接近尾声,不少录友已经在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) 已经总结了秋招的上半场。 +八月份已经接近尾声,不少录友已经在[知识星球](https://programmercarl.com/other/kstar.html) 已经总结了秋招的上半场。 ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210829214839.png) diff --git a/problems/知识星球精选/秋招进行中的迷茫与焦虑.md b/problems/知识星球精选/秋招进行中的迷茫与焦虑.md index 6083c7b1..24e7760c 100644 --- a/problems/知识星球精选/秋招进行中的迷茫与焦虑.md +++ b/problems/知识星球精选/秋招进行中的迷茫与焦虑.md @@ -1,5 +1,5 @@

- + @@ -9,7 +9,7 @@ 特别是大三的同学吧,同时面临这找工作和考研两个方向的诱惑。 -一位录友就在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)问了我这个问题: +一位录友就在[知识星球](https://programmercarl.com/other/kstar.html)问了我这个问题: ![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210724183240.png) diff --git a/problems/知识星球精选/英语到底重不重要.md b/problems/知识星球精选/英语到底重不重要.md index 32e6a39b..5ee7fc2d 100644 --- a/problems/知识星球精选/英语到底重不重要.md +++ b/problems/知识星球精选/英语到底重不重要.md @@ -1,11 +1,11 @@

- + # 对程序员来说,英语到底重不重要 -在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)有一位录友问了我这么一个问题。 +在[知识星球](https://programmercarl.com/other/kstar.html)有一位录友问了我这么一个问题。 ![](https://gitee.com/programmercarl/pics/raw/master/pic1/20210605193955.png) diff --git a/problems/知识星球精选/要不要考研.md b/problems/知识星球精选/要不要考研.md index a5f2dfa0..180e5d13 100644 --- a/problems/知识星球精选/要不要考研.md +++ b/problems/知识星球精选/要不要考研.md @@ -1,11 +1,11 @@

- + # 到底要不要读研 -在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里讨论了一下关于要不要读研的问题。 +在[知识星球](https://programmercarl.com/other/kstar.html)里讨论了一下关于要不要读研的问题。 ![](https://gitee.com/programmercarl/pics/raw/master/pic1/20210613230829.png) diff --git a/problems/知识星球精选/逼签.md b/problems/知识星球精选/逼签.md index 90e4e67d..f75e3642 100644 --- a/problems/知识星球精选/逼签.md +++ b/problems/知识星球精选/逼签.md @@ -7,7 +7,7 @@ 如果是心仪的公司要求三天内签三方,我相信大家就没有被逼签的感觉了,哈哈哈 -[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)里很多录友都问我,XX公司又要逼签了,怎么办。 我在公众号也分享一下,希望对大家有所帮助。 +[知识星球](https://programmercarl.com/other/kstar.html)里很多录友都问我,XX公司又要逼签了,怎么办。 我在公众号也分享一下,希望对大家有所帮助。 ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211017093816.png) diff --git a/problems/知识星球精选/非科班2021秋招总结.md b/problems/知识星球精选/非科班2021秋招总结.md index c2c7ed33..b92420ad 100644 --- a/problems/知识星球精选/非科班2021秋招总结.md +++ b/problems/知识星球精选/非科班2021秋招总结.md @@ -1,6 +1,6 @@

- + @@ -10,7 +10,7 @@ 其中一位录友写的很好,所以想分享出来 给公众号上的录友也看一看,相信对大家有所启发,特别是明年要找工作的录友,值得好好看一看。 -这篇总结首发在代码随想录[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)上,立刻就获得了60个赞,很多评论,我这里放出一个截图: +这篇总结首发在代码随想录[知识星球](https://programmercarl.com/other/kstar.html)上,立刻就获得了60个赞,很多评论,我这里放出一个截图: ![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210929220903.png) diff --git a/problems/知识星球精选/非科班的困扰.md b/problems/知识星球精选/非科班的困扰.md index d5fea532..470b233b 100644 --- a/problems/知识星球精选/非科班的困扰.md +++ b/problems/知识星球精选/非科班的困扰.md @@ -1,11 +1,11 @@

- + # 非科班的困扰! -在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ) 里很多录友都是非科班转码的,也是要准备求职,或者准备明年秋招,非科班的录友其实对 准备找工作所需要的知识不太清楚,对其难度也不太清楚,所有总感觉准备起来心里没有底。 +在[知识星球](https://programmercarl.com/other/kstar.html) 里很多录友都是非科班转码的,也是要准备求职,或者准备明年秋招,非科班的录友其实对 准备找工作所需要的知识不太清楚,对其难度也不太清楚,所有总感觉准备起来心里没有底。 例如星球里有这位录友的提问: diff --git a/problems/知识星球精选/面试中发散性问题.md b/problems/知识星球精选/面试中发散性问题.md index 7fb9150f..5cade944 100644 --- a/problems/知识星球精选/面试中发散性问题.md +++ b/problems/知识星球精选/面试中发散性问题.md @@ -1,11 +1,11 @@

- + # 面试中遇到发散性问题,应该怎么办? -这周在[知识星球](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)有一位录友问了我这么一个问题,我感觉挺有代表性的,应该不少录友在面试中不论是社招还是校招都会遇到这一类的问题。 +这周在[知识星球](https://programmercarl.com/other/kstar.html)有一位录友问了我这么一个问题,我感觉挺有代表性的,应该不少录友在面试中不论是社招还是校招都会遇到这一类的问题。 问题如下: From 759175ac6fc72b63e3c4aa02e7b893951556146d Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Tue, 22 Mar 2022 09:30:23 +0800 Subject: [PATCH 199/328] Update --- .DS_Store | Bin 8196 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 7794435bd6714aed6095604325ab6ffe84221748..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8196 zcmeHMU2GIp6u#fIv@>*|1GG|b$8K6szzU`1r~D<`KM+bOc3ZkFVA<^sbYMDDcV^o{ zC8_Z*g7~0DeNjN;ix1VP7!wtvi3asattOIaj7FnRKFACD;<m0CQ8r?%*`* zup!Jqn1L_@VFtnsgc#mK>qC@oE@Ocl6VhKgsPK;f zB>54*zv!9H0lrT(kg-6H3F*61pW^g@z!kv}1Hzs3QEpB$7RWIng*$_AX9z|{a6*AU zI{8I?bB36ZVHsv1%)s;vaQet>kY$*|QrDl~QTewYB!ubsmP_3Yqqra9{olWg+mlT+n{GUw!6>BxFmbE zVwVEl+2`1MGX~dp^*L5{z;=7J1${}YFKZ<|qu#RO<_Uw^irv19V_AD0*W}%FCp=@s z+c#eT{C4F9d>fSP!^y{nJ6w>vh?lONbu4&8|RHg%m zmHORkhfBfBT2dIUR;$&HV*~|7b45$7x?bVg$!AiU;v1PT@4p;3+(h7x5C#;XGc$n|KQs@D4u2 zC47d@@il(J&-ewu;tyQKU-(*}`EPl8aOHV4$};qPPqUrg~a?_**LUMB<#)$$zerqZ#K$YPAhoU&S> zu&z*-$r>?ej;P+Hu9USFMJo{1s>o{MrL0MQRb3mYRkWn6<%w!lWTPT$5S7j9R?b5$ zUsQE9rYIWoE0M-XGv|^f6Uxsu`LjI>%9Uv=l#lj1Ssi`Gb+E&<$vniKWM>KOAFzw; zOLm$4$bMs22=4`ibPeTLfog0(4BN2-yU>DG>_Zp2(L-oAaM(xuF?h&gm{5NL591L$ zhR5*)p2jnH7SG`$w)*YO6S|2@2qi-i7<@G-u?1it6^4^W#!bE~N5N?f6* zX=ombXKc%{kB~0smvguYWuAEFGJgJVp8fa#n=rEQmBS2#8ThXmKz>uase!C#ThsVi zJ4*K From 77aa72b984465ac28006cc9c5765ecb42681811e Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Wed, 23 Mar 2022 16:13:01 +0800 Subject: [PATCH 200/328] Update --- README.md | 2 +- problems/0028.实现strStr.md | 2 +- problems/0494.目标和.md | 3 +-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 0bf7fcdf..b8ff87da 100644 --- a/README.md +++ b/README.md @@ -263,7 +263,7 @@ 3. [二叉树:听说递归能做的,栈也能做!](./problems/二叉树的迭代遍历.md) 4. [二叉树:前中后序迭代方式的写法就不能统一一下么?](./problems/二叉树的统一迭代法.md) 5. [二叉树:层序遍历登场!](./problems/0102.二叉树的层序遍历.md) -6. [二叉树:你真的会翻转二叉树么?](./problems/0226.翻转二叉树.md) +6. [二叉树:你真的会翻转二叉树么?](./problems/0226.翻转二叉树.md) 7. [本周小结!(二叉树)](./problems/周总结/20200927二叉树周末总结.md) 8. [二叉树:我对称么?](./problems/0101.对称二叉树.md) 9. [二叉树:看看这些树的最大深度](./problems/0104.二叉树的最大深度.md) diff --git a/problems/0028.实现strStr.md b/problems/0028.实现strStr.md index bbe5b80f..854789ee 100644 --- a/problems/0028.实现strStr.md +++ b/problems/0028.实现strStr.md @@ -255,7 +255,7 @@ void getNext(int* next, const string& s) 1. 初始化: -定义两个指针i和j,j指向前缀起始位置,i指向后缀起始位置。 +定义两个指针i和j,j指向前缀末尾位置,i指向后缀末尾位置。 然后还要对next数组进行初始化赋值,如下: diff --git a/problems/0494.目标和.md b/problems/0494.目标和.md index 47d0784e..df667a85 100644 --- a/problems/0494.目标和.md +++ b/problems/0494.目标和.md @@ -156,11 +156,10 @@ dp[j] 表示:填满j(包括j)这么大容积的包,有dp[j]种方法 有哪些来源可以推出dp[j]呢? -填满容量为j - nums[i]的背包,有dp[j - nums[i]]种方法。 +不考虑nums[i]的情况下,填满容量为j - nums[i]的背包,有dp[j - nums[i]]种方法。 那么只要搞到nums[i]的话,凑成dp[j]就有dp[j - nums[i]] 种方法。 - 例如:dp[j],j 为5, * 已经有一个1(nums[i]) 的话,有 dp[4]种方法 凑成 dp[5]。 From cbe5403e45e009f5d906fa168ff5aee086043e57 Mon Sep 17 00:00:00 2001 From: berserk-112 <40333359+berserk-112@users.noreply.github.com> Date: Thu, 24 Mar 2022 11:23:36 +0800 Subject: [PATCH 201/328] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0bf7fcdf..5dfc04fd 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ - +贪心:[贪心算法:分发糖果](./problems/0135.分发糖果.md) [贪心算法:根据身高重建队列](./problems/0406.根据身高重建队列.md) 👉 推荐 [在线阅读](http://programmercarl.com/) (Github在国内访问经常不稳定) 👉 推荐 [Gitee同步](https://gitee.com/programmercarl/leetcode-master) From 5c403d9e589203d8ee7c2beff3c863accb3bce94 Mon Sep 17 00:00:00 2001 From: berserk-112 <40333359+berserk-112@users.noreply.github.com> Date: Fri, 25 Mar 2022 11:08:45 +0800 Subject: [PATCH 202/328] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5dfc04fd..a0f4863e 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -贪心:[贪心算法:分发糖果](./problems/0135.分发糖果.md) [贪心算法:根据身高重建队列](./problems/0406.根据身高重建队列.md) +贪心:[贪心算法:分发糖果](./problems/0135.分发糖果.md) [贪心算法:根据身高重建队列](./problems/0406.根据身高重建队列.md) [贪心算法:我要监控二叉树!](./problems/0968.监控二叉树.md) 👉 推荐 [在线阅读](http://programmercarl.com/) (Github在国内访问经常不稳定) 👉 推荐 [Gitee同步](https://gitee.com/programmercarl/leetcode-master) From 74ac8c39c1248afd5d99604b7a20e27c67625679 Mon Sep 17 00:00:00 2001 From: Guang-Hou <87743934+Guang-Hou@users.noreply.github.com> Date: Fri, 25 Mar 2022 15:49:48 -0400 Subject: [PATCH 203/328] =?UTF-8?q?Update=200134.=E5=8A=A0=E6=B2=B9?= =?UTF-8?q?=E7=AB=99.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0134.加油站.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/problems/0134.加油站.md b/problems/0134.加油站.md index ca95af67..f73ab9f4 100644 --- a/problems/0134.加油站.md +++ b/problems/0134.加油站.md @@ -239,6 +239,30 @@ class Solution { ### Python ```python +# 解法1 +class Solution: + def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int: + n = len(gas) + cur_sum = 0 + min_sum = float('inf') + + for i in range(n): + cur_sum += gas[i] - cost[i] + min_sum = min(min_sum, cur_sum) + + if cur_sum < 0: return -1 + if min_sum >= 0: return 0 + + for j in range(n - 1, 0, -1): + min_sum += gas[j] - cost[j] + if min_sum >= 0: + return j + + return -1 +``` + +```python +# 解法2 class Solution: def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int: start = 0 From dd8bea8335794b48969ae89572aec8c7aec35231 Mon Sep 17 00:00:00 2001 From: SianXiaoCHN Date: Fri, 25 Mar 2022 20:23:39 -0500 Subject: [PATCH 204/328] =?UTF-8?q?0112.=E8=B7=AF=E5=BE=84=E6=80=BB?= =?UTF-8?q?=E5=92=8C=20python=20=E7=B2=BE=E7=AE=80=E9=80=92=E5=BD=92?= =?UTF-8?q?=E5=9B=9E=E6=BA=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 0112.路径总和 python 为113精简递归回溯 --- problems/0112.路径总和.md | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/problems/0112.路径总和.md b/problems/0112.路径总和.md index 5db36687..03ec1bb7 100644 --- a/problems/0112.路径总和.md +++ b/problems/0112.路径总和.md @@ -504,17 +504,13 @@ class solution: if cur_node.left: path.append(cur_node.left.val) - remain -= cur_node.left.val - traversal(cur_node.left, remain) + traversal(cur_node.left, remain-cur_node.left.val) path.pop() - remain += cur_node.left.val if cur_node.right: path.append(cur_node.right.val) - remain -= cur_node.right.val - traversal(cur_node.right, remain) + traversal(cur_node.right, remain-cur_node.left.val) path.pop() - remain += cur_node.right.val result, path = [], [] if not root: From f8392906ac8463504e2707f3762e3fc39f909782 Mon Sep 17 00:00:00 2001 From: SianXiaoCHN Date: Fri, 25 Mar 2022 20:25:06 -0500 Subject: [PATCH 205/328] =?UTF-8?q?0112.=E8=B7=AF=E5=BE=84=E6=80=BB?= =?UTF-8?q?=E5=92=8C=20python=20=E7=B2=BE=E7=AE=80=E9=80=92=E5=BD=92?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 0112.路径总和 python 精简113递归返回条件 --- problems/0112.路径总和.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/problems/0112.路径总和.md b/problems/0112.路径总和.md index 03ec1bb7..ff682739 100644 --- a/problems/0112.路径总和.md +++ b/problems/0112.路径总和.md @@ -496,11 +496,10 @@ class solution: def pathsum(self, root: treenode, targetsum: int) -> list[list[int]]: def traversal(cur_node, remain): - if not cur_node.left and not cur_node.right and remain == 0: - result.append(path[:]) - return - - if not cur_node.left and not cur_node.right: return + if not cur_node.left and not cur_node.right: + if remain == 0: + result.append(path[:]) + return if cur_node.left: path.append(cur_node.left.val) From be6cb9f13086cd8ea7a82a98226b02666f10cdb3 Mon Sep 17 00:00:00 2001 From: SianXiaoCHN Date: Fri, 25 Mar 2022 20:35:54 -0500 Subject: [PATCH 206/328] =?UTF-8?q?0112.=E8=B7=AF=E5=BE=84=E6=80=BB?= =?UTF-8?q?=E5=92=8C=20python=20113=E6=B7=BB=E5=8A=A0=E8=BF=AD=E4=BB=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 0112.路径总和 python 113添加迭代法 --- problems/0112.路径总和.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/problems/0112.路径总和.md b/problems/0112.路径总和.md index ff682739..1904e92b 100644 --- a/problems/0112.路径总和.md +++ b/problems/0112.路径总和.md @@ -519,6 +519,30 @@ class solution: return result ``` +**迭代法,用第二个队列保存目前的总和与路径** +```python +class Solution: + def pathSum(self, root: Optional[TreeNode], targetSum: int) -> List[List[int]]: + if not root: + return [] + que, temp = deque([root]), deque([(root.val, [root.val])]) + result = [] + while que: + for _ in range(len(que)): + node = que.popleft() + value, path = temp.popleft() + if (not node.left) and (not node.right): + if value == targetSum: + result.append(path) + if node.left: + que.append(node.left) + temp.append((node.left.val+value, path+[node.left.val])) + if node.right: + que.append(node.right) + temp.append((node.right.val+value, path+[node.right.val])) + return result +``` + ## go 112. 路径总和 From 9dbc51455d7f13b83fe63d30a477d89fd1e0c33a Mon Sep 17 00:00:00 2001 From: xuerbujia <83055661+xuerbujia@users.noreply.github.com> Date: Sat, 26 Mar 2022 10:03:04 +0800 Subject: [PATCH 207/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880141.?= =?UTF-8?q?=E7=8E=AF=E5=BD=A2=E9=93=BE=E8=A1=A8.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0go=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0141.环形链表.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/problems/0141.环形链表.md b/problems/0141.环形链表.md index 0712a2a2..ddd83c94 100644 --- a/problems/0141.环形链表.md +++ b/problems/0141.环形链表.md @@ -106,6 +106,21 @@ class Solution: ## Go ```go +func hasCycle(head *ListNode) bool { + if head==nil{ + return false + } //空链表一定不会有环 + fast:=head + slow:=head //快慢指针 + for fast.Next!=nil&&fast.Next.Next!=nil{ + fast=fast.Next.Next + slow=slow.Next + if fast==slow{ + return true //快慢指针相遇则有环 + } + } + return false +} ``` ### JavaScript From 1fa83c2b3f6b1eded21f2f5313be38b1a72ff2e5 Mon Sep 17 00:00:00 2001 From: xuerbujia <83055661+xuerbujia@users.noreply.github.com> Date: Sat, 26 Mar 2022 10:13:44 +0800 Subject: [PATCH 208/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880189.?= =?UTF-8?q?=E8=BD=AE=E8=BD=AC=E6=95=B0=E7=BB=84.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0go=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0189.旋转数组.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/problems/0189.旋转数组.md b/problems/0189.旋转数组.md index bbe152a2..8e39d253 100644 --- a/problems/0189.旋转数组.md +++ b/problems/0189.旋转数组.md @@ -124,6 +124,19 @@ class Solution: ## Go ```go +func rotate(nums []int, k int) { + l:=len(nums) + index:=l-k%l + reverse(nums) + reverse(nums[:l-index]) + reverse(nums[l-index:]) +} +func reverse(nums []int){ + l:=len(nums) + for i:=0;i Date: Sat, 26 Mar 2022 21:47:35 -0500 Subject: [PATCH 209/328] =?UTF-8?q?=E5=A2=9E=E5=8A=A0python=E8=A7=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0127.单词接龙.md | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/problems/0127.单词接龙.md b/problems/0127.单词接龙.md index 407596c0..584bcb2a 100644 --- a/problems/0127.单词接龙.md +++ b/problems/0127.单词接龙.md @@ -134,7 +134,29 @@ public int ladderLength(String beginWord, String endWord, List wordList) ``` ## Python - +``` +class Solution: + def ladderLength(self, beginWord: str, endWord: str, wordList: List[str]) -> int: + wordSet = set(wordList) + if len(wordSet)== 0 or endWord not in wordSet: + return 0 + mapping = {beginWord:1} + queue = deque([beginWord]) + while queue: + word = queue.popleft() + path = mapping[word] + for i in range(len(word)): + word_list = list(word) + for j in range(26): + word_list[i] = chr(ord('a')+j) + newWord = "".join(word_list) + if newWord == endWord: + return path+1 + if newWord in wordSet and newWord not in mapping: + mapping[newWord] = path+1 + queue.append(newWord) + return 0 +``` ## Go ## JavaScript From 6d1746db85853e3714b194c659335a71a69d2d0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98Carl?= Date: Mon, 28 Mar 2022 09:55:29 +0800 Subject: [PATCH 210/328] Update README.md --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index a0f4863e..78813ac3 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,3 @@ -贪心:[贪心算法:分发糖果](./problems/0135.分发糖果.md) [贪心算法:根据身高重建队列](./problems/0406.根据身高重建队列.md) [贪心算法:我要监控二叉树!](./problems/0968.监控二叉树.md) 👉 推荐 [在线阅读](http://programmercarl.com/) (Github在国内访问经常不稳定) 👉 推荐 [Gitee同步](https://gitee.com/programmercarl/leetcode-master) From 0296ac0a0e4e0b7f0b63ded21004ccf24f755a60 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Mon, 28 Mar 2022 14:33:49 +0800 Subject: [PATCH 211/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880017.?= =?UTF-8?q?=E7=94=B5=E8=AF=9D=E5=8F=B7=E7=A0=81=E7=9A=84=E5=AD=97=E6=AF=8D?= =?UTF-8?q?=E7=BB=84=E5=90=88.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typesr?= =?UTF-8?q?ipt=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0017.电话号码的字母组合.md | 34 +++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/problems/0017.电话号码的字母组合.md b/problems/0017.电话号码的字母组合.md index 7040182f..94136565 100644 --- a/problems/0017.电话号码的字母组合.md +++ b/problems/0017.电话号码的字母组合.md @@ -420,6 +420,40 @@ var letterCombinations = function(digits) { }; ``` +## TypeScript + +```typescript +function letterCombinations(digits: string): string[] { + if (digits === '') return []; + const strMap: { [index: string]: string[] } = { + 1: [], + 2: ['a', 'b', 'c'], + 3: ['d', 'e', 'f'], + 4: ['g', 'h', 'i'], + 5: ['j', 'k', 'l'], + 6: ['m', 'n', 'o'], + 7: ['p', 'q', 'r', 's'], + 8: ['t', 'u', 'v'], + 9: ['w', 'x', 'y', 'z'], + } + const resArr: string[] = []; + function backTracking(digits: string, curIndex: number, route: string[]): void { + if (curIndex === digits.length) { + resArr.push(route.join('')); + return; + } + let tempArr: string[] = strMap[digits[curIndex]]; + for (let i = 0, length = tempArr.length; i < length; i++) { + route.push(tempArr[i]); + backTracking(digits, curIndex + 1, route); + route.pop(); + } + } + backTracking(digits, 0, []); + return resArr; +}; +``` + ## C ```c From 4959bd4c8aa78d401f5a1f14c2d267a4d046baf5 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Mon, 28 Mar 2022 17:15:46 +0800 Subject: [PATCH 212/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880039.?= =?UTF-8?q?=E7=BB=84=E5=90=88=E6=80=BB=E5=92=8C.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0039.组合总和.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/problems/0039.组合总和.md b/problems/0039.组合总和.md index 7a2084dd..98b37b84 100644 --- a/problems/0039.组合总和.md +++ b/problems/0039.组合总和.md @@ -392,7 +392,34 @@ var combinationSum = function(candidates, target) { }; ``` +## TypeScript + +```typescript +function combinationSum(candidates: number[], target: number): number[][] { + const resArr: number[][] = []; + function backTracking( + candidates: number[], target: number, + startIndex: number, route: number[], curSum: number + ): void { + if (curSum > target) return; + if (curSum === target) { + resArr.push(route.slice()); + return + } + for (let i = startIndex, length = candidates.length; i < length; i++) { + let tempVal: number = candidates[i]; + route.push(tempVal); + backTracking(candidates, target, i, route, curSum + tempVal); + route.pop(); + } + } + backTracking(candidates, target, 0, [], 0); + return resArr; +}; +``` + ## C + ```c int* path; int pathTop; From a021470215aa859a4d5b0e9fe48dd775e6c0ed51 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Tue, 29 Mar 2022 14:38:19 +0800 Subject: [PATCH 213/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880040.?= =?UTF-8?q?=E7=BB=84=E5=90=88=E6=80=BB=E5=92=8CII.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0040.组合总和II.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/problems/0040.组合总和II.md b/problems/0040.组合总和II.md index 49acb8d6..de13e031 100644 --- a/problems/0040.组合总和II.md +++ b/problems/0040.组合总和II.md @@ -532,6 +532,7 @@ var combinationSum2 = function(candidates, target) { }; ``` **使用used去重** + ```js var combinationSum2 = function(candidates, target) { let res = []; @@ -562,6 +563,37 @@ var combinationSum2 = function(candidates, target) { }; ``` +## TypeScript + +```typescript +function combinationSum2(candidates: number[], target: number): number[][] { + candidates.sort((a, b) => a - b); + const resArr: number[][] = []; + function backTracking( + candidates: number[], target: number, + curSum: number, startIndex: number, route: number[] + ) { + if (curSum > target) return; + if (curSum === target) { + resArr.push(route.slice()); + return; + } + for (let i = startIndex, length = candidates.length; i < length; i++) { + if (i > startIndex && candidates[i] === candidates[i - 1]) { + continue; + } + let tempVal: number = candidates[i]; + route.push(tempVal); + backTracking(candidates, target, curSum + tempVal, i + 1, route); + route.pop(); + + } + } + backTracking(candidates, target, 0, 0, []); + return resArr; +}; +``` + ## C ```c From c569dc505b59552f1435cecc1b584d88417a4cac Mon Sep 17 00:00:00 2001 From: zhujs Date: Tue, 29 Mar 2022 23:33:34 +0800 Subject: [PATCH 214/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200332.=E9=87=8D?= =?UTF-8?q?=E6=96=B0=E5=AE=89=E6=8E=92=E8=A1=8C=E7=A8=8B=20Go=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0332.重新安排行程.md | 72 +++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/problems/0332.重新安排行程.md b/problems/0332.重新安排行程.md index 01f81c4d..e65786c6 100644 --- a/problems/0332.重新安排行程.md +++ b/problems/0332.重新安排行程.md @@ -568,5 +568,77 @@ for line in tickets { } ``` +### Go +```Go + +// 先排序,然后找到第一条路径即可返回 +func findItinerary(tickets [][]string) []string { + var path []string // 用来保存搜索的路径 + data := make(map[string]ticketSlice) // 用来保存tickets排序后的结果 + + var search func(airport string) bool + search = func(airport string) bool { + if len(path) == len(tickets) { + path = append(path, airport) + return true + } + to := data[airport] + for _, item := range to { + if item.Count == 0 { + // 已用完 + continue + } + + path = append(path, airport) + item.Count-- + if search(item.To) { return true } + item.Count++ + path = path[:len(path) - 1] + } + + return false + } + + // 排序 + // 感觉这段代码有点啰嗦,不知道能不能简化一下 + tmp := make(map[string]map[string]int) + for _, ticket := range tickets { + if to, ok := tmp[ticket[0]]; ok { + if _, ok2 := to[ticket[1]]; ok2 { + to[ticket[1]]++ + } else { + to[ticket[1]] = 1 + } + } else { + tmp[ticket[0]] = map[string]int{ + ticket[1]: 1, + } + } + } + for from, to := range tmp { + var tmp ticketSlice + for to, num := range to { + tmp = append(tmp, &ticketStat{To: to, Count: num}) + } + sort.Sort(tmp) + data[from] = tmp + } + + search("JFK") + return path +} + +type ticketStat struct { + To string + Count int +} +type ticketSlice []*ticketStat + +func (p ticketSlice) Len() int { return len(p) } +func (p ticketSlice) Less(i, j int) bool { return strings.Compare(p[i].To, p[j].To) == -1 } +func (p ticketSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } + +``` + -----------------------

From f0b771af5c8d1fe5d5a298f00a2dbc05a1e23b42 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Wed, 30 Mar 2022 16:40:18 +0800 Subject: [PATCH 215/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880131.?= =?UTF-8?q?=E5=88=86=E5=89=B2=E5=9B=9E=E6=96=87=E4=B8=B2.md=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0131.分割回文串.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/problems/0131.分割回文串.md b/problems/0131.分割回文串.md index f50f1c1d..10b747cb 100644 --- a/problems/0131.分割回文串.md +++ b/problems/0131.分割回文串.md @@ -450,6 +450,38 @@ var partition = function(s) { }; ``` +## TypeScript + +```typescript +function partition(s: string): string[][] { + function isPalindromeStr(s: string, left: number, right: number): boolean { + while (left < right) { + if (s[left++] !== s[right--]) { + return false; + } + } + return true; + } + function backTracking(s: string, startIndex: number, route: string[]): void { + let length: number = s.length; + if (length === startIndex) { + resArr.push(route.slice()); + return; + } + for (let i = startIndex; i < length; i++) { + if (isPalindromeStr(s, startIndex, i)) { + route.push(s.slice(startIndex, i + 1)); + backTracking(s, i + 1, route); + route.pop(); + } + } + } + const resArr: string[][] = []; + backTracking(s, 0, []); + return resArr; +}; +``` + ## C ```c From 7ee6bdbbfac43194c2ce3d5feb1f322824c3c7c7 Mon Sep 17 00:00:00 2001 From: h-yx-blog <2041290842@qq.com> Date: Thu, 31 Mar 2022 08:59:58 +0800 Subject: [PATCH 216/328] =?UTF-8?q?416=E5=88=86=E5=89=B2=E7=AD=89=E5=92=8C?= =?UTF-8?q?=E5=AD=90=E9=9B=86java=E7=89=88=E5=8F=A6=E4=B8=80=E7=A7=8D?= =?UTF-8?q?=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0416.分割等和子集.md | 69 +++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/problems/0416.分割等和子集.md b/problems/0416.分割等和子集.md index c8d9bc04..b24fb365 100644 --- a/problems/0416.分割等和子集.md +++ b/problems/0416.分割等和子集.md @@ -208,6 +208,75 @@ class Solution { } ``` +```java +public class Solution { + public static void main(String[] args) { + int num[] = {1,5,11,5}; + canPartition(num); + + } + public static boolean canPartition(int[] nums) { + int len = nums.length; + // 题目已经说非空数组,可以不做非空判断 + int sum = 0; + for (int num : nums) { + sum += num; + } + // 特判:如果是奇数,就不符合要求 + if ((sum %2 ) != 0) { + return false; + } + + int target = sum / 2; //目标背包容量 + // 创建二维状态数组,行:物品索引,列:容量(包括 0) + /* + dp[i][j]表示从数组的 [0, i] 这个子区间内挑选一些正整数 + 每个数只能用一次,使得这些数的和恰好等于 j。 + */ + boolean[][] dp = new boolean[len][target + 1]; + + // 先填表格第 0 行,第 1 个数只能让容积为它自己的背包恰好装满 (这里的dp[][]数组的含义就是“恰好”,所以就算容积比它大的也不要) + if (nums[0] <= target) { + dp[0][nums[0]] = true; + } + // 再填表格后面几行 + //外层遍历物品 + for (int i = 1; i < len; i++) { + //内层遍历背包 + for (int j = 0; j <= target; j++) { + // 直接从上一行先把结果抄下来,然后再修正 + dp[i][j] = dp[i - 1][j]; + + //如果某个物品单独的重量恰好就等于背包的重量,那么也是满足dp数组的定义的 + if (nums[i] == j) { + dp[i][j] = true; + continue; + } + //如果某个物品的重量小于j,那就可以看该物品是否放入背包 + //dp[i - 1][j]表示该物品不放入背包,如果在 [0, i - 1] 这个子区间内已经有一部分元素,使得它们的和为 j ,那么 dp[i][j] = true; + //dp[i - 1][j - nums[i]]表示该物品放入背包。如果在 [0, i - 1] 这个子区间内就得找到一部分元素,使得它们的和为 j - nums[i]。 + if (nums[i] < j) { + dp[i][j] = dp[i - 1][j] || dp[i - 1][j - nums[i]]; + } + } + } + for (int i = 0; i < len; i++) { + for (int j = 0; j <= target; j++) { + System.out.print(dp[i][j]+" "); + } + System.out.println(); + } + return dp[len - 1][target]; + } +} +//dp数组的打印结果 +false true false false false false false false false false false false +false true false false false true true false false false false false +false true false false false true true false false false false true +false true false false false true true false false false true true +``` + + 二维数组版本(易于理解): ```Java class Solution { From 00dc57faaca1a77fd7c371f2975df5939a7edb0c Mon Sep 17 00:00:00 2001 From: MoonLight-Sherry <3397446353@qq.com> Date: Thu, 31 Mar 2022 10:34:34 +0800 Subject: [PATCH 217/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=860509.?= =?UTF-8?q?=E6=96=90=E6=B3=A2=E9=82=A3=E5=A5=91=E6=95=B0=E5=88=97Rust?= =?UTF-8?q?=E4=B8=A4=E7=A7=8D=E8=A7=A3=E6=B3=95=E7=9A=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0509.斐波那契数.md | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/problems/0509.斐波那契数.md b/problems/0509.斐波那契数.md index c6ce76c0..e60b8a9e 100644 --- a/problems/0509.斐波那契数.md +++ b/problems/0509.斐波那契数.md @@ -277,7 +277,30 @@ int fib(int n){ return fib(n-1) + fib(n-2); } ``` +### Rust +动态规划: +```Rust +pub fn fib(n: i32) -> i32 { + let n = n as usize; + let mut dp = vec![0; 31]; + dp[1] = 1; + for i in 2..=n { + dp[i] = dp[i - 1] + dp[i - 2]; + } + dp[n] +} +``` - +递归实现: +```Rust +pub fn fib(n: i32) -> i32 { + //若n小于等于1,返回n + f n <= 1 { + return n; + } + //否则返回fib(n-1) + fib(n-2) + return fib(n - 1) + fib(n - 2); +} +``` -----------------------
From b6688d7a8949694c2988d48c79f4ebd75d5229ed Mon Sep 17 00:00:00 2001 From: Qianzhengjun <55390356+Qianzhengjun@users.noreply.github.com> Date: Thu, 31 Mar 2022 11:37:47 +0800 Subject: [PATCH 218/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=860844.=20?= =?UTF-8?q?=E6=AF=94=E8=BE=83=E5=90=AB=E9=80=80=E6=A0=BC=E7=9A=84=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E4=B8=B2=E5=8F=8C=E6=8C=87=E9=92=88=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E7=9A=84Java=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0844.比较含退格的字符串.md | 30 +++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/problems/0844.比较含退格的字符串.md b/problems/0844.比较含退格的字符串.md index 00d52e42..0d83d425 100644 --- a/problems/0844.比较含退格的字符串.md +++ b/problems/0844.比较含退格的字符串.md @@ -185,6 +185,36 @@ class Solution { } ``` +双指针: + +```java +class Solution { +public static boolean backspaceCompare(String s, String t) { + char[] sarray = s.toCharArray(); + char[] tarray = t.toCharArray(); + return generate(sarray).equals(generate(tarray)); + } + public static String generate(char[] a){ + int slow = -1; + int fast = 0; + if(a.length == 1){ + return new String(a); + } else{ + for(fast = 0; fast < a.length; fast++){ + if(a[fast] != '#') + a[++slow] = a[fast]; + else{ + if(slow >= 0) + slow--; + } + } + return new String(a,0,slow + 1); + } + } +} +``` + + ### python From 6259a0e31769e1dcba1c54b20af6134ed6107120 Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Thu, 31 Mar 2022 15:09:10 +0800 Subject: [PATCH 219/328] remote $ --- problems/0005.最长回文子串.md | 10 ++--- problems/0027.移除元素.md | 16 ++++---- problems/0028.实现strStr.md | 4 +- problems/0042.接雨水.md | 8 ++-- problems/0053.最大子序和.md | 12 +++--- problems/0053.最大子序和(动态规划).md | 4 +- problems/0062.不同路径.md | 14 +++---- problems/0063.不同路径II.md | 4 +- .../0122.买卖股票的最佳时机II(动态规划).md | 8 ++-- problems/0139.单词拆分.md | 10 ++--- problems/0151.翻转字符串里的单词.md | 8 ++-- problems/0189.旋转数组.md | 4 +- problems/0209.长度最小的子数组.md | 16 ++++---- problems/0222.完全二叉树的节点个数.md | 12 +++--- problems/0242.有效的字母异位词.md | 4 +- problems/0283.移动零.md | 2 +- problems/0343.整数拆分.md | 4 +- problems/0349.两个数组的交集.md | 2 +- problems/0406.根据身高重建队列.md | 10 ++--- problems/0435.无重叠区间.md | 4 +- problems/0494.目标和.md | 4 +- problems/0509.斐波那契数.md | 12 +++--- problems/0673.最长递增子序列的个数.md | 6 +-- problems/0714.买卖股票的最佳时机含手续费.md | 12 +++--- problems/0739.每日温度.md | 10 ++--- problems/0746.使用最小花费爬楼梯.md | 8 ++-- problems/0844.比较含退格的字符串.md | 16 ++++---- problems/0922.按奇偶排序数组II.md | 16 ++++---- problems/0925.长按键入.md | 4 +- problems/0977.有序数组的平方.md | 4 +- problems/1049.最后一块石头的重量II.md | 4 +- ...n)的算法居然超时了,此时的n究竟是多大?.md | 18 ++++----- .../关于时间复杂度,你不知道的都在这里!.md | 40 +++++++++---------- problems/剑指Offer05.替换空格.md | 6 +-- problems/动态规划-股票问题总结篇.md | 32 +++++++-------- problems/动态规划理论基础.md | 2 +- problems/双指针总结.md | 16 ++++---- problems/回溯总结.md | 12 +++--- problems/回溯算法去重问题的另一种写法.md | 6 +-- problems/字符串总结.md | 6 +-- problems/数组总结篇.md | 12 +++--- .../根据身高重建队列(vector原理讲解).md | 8 ++-- problems/知识星球精选/刷力扣用不用库函数.md | 2 +- problems/背包问题理论基础多重背包.md | 4 +- problems/链表理论基础.md | 4 +- 45 files changed, 210 insertions(+), 210 deletions(-) diff --git a/problems/0005.最长回文子串.md b/problems/0005.最长回文子串.md index 8b3af3bb..eaebb5ab 100644 --- a/problems/0005.最长回文子串.md +++ b/problems/0005.最长回文子串.md @@ -38,7 +38,7 @@ 两层for循环,遍历区间起始位置和终止位置,然后判断这个区间是不是回文。 -时间复杂度:$O(n^3)$ +时间复杂度:O(n^3) ## 动态规划 @@ -205,8 +205,8 @@ public: ``` -* 时间复杂度:$O(n^2)$ -* 空间复杂度:$O(n^2)$ +* 时间复杂度:O(n^2) +* 空间复杂度:O(n^2) ## 双指针 @@ -253,8 +253,8 @@ public: ``` -* 时间复杂度:$O(n^2)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n^2) +* 空间复杂度:O(1) diff --git a/problems/0027.移除元素.md b/problems/0027.移除元素.md index 3a776837..8d6ca502 100644 --- a/problems/0027.移除元素.md +++ b/problems/0027.移除元素.md @@ -11,7 +11,7 @@ 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 -不要使用额外的数组空间,你必须仅使用 $O(1)$ 额外空间并**原地**修改输入数组。 +不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并**原地**修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 @@ -42,7 +42,7 @@ ![27.移除元素-暴力解法](https://tva1.sinaimg.cn/large/008eGmZEly1gntrc7x9tjg30du09m1ky.gif) -很明显暴力解法的时间复杂度是$O(n^2)$,这道题目暴力解法在leetcode上是可以过的。 +很明显暴力解法的时间复杂度是O(n^2),这道题目暴力解法在leetcode上是可以过的。 代码如下: @@ -68,8 +68,8 @@ public: }; ``` -* 时间复杂度:$O(n^2)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n^2) +* 空间复杂度:O(1) ### 双指针法 @@ -101,16 +101,16 @@ public: ``` 注意这些实现方法并没有改变元素的相对位置! -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n) +* 空间复杂度:O(1) 旧文链接:[数组:就移除个元素很难么?](https://programmercarl.com/0027.移除元素.html) ```CPP /** * 相向双指针方法,基于元素顺序可以改变的题目描述改变了元素相对位置,确保了移动最少元素 -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n) +* 空间复杂度:O(1) */ class Solution { public: diff --git a/problems/0028.实现strStr.md b/problems/0028.实现strStr.md index 854789ee..634d8535 100644 --- a/problems/0028.实现strStr.md +++ b/problems/0028.实现strStr.md @@ -229,9 +229,9 @@ next数组就可以是前缀表,但是很多实现都是把前缀表统一减 # 时间复杂度分析 -其中n为文本串长度,m为模式串长度,因为在匹配的过程中,根据前缀表不断调整匹配的位置,可以看出匹配的过程是$O(n)$,之前还要单独生成next数组,时间复杂度是$O(m)$。所以整个KMP算法的时间复杂度是$O(n+m)$的。 +其中n为文本串长度,m为模式串长度,因为在匹配的过程中,根据前缀表不断调整匹配的位置,可以看出匹配的过程是O(n),之前还要单独生成next数组,时间复杂度是O(m)。所以整个KMP算法的时间复杂度是O(n+m)的。 -暴力的解法显而易见是$O(n × m)$,所以**KMP在字符串匹配中极大的提高的搜索的效率。** +暴力的解法显而易见是O(n × m),所以**KMP在字符串匹配中极大的提高的搜索的效率。** 为了和力扣题目28.实现strStr保持一致,方便大家理解,以下文章统称haystack为文本串, needle为模式串。 diff --git a/problems/0042.接雨水.md b/problems/0042.接雨水.md index 75152eb7..b232ce22 100644 --- a/problems/0042.接雨水.md +++ b/problems/0042.接雨水.md @@ -129,8 +129,8 @@ public: }; ``` -因为每次遍历列的时候,还要向两边寻找最高的列,所以时间复杂度为$O(n^2)$。 -空间复杂度为$O(1)$。 +因为每次遍历列的时候,还要向两边寻找最高的列,所以时间复杂度为O(n^2)。 +空间复杂度为O(1)。 @@ -779,8 +779,8 @@ int trap(int* height, int heightSize) { } ``` -* 时间复杂度 $O(n)$ -* 空间复杂度 $O(1)$ +* 时间复杂度 O(n) +* 空间复杂度 O(1) ----------------------- diff --git a/problems/0053.最大子序和.md b/problems/0053.最大子序和.md index d699d49a..3d11c91e 100644 --- a/problems/0053.最大子序和.md +++ b/problems/0053.最大子序和.md @@ -21,8 +21,8 @@ 暴力解法的思路,第一层for 就是设置起始位置,第二层for循环遍历数组寻找最大值 -* 时间复杂度:$O(n^2)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n^2) +* 空间复杂度:O(1) ```CPP class Solution { @@ -98,8 +98,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n) +* 空间复杂度:O(1) 当然题目没有说如果数组为空,应该返回什么,所以数组为空的话返回啥都可以了。 @@ -128,8 +128,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(n) +* 空间复杂度:O(n) ## 总结 diff --git a/problems/0053.最大子序和(动态规划).md b/problems/0053.最大子序和(动态规划).md index 703e1dd6..4c883cb6 100644 --- a/problems/0053.最大子序和(动态规划).md +++ b/problems/0053.最大子序和(动态规划).md @@ -80,8 +80,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(n) +* 空间复杂度:O(n) ## 总结 diff --git a/problems/0062.不同路径.md b/problems/0062.不同路径.md index efa85a03..4a9af129 100644 --- a/problems/0062.不同路径.md +++ b/problems/0062.不同路径.md @@ -80,7 +80,7 @@ public: 那二叉树的节点个数就是 2^(m + n - 1) - 1。可以理解深搜的算法就是遍历了整个满二叉树(其实没有遍历整个满二叉树,只是近似而已) -所以上面深搜代码的时间复杂度为$O(2^{m + n - 1} - 1)$,可以看出,这是指数级别的时间复杂度,是非常大的。 +所以上面深搜代码的时间复杂度为O(2^(m + n - 1) - 1),可以看出,这是指数级别的时间复杂度,是非常大的。 ### 动态规划 @@ -143,8 +143,8 @@ public: }; ``` -* 时间复杂度:$O(m × n)$ -* 空间复杂度:$O(m × n)$ +* 时间复杂度:O(m × n) +* 空间复杂度:O(m × n) 其实用一个一维数组(也可以理解是滚动数组)就可以了,但是不利于理解,可以优化点空间,建议先理解了二维,在理解一维,C++代码如下: @@ -164,8 +164,8 @@ public: }; ``` -* 时间复杂度:$O(m × n)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(m × n) +* 空间复杂度:O(n) ### 数论方法 @@ -224,8 +224,8 @@ public: }; ``` -* 时间复杂度:$O(m)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(m) +* 空间复杂度:O(1) **计算组合问题的代码还是有难度的,特别是处理溢出的情况!** diff --git a/problems/0063.不同路径II.md b/problems/0063.不同路径II.md index 8e82007e..34df05d8 100644 --- a/problems/0063.不同路径II.md +++ b/problems/0063.不同路径II.md @@ -152,8 +152,8 @@ public: }; ``` -* 时间复杂度:$O(n × m)$,n、m 分别为obstacleGrid 长度和宽度 -* 空间复杂度:$O(n × m)$ +* 时间复杂度:O(n × m),n、m 分别为obstacleGrid 长度和宽度 +* 空间复杂度:O(n × m) ## 总结 diff --git a/problems/0122.买卖股票的最佳时机II(动态规划).md b/problems/0122.买卖股票的最佳时机II(动态规划).md index e5fdd53d..615d79bb 100644 --- a/problems/0122.买卖股票的最佳时机II(动态规划).md +++ b/problems/0122.买卖股票的最佳时机II(动态规划).md @@ -88,8 +88,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(n) +* 空间复杂度:O(n) 大家可以本题和[121. 买卖股票的最佳时机](https://programmercarl.com/0121.买卖股票的最佳时机.html)的代码几乎一样,唯一的区别在: @@ -121,8 +121,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n) +* 空间复杂度:O(1) diff --git a/problems/0139.单词拆分.md b/problems/0139.单词拆分.md index e04cb173..c087183a 100644 --- a/problems/0139.单词拆分.md +++ b/problems/0139.单词拆分.md @@ -66,8 +66,8 @@ public: }; ``` -* 时间复杂度:$O(2^n)$,因为每一个单词都有两个状态,切割和不切割 -* 空间复杂度:$O(n)$,算法递归系统调用栈的空间 +* 时间复杂度:O(2^n),因为每一个单词都有两个状态,切割和不切割 +* 空间复杂度:O(n),算法递归系统调用栈的空间 那么以上代码很明显要超时了,超时的数据如下: @@ -114,7 +114,7 @@ public: }; ``` -这个时间复杂度其实也是:$O(2^n)$。只不过对于上面那个超时测试用例优化效果特别明显。 +这个时间复杂度其实也是:O(2^n)。只不过对于上面那个超时测试用例优化效果特别明显。 **这个代码就可以AC了,当然回溯算法不是本题的主菜,背包才是!** @@ -207,8 +207,8 @@ public: }; ``` -* 时间复杂度:$O(n^3)$,因为substr返回子串的副本是$O(n)$的复杂度(这里的n是substring的长度) -* 空间复杂度:$O(n)$ +* 时间复杂度:O(n^3),因为substr返回子串的副本是$O(n)$的复杂度(这里的n是substring的长度) +* 空间复杂度:O(n) ## 总结 diff --git a/problems/0151.翻转字符串里的单词.md b/problems/0151.翻转字符串里的单词.md index 7588cbd6..8dfe9bbc 100644 --- a/problems/0151.翻转字符串里的单词.md +++ b/problems/0151.翻转字符串里的单词.md @@ -36,7 +36,7 @@ 一些同学会使用split库函数,分隔单词,然后定义一个新的string字符串,最后再把单词倒序相加,那么这道题题目就是一道水题了,失去了它的意义。 -所以这里我还是提高一下本题的难度:**不要使用辅助空间,空间复杂度要求为$O(1)$。** +所以这里我还是提高一下本题的难度:**不要使用辅助空间,空间复杂度要求为O(1)。** 不能使用辅助空间之后,那么只能在原字符串上下功夫了。 @@ -81,11 +81,11 @@ void removeExtraSpaces(string& s) { 如果不仔细琢磨一下erase的时间复杂读,还以为以上的代码是$O(n)$的时间复杂度呢。 -想一下真正的时间复杂度是多少,一个erase本来就是$O(n)$的操作,erase实现原理题目:[数组:就移除个元素很难么?](https://programmercarl.com/0027.移除元素.html),最优的算法来移除元素也要$O(n)$。 +想一下真正的时间复杂度是多少,一个erase本来就是O(n)的操作,erase实现原理题目:[数组:就移除个元素很难么?](https://programmercarl.com/0027.移除元素.html),最优的算法来移除元素也要O(n)。 -erase操作上面还套了一个for循环,那么以上代码移除冗余空格的代码时间复杂度为$O(n^2)$。 +erase操作上面还套了一个for循环,那么以上代码移除冗余空格的代码时间复杂度为O(n^2)。 -那么使用双指针法来去移除空格,最后resize(重新设置)一下字符串的大小,就可以做到$O(n)$的时间复杂度。 +那么使用双指针法来去移除空格,最后resize(重新设置)一下字符串的大小,就可以做到O(n)的时间复杂度。 如果对这个操作比较生疏了,可以再看一下这篇文章:[数组:就移除个元素很难么?](https://programmercarl.com/0027.移除元素.html)是如何移除元素的。 diff --git a/problems/0189.旋转数组.md b/problems/0189.旋转数组.md index bbe152a2..1efe9446 100644 --- a/problems/0189.旋转数组.md +++ b/problems/0189.旋转数组.md @@ -12,7 +12,7 @@ 进阶: 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。 -你可以使用空间复杂度为 $O(1)$ 的 原地 算法解决这个问题吗? +你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗? 示例 1: @@ -41,7 +41,7 @@ 本题其实和[字符串:剑指Offer58-II.左旋转字符串](https://programmercarl.com/剑指Offer58-II.左旋转字符串.html)就非常像了,剑指offer上左旋转,本题是右旋转。 -注意题目要求是**要求使用空间复杂度为 $O(1)$ 的 原地 算法** +注意题目要求是**要求使用空间复杂度为 O(1) 的 原地 算法** 那么我来提供一种旋转的方式哈。 diff --git a/problems/0209.长度最小的子数组.md b/problems/0209.长度最小的子数组.md index dc1d9f18..82a11381 100644 --- a/problems/0209.长度最小的子数组.md +++ b/problems/0209.长度最小的子数组.md @@ -20,7 +20,7 @@ ## 暴力解法 -这道题目暴力解法当然是 两个for循环,然后不断的寻找符合条件的子序列,时间复杂度很明显是$O(n^2)$。 +这道题目暴力解法当然是 两个for循环,然后不断的寻找符合条件的子序列,时间复杂度很明显是O(n^2)。 代码如下: @@ -47,8 +47,8 @@ public: } }; ``` -时间复杂度:$O(n^2)$ -空间复杂度:$O(1)$ +时间复杂度:O(n^2) +空间复杂度:O(1) ## 滑动窗口 @@ -80,7 +80,7 @@ public: ![leetcode_209](https://img-blog.csdnimg.cn/20210312160441942.png) -可以发现**滑动窗口的精妙之处在于根据当前子序列和大小的情况,不断调节子序列的起始位置。从而将$O(n^2)$的暴力解法降为$O(n)$。** +可以发现**滑动窗口的精妙之处在于根据当前子序列和大小的情况,不断调节子序列的起始位置。从而将O(n^2)暴力解法降为O(n)。** C++代码如下: @@ -107,12 +107,12 @@ public: }; ``` -时间复杂度:$O(n)$ -空间复杂度:$O(1)$ +时间复杂度:O(n) +空间复杂度:O(1) -**一些录友会疑惑为什么时间复杂度是$O(n)$**。 +**一些录友会疑惑为什么时间复杂度是O(n)**。 -不要以为for里放一个while就以为是$O(n^2)$啊, 主要是看每一个元素被操作的次数,每个元素在滑动窗后进来操作一次,出去操作一次,每个元素都是被被操作两次,所以时间复杂度是 2 × n 也就是$O(n)$。 +不要以为for里放一个while就以为是O(n^2)啊, 主要是看每一个元素被操作的次数,每个元素在滑动窗后进来操作一次,出去操作一次,每个元素都是被被操作两次,所以时间复杂度是 2 × n 也就是O(n)。 ## 相关题目推荐 diff --git a/problems/0222.完全二叉树的节点个数.md b/problems/0222.完全二叉树的节点个数.md index ffbc32ff..ba7acc5a 100644 --- a/problems/0222.完全二叉树的节点个数.md +++ b/problems/0222.完全二叉树的节点个数.md @@ -105,8 +105,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(\log n)$,算上了递归系统栈占用的空间 +* 时间复杂度:O(n) +* 空间复杂度:O(log n),算上了递归系统栈占用的空间 **网上基本都是这个精简的代码版本,其实不建议大家照着这个来写,代码确实精简,但隐藏了一些内容,连遍历的顺序都看不出来,所以初学者建议学习版本一的代码,稳稳的打基础**。 @@ -138,8 +138,8 @@ public: } }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(n) +* 空间复杂度:O(n) ## 完全二叉树 @@ -185,8 +185,8 @@ public: }; ``` -* 时间复杂度:$O(\log n × \log n)$ -* 空间复杂度:$O(\log n)$ +* 时间复杂度:O(log n × log n) +* 空间复杂度:O(log n) # 其他语言版本 diff --git a/problems/0242.有效的字母异位词.md b/problems/0242.有效的字母异位词.md index 52f8e667..080166fd 100644 --- a/problems/0242.有效的字母异位词.md +++ b/problems/0242.有效的字母异位词.md @@ -27,7 +27,7 @@ ## 思路 -先看暴力的解法,两层for循环,同时还要记录字符是否重复出现,很明显时间复杂度是 $O(n^2)$。 +先看暴力的解法,两层for循环,同时还要记录字符是否重复出现,很明显时间复杂度是 O(n^2)。 暴力的方法这里就不做介绍了,直接看一下有没有更优的方式。 @@ -55,7 +55,7 @@ 最后如果record数组所有元素都为零0,说明字符串s和t是字母异位词,return true。 -时间复杂度为$O(n)$,空间上因为定义是的一个常量大小的辅助数组,所以空间复杂度为$O(1)$。 +时间复杂度为O(n),空间上因为定义是的一个常量大小的辅助数组,所以空间复杂度为O(1)。 C++ 代码如下: diff --git a/problems/0283.移动零.md b/problems/0283.移动零.md index bb75a696..ed59d2c4 100644 --- a/problems/0283.移动零.md +++ b/problems/0283.移动零.md @@ -30,7 +30,7 @@ 好了,我们说一说双指针法,大家如果对双指针还不熟悉,可以看我的这篇总结[双指针法:总结篇!](https://programmercarl.com/双指针总结.html)。 -双指针法在数组移除元素中,可以达到$O(n)$的时间复杂度,在[27.移除元素](https://programmercarl.com/0027.移除元素.html)里已经详细讲解了,那么本题和移除元素其实是一个套路。 +双指针法在数组移除元素中,可以达到O(n)的时间复杂度,在[27.移除元素](https://programmercarl.com/0027.移除元素.html)里已经详细讲解了,那么本题和移除元素其实是一个套路。 **相当于对整个数组移除元素0,然后slowIndex之后都是移除元素0的冗余元素,把这些元素都赋值为0就可以了**。 diff --git a/problems/0343.整数拆分.md b/problems/0343.整数拆分.md index b6182ed6..777146ba 100644 --- a/problems/0343.整数拆分.md +++ b/problems/0343.整数拆分.md @@ -148,8 +148,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n) +* 空间复杂度:O(1) ## 总结 diff --git a/problems/0349.两个数组的交集.md b/problems/0349.两个数组的交集.md index 92342f17..82be1829 100644 --- a/problems/0349.两个数组的交集.md +++ b/problems/0349.两个数组的交集.md @@ -28,7 +28,7 @@ 注意题目特意说明:**输出结果中的每个元素一定是唯一的,也就是说输出的结果的去重的, 同时可以不考虑输出结果的顺序** -这道题用暴力的解法时间复杂度是$O(n^2)$,那来看看使用哈希法进一步优化。 +这道题用暴力的解法时间复杂度是O(n^2),那来看看使用哈希法进一步优化。 那么用数组来做哈希表也是不错的选择,例如[242. 有效的字母异位词](https://programmercarl.com/0242.有效的字母异位词.html) diff --git a/problems/0406.根据身高重建队列.md b/problems/0406.根据身高重建队列.md index 28eb5744..b2354d09 100644 --- a/problems/0406.根据身高重建队列.md +++ b/problems/0406.根据身高重建队列.md @@ -116,12 +116,12 @@ public: } }; ``` -* 时间复杂度:$O(n\log n + n^2)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(nlog n + n^2) +* 空间复杂度:O(n) 但使用vector是非常费时的,C++中vector(可以理解是一个动态数组,底层是普通数组实现的)如果插入元素大于预先普通数组大小,vector底部会有一个扩容的操作,即申请两倍于原先普通数组的大小,然后把数据拷贝到另一个更大的数组上。 -所以使用vector(动态数组)来insert,是费时的,插入再拷贝的话,单纯一个插入的操作就是$O(n^2)$了,甚至可能拷贝好几次,就不止$O(n^2)$了。 +所以使用vector(动态数组)来insert,是费时的,插入再拷贝的话,单纯一个插入的操作就是O(n^2)了,甚至可能拷贝好几次,就不止O(n^2)了。 改成链表之后,C++代码如下: @@ -150,8 +150,8 @@ public: }; ``` -* 时间复杂度:$O(n\log n + n^2)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(nlog n + n^2) +* 空间复杂度:O(n) 大家可以把两个版本的代码提交一下试试,就可以发现其差别了! diff --git a/problems/0435.无重叠区间.md b/problems/0435.无重叠区间.md index 389443d1..b24ca024 100644 --- a/problems/0435.无重叠区间.md +++ b/problems/0435.无重叠区间.md @@ -92,8 +92,8 @@ public: } }; ``` -* 时间复杂度:$O(n\log n)$ ,有一个快排 -* 空间复杂度:$O(1)$ +* 时间复杂度:O(nlog n) ,有一个快排 +* 空间复杂度:O(1) 大家此时会发现如此复杂的一个问题,代码实现却这么简单! diff --git a/problems/0494.目标和.md b/problems/0494.目标和.md index df667a85..99b76834 100644 --- a/problems/0494.目标和.md +++ b/problems/0494.目标和.md @@ -225,8 +225,8 @@ public: }; ``` -* 时间复杂度:$O(n × m)$,n为正数个数,m为背包容量 -* 空间复杂度:$O(m)$,m为背包容量 +* 时间复杂度:O(n × m),n为正数个数,m为背包容量 +* 空间复杂度:O(m),m为背包容量 ## 总结 diff --git a/problems/0509.斐波那契数.md b/problems/0509.斐波那契数.md index c6ce76c0..638bfdfe 100644 --- a/problems/0509.斐波那契数.md +++ b/problems/0509.斐波那契数.md @@ -101,8 +101,8 @@ public: } }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(n) +* 空间复杂度:O(n) 当然可以发现,我们只需要维护两个数值就可以了,不需要记录整个序列。 @@ -126,8 +126,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n) +* 空间复杂度:O(1) ### 递归解法 @@ -145,8 +145,8 @@ public: }; ``` -* 时间复杂度:$O(2^n)$ -* 空间复杂度:$O(n)$,算上了编程语言中实现递归的系统栈所占空间 +* 时间复杂度:O(2^n) +* 空间复杂度:O(n),算上了编程语言中实现递归的系统栈所占空间 这个递归的时间复杂度大家画一下树形图就知道了,如果不清晰的同学,可以看这篇:[通过一道面试题目,讲一讲递归算法的时间复杂度!](https://programmercarl.com/前序/通过一道面试题目,讲一讲递归算法的时间复杂度!.html) diff --git a/problems/0673.最长递增子序列的个数.md b/problems/0673.最长递增子序列的个数.md index 7ea91e97..9a2c5db2 100644 --- a/problems/0673.最长递增子序列的个数.md +++ b/problems/0673.最长递增子序列的个数.md @@ -216,10 +216,10 @@ public: }; ``` -* 时间复杂度:$O(n^2)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(n^2) +* 空间复杂度:O(n) -还有$O(n\log n)$的解法,使用树状数组,今天有点忙就先不写了,感兴趣的同学可以自行学习一下,这里有我之前写的树状数组系列博客:https://blog.csdn.net/youngyangyang04/category_871105.html (十年前的陈年老文了) +还有O(nlog n)的解法,使用树状数组,今天有点忙就先不写了,感兴趣的同学可以自行学习一下,这里有我之前写的树状数组系列博客:https://blog.csdn.net/youngyangyang04/category_871105.html (十年前的陈年老文了) # 其他语言版本 diff --git a/problems/0714.买卖股票的最佳时机含手续费.md b/problems/0714.买卖股票的最佳时机含手续费.md index fd42691b..2f27d6ea 100644 --- a/problems/0714.买卖股票的最佳时机含手续费.md +++ b/problems/0714.买卖股票的最佳时机含手续费.md @@ -84,8 +84,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n) +* 空间复杂度:O(1) 从代码中可以看出对情况一的操作,因为如果还在收获利润的区间里,表示并不是真正的卖出,而计算利润每次都要减去手续费,**所以要让minPrice = prices[i] - fee;,这样在明天收获利润的时候,才不会多减一次手续费!** @@ -117,8 +117,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(n) +* 空间复杂度:O(n) 当然可以对空间经行优化,因为当前状态只是依赖前一个状态。 @@ -141,8 +141,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n) +* 空间复杂度:O(1) ## 总结 diff --git a/problems/0739.每日温度.md b/problems/0739.每日温度.md index bdc75b96..710f5eb6 100644 --- a/problems/0739.每日温度.md +++ b/problems/0739.每日温度.md @@ -18,7 +18,7 @@ ## 思路 -首先想到的当然是暴力解法,两层for循环,把至少需要等待的天数就搜出来了。时间复杂度是$O(n^2)$ +首先想到的当然是暴力解法,两层for循环,把至少需要等待的天数就搜出来了。时间复杂度是O(n^2) 那么接下来在来看看使用单调栈的解法。 @@ -26,13 +26,13 @@ **通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了**。 -时间复杂度为$O(n)$。 +时间复杂度为O(n)。 例如本题其实就是找找到一个元素右边第一个比自己大的元素。 此时就应该想到用单调栈了。 -那么单调栈的原理是什么呢?为什么时间复杂度是$O(n)$就可以找到每一个元素的右边第一个比它大的元素位置呢? +那么单调栈的原理是什么呢?为什么时间复杂度是O(n)就可以找到每一个元素的右边第一个比它大的元素位置呢? 单调栈的本质是空间换时间,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素的元素,优点是只需要遍历一次。 @@ -164,8 +164,8 @@ public: } }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(n) +* 空间复杂度:O(n) 精简的代码是直接把情况一二三都合并到了一起,其实这种代码精简是精简,但思路不是很清晰。 diff --git a/problems/0746.使用最小花费爬楼梯.md b/problems/0746.使用最小花费爬楼梯.md index e94e4d24..c356955a 100644 --- a/problems/0746.使用最小花费爬楼梯.md +++ b/problems/0746.使用最小花费爬楼梯.md @@ -113,8 +113,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(n) +* 空间复杂度:O(n) 还可以优化空间复杂度,因为dp[i]就是由前两位推出来的,那么也不用dp数组了,C++代码如下: @@ -136,8 +136,8 @@ public: ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n) +* 空间复杂度:O(1) **当然我不建议这么写,能写出版本一就可以了,直观简洁!** diff --git a/problems/0844.比较含退格的字符串.md b/problems/0844.比较含退格的字符串.md index 00d52e42..3bbfb73e 100644 --- a/problems/0844.比较含退格的字符串.md +++ b/problems/0844.比较含退格的字符串.md @@ -36,7 +36,7 @@ ## 思路 -本文将给出 空间复杂度$O(n)$的栈模拟方法 以及空间复杂度是$O(1)$的双指针方法。 +本文将给出 空间复杂度O(n)的栈模拟方法 以及空间复杂度是O(1)的双指针方法。 ## 普通方法(使用栈的思路) @@ -71,8 +71,8 @@ public: } }; ``` -* 时间复杂度:$O(n + m)$,n为S的长度,m为T的长度 ,也可以理解是$O(n)$的时间复杂度 -* 空间复杂度:$O(n + m)$ +* 时间复杂度:O(n + m),n为S的长度,m为T的长度 ,也可以理解是$O(n)$的时间复杂度 +* 空间复杂度:O(n + m) 当然以上代码,大家可以发现有重复的逻辑处理S,处理T,可以把这块公共逻辑抽离出来,代码精简如下: @@ -97,12 +97,12 @@ public: ``` 性能依然是: -* 时间复杂度:$O(n + m)$ -* 空间复杂度:$O(n + m)$ +* 时间复杂度:O(n + m) +* 空间复杂度:O(n + m) ## 优化方法(从后向前双指针) -当然还可以有使用 $O(1)$ 的空间复杂度来解决该问题。 +当然还可以有使用 O(1) 的空间复杂度来解决该问题。 同时从后向前遍历S和T(i初始为S末尾,j初始为T末尾),记录#的数量,模拟消除的操作,如果#用完了,就开始比较S[i]和S[j]。 @@ -151,8 +151,8 @@ public: }; ``` -* 时间复杂度:$O(n + m)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n + m) +* 空间复杂度:O(1) ## 其他语言版本 diff --git a/problems/0922.按奇偶排序数组II.md b/problems/0922.按奇偶排序数组II.md index 19675e7f..4ff419d3 100644 --- a/problems/0922.按奇偶排序数组II.md +++ b/problems/0922.按奇偶排序数组II.md @@ -26,11 +26,11 @@ ## 思路 -这道题目直接的想法可能是两层for循环再加上used数组表示使用过的元素。这样的的时间复杂度是$O(n^2)$。 +这道题目直接的想法可能是两层for循环再加上used数组表示使用过的元素。这样的的时间复杂度是O(n^2)。 ### 方法一 -其实这道题可以用很朴实的方法,时间复杂度就就是$O(n)$了,C++代码如下: +其实这道题可以用很朴实的方法,时间复杂度就就是O(n)了,C++代码如下: ```CPP class Solution { @@ -57,8 +57,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(n) +* 空间复杂度:O(n) ### 方法二 @@ -86,8 +86,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(n) +* 空间复杂度:O(n) ### 方法三 @@ -109,8 +109,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n) +* 空间复杂度:O(1) 这里时间复杂度并不是$O(n^2)$,因为偶数位和奇数位都只操作一次,不是n/2 * n/2的关系,而是n/2 + n/2的关系! diff --git a/problems/0925.长按键入.md b/problems/0925.长按键入.md index 3aacee5c..0ef5a3d7 100644 --- a/problems/0925.长按键入.md +++ b/problems/0925.长按键入.md @@ -90,8 +90,8 @@ public: ``` -时间复杂度:$O(n)$ -空间复杂度:$O(1)$ +时间复杂度:O(n) +空间复杂度:O(1) ## 其他语言版本 diff --git a/problems/0977.有序数组的平方.md b/problems/0977.有序数组的平方.md index b11fa7ef..24276bcf 100644 --- a/problems/0977.有序数组的平方.md +++ b/problems/0977.有序数组的平方.md @@ -40,7 +40,7 @@ public: }; ``` -这个时间复杂度是 $O(n + n\log n)$, 可以说是$O(n\log n)$的时间复杂度,但为了和下面双指针法算法时间复杂度有鲜明对比,我记为 $O(n + n\log n)$。 +这个时间复杂度是 O(n + nlogn), 可以说是O(nlogn)的时间复杂度,但为了和下面双指针法算法时间复杂度有鲜明对比,我记为 O(n + nlog n)。 ## 双指针法 @@ -83,7 +83,7 @@ public: }; ``` -此时的时间复杂度为$O(n)$,相对于暴力排序的解法$O(n + n\log n)$还是提升不少的。 +此时的时间复杂度为O(n),相对于暴力排序的解法O(n + nlog n)还是提升不少的。 **这里还是说一下,大家不必太在意leetcode上执行用时,打败多少多少用户,这个就是一个玩具,非常不准确。** diff --git a/problems/1049.最后一块石头的重量II.md b/problems/1049.最后一块石头的重量II.md index 7b67b1ac..ee0ddef2 100644 --- a/problems/1049.最后一块石头的重量II.md +++ b/problems/1049.最后一块石头的重量II.md @@ -136,8 +136,8 @@ public: ``` -* 时间复杂度:$O(m × n)$ , m是石头总重量(准确的说是总重量的一半),n为石头块数 -* 空间复杂度:$O(m)$ +* 时间复杂度:O(m × n) , m是石头总重量(准确的说是总重量的一半),n为石头块数 +* 空间复杂度:O(m) ## 总结 diff --git a/problems/O(n)的算法居然超时了,此时的n究竟是多大?.md b/problems/O(n)的算法居然超时了,此时的n究竟是多大?.md index 4de56597..75f441db 100644 --- a/problems/O(n)的算法居然超时了,此时的n究竟是多大?.md +++ b/problems/O(n)的算法居然超时了,此时的n究竟是多大?.md @@ -3,7 +3,7 @@

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

-# 程序提交之后为什么会超时?$O(n)$的算法会超时,n究竟是多大? +# 程序提交之后为什么会超时?O(n)的算法会超时,n究竟是多大? 一些同学可能对计算机运行的速度还没有概念,就是感觉计算机运行速度应该会很快,那么在leetcode上做算法题目的时候为什么会超时呢? @@ -18,9 +18,9 @@ 也就是说程序运行的时间超过了规定的时间,一般OJ(online judge)的超时时间就是1s,也就是用例数据输入后最多要1s内得到结果,暂时还不清楚leetcode的判题规则,下文为了方便讲解,暂定超时时间就是1s。 -如果写出了一个$O(n)$的算法 ,其实可以估算出来n是多大的时候算法的执行时间就会超过1s了。 +如果写出了一个O(n)的算法 ,其实可以估算出来n是多大的时候算法的执行时间就会超过1s了。 -如果n的规模已经足够让$O(n)$的算法运行时间超过了1s,就应该考虑log(n)的解法了。 +如果n的规模已经足够让O(n)的算法运行时间超过了1s,就应该考虑log(n)的解法了。 # 从硬件配置看计算机的性能 @@ -63,7 +63,7 @@ 测试硬件:2015年MacPro,CPU配置:2.7 GHz Dual-Core Intel Core i5 -实现三个函数,时间复杂度分别是 $O(n)$ , $O(n^2)$, $O(n\log n)$,使用加法运算来统一测试。 +实现三个函数,时间复杂度分别是 O(n) , O(n^2), O(nlog n),使用加法运算来统一测试。 ```CPP // O(n) @@ -128,19 +128,19 @@ int main() { ![程序超时2](https://img-blog.csdnimg.cn/20200729200018460.png) -O(n)的算法,1s内大概计算机可以运行 5 * (10^8)次计算,可以推测一下$O(n^2)$ 的算法应该1s可以处理的数量级的规模是 5 * (10^8)开根号,实验数据如下。 +O(n)的算法,1s内大概计算机可以运行 5 * (10^8)次计算,可以推测一下O(n^2) 的算法应该1s可以处理的数量级的规模是 5 * (10^8)开根号,实验数据如下。 ![程序超时3](https://img-blog.csdnimg.cn/2020072919590970.png) O(n^2)的算法,1s内大概计算机可以运行 22500次计算,验证了刚刚的推测。 -在推测一下$O(n\log n)$的话, 1s可以处理的数据规模是什么呢? +在推测一下O(nlogn)的话, 1s可以处理的数据规模是什么呢? -理论上应该是比 $O(n)$少一个数量级,因为$\log n$的复杂度 其实是很快,看一下实验数据。 +理论上应该是比 O(n)少一个数量级,因为logn的复杂度 其实是很快,看一下实验数据。 ![程序超时4](https://img-blog.csdnimg.cn/20200729195729407.png) -$O(n \logn)$的算法,1s内大概计算机可以运行 2 * (10^7)次计算,符合预期。 +O(nlogn)的算法,1s内大概计算机可以运行 2 * (10^7)次计算,符合预期。 这是在我个人PC上测出来的数据,不能说是十分精确,但数量级是差不多的,大家也可以在自己的计算机上测一下。 @@ -209,7 +209,7 @@ int main() { # 总结 -本文详细分析了在leetcode上做题程序为什么会有超时,以及从硬件配置上大体知道CPU的执行速度,然后亲自做一个实验来看看$O(n)$的算法,跑一秒钟,这个n究竟是做大,最后给出不同时间复杂度,一秒内可以运算出来的n的大小。 +本文详细分析了在leetcode上做题程序为什么会有超时,以及从硬件配置上大体知道CPU的执行速度,然后亲自做一个实验来看看O(n)的算法,跑一秒钟,这个n究竟是做大,最后给出不同时间复杂度,一秒内可以运算出来的n的大小。 建议录友们也都自己做一做实验,测一测,看看是不是和我的测出来的结果差不多。 diff --git a/problems/关于时间复杂度,你不知道的都在这里!.md b/problems/关于时间复杂度,你不知道的都在这里!.md index b6477249..77fdacc4 100644 --- a/problems/关于时间复杂度,你不知道的都在这里!.md +++ b/problems/关于时间复杂度,你不知道的都在这里!.md @@ -16,21 +16,21 @@ 那么该如何估计程序运行时间呢,通常会估算算法的操作单元数量来代表程序消耗的时间,这里默认CPU的每个单元运行消耗的时间都是相同的。 -假设算法的问题规模为n,那么操作单元数量便用函数f(n)来表示,随着数据规模n的增大,算法执行时间的增长率和f(n)的增长率相同,这称作为算法的渐近时间复杂度,简称时间复杂度,记为 $O(f(n))$。 +假设算法的问题规模为n,那么操作单元数量便用函数f(n)来表示,随着数据规模n的增大,算法执行时间的增长率和f(n)的增长率相同,这称作为算法的渐近时间复杂度,简称时间复杂度,记为 O(f(n))。 ## 什么是大O -这里的大O是指什么呢,说到时间复杂度,**大家都知道$O(n)$,$O(n^2)$,却说不清什么是大O**。 +这里的大O是指什么呢,说到时间复杂度,**大家都知道O(n),O(n^2),却说不清什么是大O**。 算法导论给出的解释:**大O用来表示上界的**,当用它作为算法的最坏情况运行时间的上界,就是对任意数据输入的运行时间的上界。 同样算法导论给出了例子:拿插入排序来说,插入排序的时间复杂度我们都说是$O(n^2)$ 。 -输入数据的形式对程序运算时间是有很大影响的,在数据本来有序的情况下时间复杂度是$O(n)$,但如果数据是逆序的话,插入排序的时间复杂度就是$O(n^2)$,也就对于所有输入情况来说,最坏是$O(n^2)$ 的时间复杂度,所以称插入排序的时间复杂度为$O(n^2)$。 +输入数据的形式对程序运算时间是有很大影响的,在数据本来有序的情况下时间复杂度是O(n),但如果数据是逆序的话,插入排序的时间复杂度就是O(n^2),也就对于所有输入情况来说,最坏是O(n^2) 的时间复杂度,所以称插入排序的时间复杂度为O(n^2)。 -同样的同理再看一下快速排序,都知道快速排序是$O(n\log n)$,但是当数据已经有序情况下,快速排序的时间复杂度是$O(n^2)$ 的,**所以严格从大O的定义来讲,快速排序的时间复杂度应该是$O(n^2)$**。 +同样的同理再看一下快速排序,都知道快速排序是O(nlog n),但是当数据已经有序情况下,快速排序的时间复杂度是O(n^2) 的,**所以严格从大O的定义来讲,快速排序的时间复杂度应该是O(n^2)**。 -**但是我们依然说快速排序是$O(n\log n)$的时间复杂度,这个就是业内的一个默认规定,这里说的O代表的就是一般情况,而不是严格的上界**。如图所示: +**但是我们依然说快速排序是O(nlog n)的时间复杂度,这个就是业内的一个默认规定,这里说的O代表的就是一般情况,而不是严格的上界**。如图所示: ![时间复杂度4,一般情况下的时间复杂度](https://img-blog.csdnimg.cn/20200728185745611.png) 我们主要关心的还是一般情况下的数据形式。 @@ -46,9 +46,9 @@ 在决定使用哪些算法的时候,不是时间复杂越低的越好(因为简化后的时间复杂度忽略了常数项等等),要考虑数据规模,如果数据规模很小甚至可以用$O(n^2)$的算法比$O(n)$的更合适(在有常数项的时候)。 -就像上图中 $O(5n^2)$ 和 $O(100n)$ 在n为20之前 很明显 $O(5n^2)$是更优的,所花费的时间也是最少的。 +就像上图中 O(5n^2) 和 O(100n) 在n为20之前 很明显 O(5n^2)是更优的,所花费的时间也是最少的。 -那为什么在计算时间复杂度的时候要忽略常数项系数呢,也就说$O(100n)$ 就是$O(n)$的时间复杂度,$O(5n^2)$ 就是$O(n^2)$的时间复杂度,而且要默认$O(n)$ 优于$O(n^2)$ 呢 ? +那为什么在计算时间复杂度的时候要忽略常数项系数呢,也就说O(100n) 就是O(n)的时间复杂度,O(5n^2) 就是O(n^2)的时间复杂度,而且要默认O(n) 优于O(n^2) 呢 ? 这里就又涉及到大O的定义,**因为大O就是数据量级突破一个点且数据量级非常大的情况下所表现出的时间复杂度,这个数据量也就是常数项系数已经不起决定性作用的数据量**。 @@ -56,13 +56,13 @@ **所以我们说的时间复杂度都是省略常数项系数的,是因为一般情况下都是默认数据规模足够的大,基于这样的事实,给出的算法时间复杂的的一个排行如下所示**: -O(1) 常数阶 < $O(\log n)$ 对数阶 < $O(n)$ 线性阶 < $O(n^2)$ 平方阶 < $O(n^3)$ 立方阶 < $O(2^n)$指数阶 +O(1) 常数阶 < O(\log n) 对数阶 < O(n) 线性阶 < O(n^2) 平方阶 < O(n^3) 立方阶 < O(2^n)指数阶 但是也要注意大常数,如果这个常数非常大,例如10^7 ,10^9 ,那么常数就是不得不考虑的因素了。 ## 复杂表达式的化简 -有时候我们去计算时间复杂度的时候发现不是一个简单的$O(n)$ 或者$O(n^2)$, 而是一个复杂的表达式,例如: +有时候我们去计算时间复杂度的时候发现不是一个简单的O(n) 或者O(n^2), 而是一个复杂的表达式,例如: ``` O(2*n^2 + 10*n + 1000) @@ -88,19 +88,19 @@ O(n^2 + n) O(n^2) ``` -如果这一步理解有困难,那也可以做提取n的操作,变成$O(n(n+1))$,省略加法常数项后也就别变成了: +如果这一步理解有困难,那也可以做提取n的操作,变成O(n(n+1)),省略加法常数项后也就别变成了: ``` O(n^2) ``` -所以最后我们说:这个算法的算法时间复杂度是$O(n^2)$ 。 +所以最后我们说:这个算法的算法时间复杂度是O(n^2) 。 -也可以用另一种简化的思路,其实当n大于40的时候, 这个复杂度会恒小于$O(3 × n^2)$, -$O(2 × n^2 + 10 × n + 1000)$ < $O(3 × n^2)$,所以说最后省略掉常数项系数最终时间复杂度也是$O(n^2)$。 +也可以用另一种简化的思路,其实当n大于40的时候, 这个复杂度会恒小于O(3 × n^2), +O(2 × n^2 + 10 × n + 1000) < O(3 × n^2),所以说最后省略掉常数项系数最终时间复杂度也是O(n^2)。 -## $O(\log n)$中的log是以什么为底? +## O(log n)中的log是以什么为底? 平时说这个算法的时间复杂度是logn的,那么一定是log 以2为底n的对数么? @@ -123,21 +123,21 @@ $O(2 × n^2 + 10 × n + 1000)$ < $O(3 × n^2)$,所以说最后省略掉常数 通过这道面试题目,来分析一下时间复杂度。题目描述:找出n个字符串中相同的两个字符串(假设这里只有两个相同的字符串)。 -如果是暴力枚举的话,时间复杂度是多少呢,是$O(n^2)$么? +如果是暴力枚举的话,时间复杂度是多少呢,是O(n^2)么? -这里一些同学会忽略了字符串比较的时间消耗,这里并不像int 型数字做比较那么简单,除了$n^2$次的遍历次数外,字符串比较依然要消耗m次操作(m也就是字母串的长度),所以时间复杂度是$O(m × n × n)$。 +这里一些同学会忽略了字符串比较的时间消耗,这里并不像int 型数字做比较那么简单,除了n^2次的遍历次数外,字符串比较依然要消耗m次操作(m也就是字母串的长度),所以时间复杂度是$O(m × n × n)$。 接下来再想一下其他解题思路。 先排对n个字符串按字典序来排序,排序后n个字符串就是有序的,意味着两个相同的字符串就是挨在一起,然后在遍历一遍n个字符串,这样就找到两个相同的字符串了。 -那看看这种算法的时间复杂度,快速排序时间复杂度为$O(n\log n)$,依然要考虑字符串的长度是m,那么快速排序每次的比较都要有m次的字符比较的操作,就是$O(m × n × \log n)$。 +那看看这种算法的时间复杂度,快速排序时间复杂度为O(nlog n),依然要考虑字符串的长度是m,那么快速排序每次的比较都要有m次的字符比较的操作,就是O(m × n × log n)。 -之后还要遍历一遍这n个字符串找出两个相同的字符串,别忘了遍历的时候依然要比较字符串,所以总共的时间复杂度是 $O(m × n × \log n + n × m)$。 +之后还要遍历一遍这n个字符串找出两个相同的字符串,别忘了遍历的时候依然要比较字符串,所以总共的时间复杂度是 O(m × n × log n + n × m)。 -我们对$O(m × n × \log n + n × m)$进行简化操作,把$m × n$提取出来变成$O(m × n × (\log n + 1)$),再省略常数项最后的时间复杂度是$O(m × n × \log n)$。 +我们对O(m × n × log n + n × m)进行简化操作,把m × n提取出来变成O(m × n × (log n + 1)),再省略常数项最后的时间复杂度是O(m × n × log n)。 -最后很明显$O(m × n × \log n)$ 要优于$O(m × n × n)$! +最后很明显O(m × n × log n) 要优于O(m × n × n)! 所以先把字符串集合排序再遍历一遍找到两个相同字符串的方法要比直接暴力枚举的方式更快。 diff --git a/problems/剑指Offer05.替换空格.md b/problems/剑指Offer05.替换空格.md index 21fc0602..037bd427 100644 --- a/problems/剑指Offer05.替换空格.md +++ b/problems/剑指Offer05.替换空格.md @@ -29,7 +29,7 @@ i指向新长度的末尾,j指向旧长度的末尾。 有同学问了,为什么要从后向前填充,从前向后填充不行么? -从前向后填充就是$O(n^2)$的算法了,因为每次添加元素都要将添加元素之后的所有元素向后移动。 +从前向后填充就是O(n^2)的算法了,因为每次添加元素都要将添加元素之后的所有元素向后移动。 **其实很多数组填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。** @@ -74,8 +74,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n) +* 空间复杂度:O(1) 此时算上本题,我们已经做了七道双指针相关的题目了分别是: diff --git a/problems/动态规划-股票问题总结篇.md b/problems/动态规划-股票问题总结篇.md index e1fb477b..47a9b34b 100644 --- a/problems/动态规划-股票问题总结篇.md +++ b/problems/动态规划-股票问题总结篇.md @@ -72,8 +72,8 @@ public: } }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(n) +* 空间复杂度:O(n) 使用滚动数组,代码如下: @@ -95,8 +95,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n) +* 空间复杂度:O(1) ## 买卖股票的最佳时机II @@ -121,8 +121,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n) +* 空间复杂度:O(1) 【动态规划】 @@ -162,8 +162,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(n) +* 空间复杂度:O(n) ## 买卖股票的最佳时机III @@ -226,8 +226,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(n × 5)$ +* 时间复杂度:O(n) +* 空间复杂度:O(n × 5) 当然,大家可以看到力扣官方题解里的一种优化空间写法,我这里给出对应的C++版本: @@ -251,8 +251,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n) +* 空间复杂度:O(1) **这种写法看上去简单,其实思路很绕,不建议大家这么写,这么思考,很容易把自己绕进去!** 对于本题,把版本一的写法研究明白,足以! @@ -404,8 +404,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(n) +* 空间复杂度:O(n) ## 买卖股票的最佳时机含手续费 @@ -456,8 +456,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(n) +* 空间复杂度:O(n) ## 总结 diff --git a/problems/动态规划理论基础.md b/problems/动态规划理论基础.md index e94295a5..66971fce 100644 --- a/problems/动态规划理论基础.md +++ b/problems/动态规划理论基础.md @@ -16,7 +16,7 @@ 所以动态规划中每一个状态一定是由上一个状态推导出来的,**这一点就区分于贪心**,贪心没有状态推导,而是从局部直接选最优的, -在[关于贪心算法,你该了解这些!](https://mp.weixin.qq.com/s/A9MHJi1a5uugFaqp8QJFWg)中我举了一个背包问题的例子。 +在[关于贪心算法,你该了解这些!](https://programmercarl.com/%E8%B4%AA%E5%BF%83%E7%AE%97%E6%B3%95%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html)中我举了一个背包问题的例子。 例如:有N件物品和一个最多能背重量为W 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。**每件物品只能用一次**,求解将哪些物品装入背包里物品价值总和最大。 diff --git a/problems/双指针总结.md b/problems/双指针总结.md index e866aa66..39096ff7 100644 --- a/problems/双指针总结.md +++ b/problems/双指针总结.md @@ -22,7 +22,7 @@ for (int i = 0; i < array.size(); i++) { } ``` -这个代码看上去好像是$O(n)$的时间复杂度,其实是$O(n^2)$的时间复杂度,因为erase操作也是$O(n)$的操作。 +这个代码看上去好像是O(n)的时间复杂度,其实是O(n^2)的时间复杂度,因为erase操作也是O(n)的操作。 所以此时使用双指针法才展现出效率的优势:**通过两个指针在一个for循环下完成两个for循环的工作。** @@ -30,7 +30,7 @@ for (int i = 0; i < array.size(); i++) { 在[字符串:这道题目,使用库函数一行代码搞定](https://programmercarl.com/0344.反转字符串.html)中讲解了反转字符串,注意这里强调要原地反转,要不然就失去了题目的意义。 -使用双指针法,**定义两个指针(也可以说是索引下标),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。**,时间复杂度是$O(n)$。 +使用双指针法,**定义两个指针(也可以说是索引下标),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。**,时间复杂度是O(n)。 在[替换空格](https://programmercarl.com/剑指Offer05.替换空格.html) 中介绍使用双指针填充字符串的方法,如果想把这道题目做到极致,就不要只用额外的辅助空间了! @@ -38,13 +38,13 @@ for (int i = 0; i < array.size(); i++) { 有同学问了,为什么要从后向前填充,从前向后填充不行么? -从前向后填充就是$O(n^2)$的算法了,因为每次添加元素都要将添加元素之后的所有元素向后移动。 +从前向后填充就是O(n^2)的算法了,因为每次添加元素都要将添加元素之后的所有元素向后移动。 **其实很多数组(字符串)填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。** -那么在[字符串:花式反转还不够!](https://programmercarl.com/0151.翻转字符串里的单词.html)中,我们使用双指针法,用$O(n)$的时间复杂度完成字符串删除类的操作,因为题目要产出冗余空格。 +那么在[字符串:花式反转还不够!](https://programmercarl.com/0151.翻转字符串里的单词.html)中,我们使用双指针法,用O(n)的时间复杂度完成字符串删除类的操作,因为题目要产出冗余空格。 -**在删除冗余空格的过程中,如果不注意代码效率,很容易写成了$O(n^2)$的时间复杂度。其实使用双指针法$O(n)$就可以搞定。** +**在删除冗余空格的过程中,如果不注意代码效率,很容易写成了O(n^2)的时间复杂度。其实使用双指针法O(n)就可以搞定。** **主要还是大家用erase用的比较随意,一定要注意for循环下用erase的情况,一般可以用双指针写效率更高!** @@ -74,15 +74,15 @@ for (int i = 0; i < array.size(); i++) { 去重的过程不好处理,有很多小细节,如果在面试中很难想到位。 -时间复杂度可以做到$O(n^2)$,但还是比较费时的,因为不好做剪枝操作。 +时间复杂度可以做到O(n^2),但还是比较费时的,因为不好做剪枝操作。 所以这道题目使用双指针法才是最为合适的,用双指针做这道题目才能就能真正体会到,**通过前后两个指针不算向中间逼近,在一个for循环下完成两个for循环的工作。** -只用双指针法时间复杂度为$O(n^2)$,但比哈希法的$O(n^2)$效率高得多,哈希法在使用两层for循环的时候,能做的剪枝操作很有限。 +只用双指针法时间复杂度为O(n^2),但比哈希法的O(n^2)效率高得多,哈希法在使用两层for循环的时候,能做的剪枝操作很有限。 在[双指针法:一样的道理,能解决四数之和](https://programmercarl.com/0018.四数之和.html)中,讲到了四数之和,其实思路是一样的,**在三数之和的基础上再套一层for循环,依然是使用双指针法。** -对于三数之和使用双指针法就是将原本暴力$O(n^3)$的解法,降为$O(n^2)$的解法,四数之和的双指针解法就是将原本暴力$O(n^4)$的解法,降为$O(n^3)$的解法。 +对于三数之和使用双指针法就是将原本暴力O(n^3)的解法,降为O(n^2)的解法,四数之和的双指针解法就是将原本暴力O(n^4)的解法,降为O(n^3)的解法。 同样的道理,五数之和,n数之和都是在这个基础上累加。 diff --git a/problems/回溯总结.md b/problems/回溯总结.md index bd0db575..5b8e2276 100644 --- a/problems/回溯总结.md +++ b/problems/回溯总结.md @@ -302,11 +302,11 @@ if (startIndex >= nums.size()) { // 终止条件可以不加 **而使用used数组在时间复杂度上几乎没有额外负担!** -**使用set去重,不仅时间复杂度高了,空间复杂度也高了**,在[本周小结!(回溯算法系列三)](https://programmercarl.com/周总结/20201112回溯周末总结.html)中分析过,组合,子集,排列问题的空间复杂度都是$O(n)$,但如果使用set去重,空间复杂度就变成了$O(n^2)$,因为每一层递归都有一个set集合,系统栈空间是n,每一个空间都有set集合。 +**使用set去重,不仅时间复杂度高了,空间复杂度也高了**,在[本周小结!(回溯算法系列三)](https://programmercarl.com/周总结/20201112回溯周末总结.html)中分析过,组合,子集,排列问题的空间复杂度都是O(n),但如果使用set去重,空间复杂度就变成了$O(n^2)$,因为每一层递归都有一个set集合,系统栈空间是n,每一个空间都有set集合。 -那有同学可能疑惑 用used数组也是占用$O(n)$的空间啊? +那有同学可能疑惑 用used数组也是占用O(n)的空间啊? -used数组可是全局变量,每层与每层之间公用一个used数组,所以空间复杂度是$O(n + n)$,最终空间复杂度还是$O(n)$。 +used数组可是全局变量,每层与每层之间公用一个used数组,所以空间复杂度是O(n + n),最终空间复杂度还是O(n)。 # 重新安排行程(图论额外拓展) @@ -380,8 +380,8 @@ used数组可是全局变量,每层与每层之间公用一个used数组,所 以下在计算空间复杂度的时候我都把系统栈(不是数据结构里的栈)所占空间算进去。 子集问题分析: -* 时间复杂度:O(2^n),因为每一个元素的状态无外乎取与不取,所以时间复杂度为$O(2^n)$ -* 空间复杂度:O(n),递归深度为n,所以系统栈所用空间为$O(n)$,每一层递归所用的空间都是常数级别,注意代码里的result和path都是全局变量,就算是放在参数里,传的也是引用,并不会新申请内存空间,最终空间复杂度为$O(n)$ +* 时间复杂度:O(2^n),因为每一个元素的状态无外乎取与不取,所以时间复杂度为O(2^n) +* 空间复杂度:O(n),递归深度为n,所以系统栈所用空间为O(n),每一层递归所用的空间都是常数级别,注意代码里的result和path都是全局变量,就算是放在参数里,传的也是引用,并不会新申请内存空间,最终空间复杂度为O(n) 排列问题分析: * 时间复杂度:O(n!),这个可以从排列的树形图中很明显发现,每一层节点为n,第二层每一个分支都延伸了n-1个分支,再往下又是n-2个分支,所以一直到叶子节点一共就是 n * n-1 * n-2 * ..... 1 = n!。 @@ -392,7 +392,7 @@ used数组可是全局变量,每层与每层之间公用一个used数组,所 * 空间复杂度:O(n),和子集问题同理。 N皇后问题分析: -* 时间复杂度:O(n!) ,其实如果看树形图的话,直觉上是$O(n^n)$,但皇后之间不能见面所以在搜索的过程中是有剪枝的,最差也就是O(n!),n!表示n * (n-1) * .... * 1。 +* 时间复杂度:O(n!) ,其实如果看树形图的话,直觉上是O(n^n),但皇后之间不能见面所以在搜索的过程中是有剪枝的,最差也就是O(n!),n!表示n * (n-1) * .... * 1。 * 空间复杂度:O(n),和子集问题同理。 解数独问题分析: diff --git a/problems/回溯算法去重问题的另一种写法.md b/problems/回溯算法去重问题的另一种写法.md index 7a601493..b4bdda00 100644 --- a/problems/回溯算法去重问题的另一种写法.md +++ b/problems/回溯算法去重问题的另一种写法.md @@ -226,11 +226,11 @@ public: **而使用used数组在时间复杂度上几乎没有额外负担!** -**使用set去重,不仅时间复杂度高了,空间复杂度也高了**,在[本周小结!(回溯算法系列三)](https://programmercarl.com/周总结/20201112回溯周末总结.html)中分析过,组合,子集,排列问题的空间复杂度都是$O(n)$,但如果使用set去重,空间复杂度就变成了$O(n^2)$,因为每一层递归都有一个set集合,系统栈空间是n,每一个空间都有set集合。 +**使用set去重,不仅时间复杂度高了,空间复杂度也高了**,在[本周小结!(回溯算法系列三)](https://programmercarl.com/周总结/20201112回溯周末总结.html)中分析过,组合,子集,排列问题的空间复杂度都是O(n),但如果使用set去重,空间复杂度就变成了O(n^2),因为每一层递归都有一个set集合,系统栈空间是n,每一个空间都有set集合。 -那有同学可能疑惑 用used数组也是占用$O(n)$的空间啊? +那有同学可能疑惑 用used数组也是占用O(n)的空间啊? -used数组可是全局变量,每层与每层之间公用一个used数组,所以空间复杂度是$O(n + n)$,最终空间复杂度还是$O(n)$。 +used数组可是全局变量,每层与每层之间公用一个used数组,所以空间复杂度是O(n + n),最终空间复杂度还是O(n)。 ## 总结 diff --git a/problems/字符串总结.md b/problems/字符串总结.md index 469cb743..1993b44b 100644 --- a/problems/字符串总结.md +++ b/problems/字符串总结.md @@ -57,15 +57,15 @@ for (int i = 0; i < a.size(); i++) { 在[344.反转字符串](https://programmercarl.com/0344.反转字符串.html) ,我们使用双指针法实现了反转字符串的操作,**双指针法在数组,链表和字符串中很常用。** -接着在[字符串:替换空格](https://programmercarl.com/剑指Offer05.替换空格.html),同样还是使用双指针法在时间复杂度$O(n)$的情况下完成替换空格。 +接着在[字符串:替换空格](https://programmercarl.com/剑指Offer05.替换空格.html),同样还是使用双指针法在时间复杂度O(n)的情况下完成替换空格。 **其实很多数组填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。** 那么针对数组删除操作的问题,其实在[27. 移除元素](https://programmercarl.com/0027.移除元素.html)中就已经提到了使用双指针法进行移除操作。 -同样的道理在[151.翻转字符串里的单词](https://programmercarl.com/0151.翻转字符串里的单词.html)中我们使用$O(n)$的时间复杂度,完成了删除冗余空格。 +同样的道理在[151.翻转字符串里的单词](https://programmercarl.com/0151.翻转字符串里的单词.html)中我们使用O(n)的时间复杂度,完成了删除冗余空格。 -一些同学会使用for循环里调用库函数erase来移除元素,这其实是$O(n^2)$的操作,因为erase就是$O(n)$的操作,所以这也是典型的不知道库函数的时间复杂度,上来就用的案例了。 +一些同学会使用for循环里调用库函数erase来移除元素,这其实是O(n^2)的操作,因为erase就是O(n)的操作,所以这也是典型的不知道库函数的时间复杂度,上来就用的案例了。 # 反转系列 diff --git a/problems/数组总结篇.md b/problems/数组总结篇.md index d3d4a1e2..242c1498 100644 --- a/problems/数组总结篇.md +++ b/problems/数组总结篇.md @@ -67,8 +67,8 @@ 可以使用暴力解法,通过这道题目,如果追求更优的算法,建议试一试用二分法,来解决这道题目 -* 暴力解法时间复杂度:$O(n)$ -* 二分法时间复杂度:$O(\log n)$ +* 暴力解法时间复杂度:O(n) +* 二分法时间复杂度:O(logn) 在这道题目中我们讲到了**循环不变量原则**,只有在循环中坚持对区间的定义,才能清楚的把握循环中的各种细节。 @@ -81,8 +81,8 @@ 双指针法(快慢指针法):**通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。** -* 暴力解法时间复杂度:$O(n^2)$ -* 双指针时间复杂度:$O(n)$ +* 暴力解法时间复杂度:O(n^2) +* 双指针时间复杂度:O(n) 这道题目迷惑了不少同学,纠结于数组中的元素为什么不能删除,主要是因为以下两点: @@ -97,8 +97,8 @@ 本题介绍了数组操作中的另一个重要思想:滑动窗口。 -* 暴力解法时间复杂度:$O(n^2)$ -* 滑动窗口时间复杂度:$O(n)$ +* 暴力解法时间复杂度:O(n^2) +* 滑动窗口时间复杂度:O(n) 本题中,主要要理解滑动窗口如何移动 窗口起始位置,达到动态更新窗口大小的,从而得出长度最小的符合条件的长度。 diff --git a/problems/根据身高重建队列(vector原理讲解).md b/problems/根据身高重建队列(vector原理讲解).md index 11a72e2d..6d248c40 100644 --- a/problems/根据身高重建队列(vector原理讲解).md +++ b/problems/根据身高重建队列(vector原理讲解).md @@ -33,7 +33,7 @@ public: 耗时如下: ![vectorinsert](https://img-blog.csdnimg.cn/20201218203611181.png) -其直观上来看数组的insert操作是$O(n)$的,整体代码的时间复杂度是$O(n^2)$。 +其直观上来看数组的insert操作是O(n)的,整体代码的时间复杂度是O(n^2)。 这么一分析好像和版本二链表实现的时间复杂度是一样的啊,为什么提交之后效率会差距这么大呢? ```CPP @@ -97,7 +97,7 @@ for (int i = 0; i < vec.size(); i++) { **同时也注意此时capicity和size的变化,关键的地方我都标红了**。 -而在[贪心算法:根据身高重建队列](https://programmercarl.com/0406.根据身高重建队列.html)中,我们使用vector来做insert的操作,此时大家可会发现,**虽然表面上复杂度是$O(n^2)$,但是其底层都不知道额外做了多少次全量拷贝了,所以算上vector的底层拷贝,整体时间复杂度可以认为是$O(n^2 + t × n)$级别的,t是底层拷贝的次数**。 +而在[贪心算法:根据身高重建队列](https://programmercarl.com/0406.根据身高重建队列.html)中,我们使用vector来做insert的操作,此时大家可会发现,**虽然表面上复杂度是O(n^2),但是其底层都不知道额外做了多少次全量拷贝了,所以算上vector的底层拷贝,整体时间复杂度可以认为是O(n^2 + t × n)级别的,t是底层拷贝的次数**。 那么是不是可以直接确定好vector的大小,不让它在动态扩容了,例如在[贪心算法:根据身高重建队列](https://programmercarl.com/0406.根据身高重建队列.html)中已经给出了有people.size这么多的人,可以定义好一个固定大小的vector,这样我们就可以控制vector,不让它底层动态扩容。 @@ -133,7 +133,7 @@ public: ![vector手动模拟insert](https://img-blog.csdnimg.cn/20201218200626718.png) -这份代码就是不让vector动态扩容,全程我们自己模拟insert的操作,大家也可以直观的看出是一个$O(n^2)$的方法了。 +这份代码就是不让vector动态扩容,全程我们自己模拟insert的操作,大家也可以直观的看出是一个O(n^2)的方法了。 但这份代码在leetcode上统计的耗时甚至比版本一的还高,我们都不让它动态扩容了,为什么耗时更高了呢? @@ -151,7 +151,7 @@ public: 大家应该发现了,编程语言中一个普通容器的insert,delete的使用,都可能对写出来的算法的有很大影响! -如果抛开语言谈算法,除非从来不用代码写算法纯分析,**否则的话,语言功底不到位$O(n)$的算法可以写出$O(n^2)$的性能**,哈哈。 +如果抛开语言谈算法,除非从来不用代码写算法纯分析,**否则的话,语言功底不到位O(n)的算法可以写出$O(n^2)$的性能**,哈哈。 相信在这里学习算法的录友们,都是想在软件行业长远发展的,都是要从事编程的工作,那么一定要深耕好一门编程语言,这个非常重要! diff --git a/problems/知识星球精选/刷力扣用不用库函数.md b/problems/知识星球精选/刷力扣用不用库函数.md index b52e4d03..c8e2f5c6 100644 --- a/problems/知识星球精选/刷力扣用不用库函数.md +++ b/problems/知识星球精选/刷力扣用不用库函数.md @@ -27,7 +27,7 @@ 使用库函数最大的忌讳就是不知道这个库函数怎么实现的,也不知道其时间复杂度,上来就用,这样写出来的算法,时间复杂度自己都掌握不好的。 -例如for循环里套一个字符串的insert,erase之类的操作,你说时间复杂度是多少呢,很明显是$O(n^2)$的时间复杂度了。 +例如for循环里套一个字符串的insert,erase之类的操作,你说时间复杂度是多少呢,很明显是O(n^2)的时间复杂度了。 在刷题的时候本着我说的标准来使用库函数,详细对大家回有所帮助! diff --git a/problems/背包问题理论基础多重背包.md b/problems/背包问题理论基础多重背包.md index d05c3445..a988db2c 100644 --- a/problems/背包问题理论基础多重背包.md +++ b/problems/背包问题理论基础多重背包.md @@ -89,7 +89,7 @@ int main() { ``` -* 时间复杂度:$O(m × n × k)$,m:物品种类个数,n背包容量,k单类物品数量 +* 时间复杂度:O(m × n × k),m:物品种类个数,n背包容量,k单类物品数量 也有另一种实现方式,就是把每种商品遍历的个数放在01背包里面在遍历一遍。 @@ -125,7 +125,7 @@ int main() { } ``` -* 时间复杂度:$O(m × n × k)$,m:物品种类个数,n背包容量,k单类物品数量 +* 时间复杂度:O(m × n × k),m:物品种类个数,n背包容量,k单类物品数量 从代码里可以看出是01背包里面在加一个for循环遍历一个每种商品的数量。 和01背包还是如出一辙的。 diff --git a/problems/链表理论基础.md b/problems/链表理论基础.md index a4fefa2b..095282f5 100644 --- a/problems/链表理论基础.md +++ b/problems/链表理论基础.md @@ -120,9 +120,9 @@ head->val = 5; ![链表-添加节点](https://img-blog.csdnimg.cn/20200806195134331.png) -可以看出链表的增添和删除都是$O(1)$操作,也不会影响到其他节点。 +可以看出链表的增添和删除都是O(1)操作,也不会影响到其他节点。 -但是要注意,要是删除第五个节点,需要从头节点查找到第四个节点通过next指针进行删除操作,查找的时间复杂度是$O(n)$。 +但是要注意,要是删除第五个节点,需要从头节点查找到第四个节点通过next指针进行删除操作,查找的时间复杂度是O(n)。 # 性能分析 From d1ea59aebd4659274165c5a352166696275faddc Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Thu, 31 Mar 2022 22:14:20 +0800 Subject: [PATCH 220/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880093.?= =?UTF-8?q?=E5=A4=8D=E5=8E=9FIP=E5=9C=B0=E5=9D=80.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0093.复原IP地址.md | 39 +++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/problems/0093.复原IP地址.md b/problems/0093.复原IP地址.md index 714dcb4f..7910fc50 100644 --- a/problems/0093.复原IP地址.md +++ b/problems/0093.复原IP地址.md @@ -455,6 +455,45 @@ var restoreIpAddresses = function(s) { }; ``` +## TypeScript + +```typescript +function isValidIpSegment(str: string): boolean { + let resBool: boolean = true; + let tempVal: number = Number(str); + if ( + str.length === 0 || isNaN(tempVal) || + tempVal > 255 || tempVal < 0 || + (str.length > 1 && str[0] === '0') + ) { + resBool = false; + } + return resBool; +} +function restoreIpAddresses(s: string): string[] { + const resArr: string[] = []; + backTracking(s, 0, []); + return resArr; + function backTracking(s: string, startIndex: number, route: string[]): void { + let length: number = s.length; + if (route.length === 4 && startIndex >= length) { + resArr.push(route.join('.')); + return; + } + if (route.length === 4 || startIndex >= length) return; + let tempStr: string = ''; + for (let i = startIndex + 1; i <= Math.min(length, startIndex + 3); i++) { + tempStr = s.slice(startIndex, i); + if (isValidIpSegment(tempStr)) { + route.push(s.slice(startIndex, i)); + backTracking(s, i, route); + route.pop(); + } + } + } +}; +``` + ## Go 回溯(对于前导 0的IP(特别注意s[startIndex]=='0'的判断,不应该写成s[startIndex]==0,因为s截取出来不是数字)) From 48de0f8bd55e24b2b9233648e0f85e4fcb75c0c0 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 1 Apr 2022 11:02:47 +0800 Subject: [PATCH 221/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880078.?= =?UTF-8?q?=E5=AD=90=E9=9B=86.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typesc?= =?UTF-8?q?ript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0078.子集.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/problems/0078.子集.md b/problems/0078.子集.md index cdb5f548..e1c52b5b 100644 --- a/problems/0078.子集.md +++ b/problems/0078.子集.md @@ -272,7 +272,28 @@ var subsets = function(nums) { }; ``` +## TypeScript + +```typescript +function subsets(nums: number[]): number[][] { + const resArr: number[][] = []; + backTracking(nums, 0, []); + return resArr; + function backTracking(nums: number[], startIndex: number, route: number[]): void { + resArr.push(route.slice()); + let length = nums.length; + if (startIndex === length) return; + for (let i = startIndex; i < length; i++) { + route.push(nums[i]); + backTracking(nums, i + 1, route); + route.pop(); + } + } +}; +``` + ## C + ```c int* path; int pathTop; From b85700890227fa69a7ca506384e7e8a821530675 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 1 Apr 2022 12:08:26 +0800 Subject: [PATCH 222/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880090.?= =?UTF-8?q?=E5=AD=90=E9=9B=86II.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0type?= =?UTF-8?q?script=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0090.子集II.md | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/problems/0090.子集II.md b/problems/0090.子集II.md index 16bd1f2c..6469f4ba 100644 --- a/problems/0090.子集II.md +++ b/problems/0090.子集II.md @@ -319,6 +319,28 @@ var subsetsWithDup = function(nums) { ``` +### TypeScript + +```typescript +function subsetsWithDup(nums: number[]): number[][] { + nums.sort((a, b) => a - b); + const resArr: number[][] = []; + backTraking(nums, 0, []); + return resArr; + function backTraking(nums: number[], startIndex: number, route: number[]): void { + resArr.push(route.slice()); + let length: number = nums.length; + if (startIndex === length) return; + for (let i = startIndex; i < length; i++) { + if (i > startIndex && nums[i] === nums[i - 1]) continue; + route.push(nums[i]); + backTraking(nums, i + 1, route); + route.pop(); + } + } +}; +``` + ### C ```c @@ -388,7 +410,7 @@ int** subsetsWithDup(int* nums, int numsSize, int* returnSize, int** returnColum } ``` -## Swift +### Swift ```swift func subsetsWithDup(_ nums: [Int]) -> [[Int]] { From c4a4a0323127f3b47e89fdeefd7bc8a57d404e1e Mon Sep 17 00:00:00 2001 From: Effy Wang Date: Fri, 1 Apr 2022 17:26:47 +0800 Subject: [PATCH 223/328] =?UTF-8?q?Update=200704.=E4=BA=8C=E5=88=86?= =?UTF-8?q?=E6=9F=A5=E6=89=BE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit add detailed comments to the Javascript version of Binary Search --- problems/0704.二分查找.md | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/problems/0704.二分查找.md b/problems/0704.二分查找.md index 15e096a0..55625130 100644 --- a/problems/0704.二分查找.md +++ b/problems/0704.二分查找.md @@ -276,7 +276,7 @@ func search(nums []int, target int) int { ``` **JavaScript:** -(版本一)左闭右闭区间 +(版本一)左闭右闭区间 [left, right] ```js /** @@ -285,10 +285,12 @@ func search(nums []int, target int) int { * @return {number} */ var search = function(nums, target) { + // right是数组最后一个数的下标,num[right]在查找范围内,是左闭右闭区间 let left = 0, right = nums.length - 1; - // 使用左闭右闭区间 + // 当left=right时,由于nums[right]在查找范围内,所以要包括此情况 while (left <= right) { let mid = left + Math.floor((right - left)/2); + // 如果中间数大于目标值,要把中间数排除查找范围,所以右边界更新为mid-1;如果右边界更新为mid,那中间数还在下次查找范围内 if (nums[mid] > target) { right = mid - 1; // 去左面闭区间寻找 } else if (nums[mid] < target) { @@ -300,7 +302,7 @@ var search = function(nums, target) { return -1; }; ``` -(版本二)左闭右开区间 +(版本二)左闭右开区间 [left, right) ```js /** @@ -309,10 +311,13 @@ var search = function(nums, target) { * @return {number} */ var search = function(nums, target) { - let left = 0, right = nums.length; - // 使用左闭右开区间 [left, right) + // right是数组最后一个数的下标+1,nums[right]不在查找范围内,是左闭右开区间 + let left = 0, right = nums.length; + // 当left=right时,由于nums[right]不在查找范围,所以不必包括此情况 while (left < right) { let mid = left + Math.floor((right - left)/2); + // 如果中间值大于目标值,中间值不应在下次查找的范围内,但中间值的前一个值应在; + // 由于right本来就不在查找范围内,所以将右边界更新为中间值,如果更新右边界为mid-1则将中间值的前一个值也踢出了下次寻找范围 if (nums[mid] > target) { right = mid; // 去左区间寻找 } else if (nums[mid] < target) { From 3f7dd67a8031663d2b673a41587e3a640e0a4b1f Mon Sep 17 00:00:00 2001 From: FrankLin Date: Fri, 1 Apr 2022 10:57:25 -0400 Subject: [PATCH 224/328] Add C version for LeetCode349 using array --- problems/0349.两个数组的交集.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/problems/0349.两个数组的交集.md b/problems/0349.两个数组的交集.md index 82be1829..64d80a37 100644 --- a/problems/0349.两个数组的交集.md +++ b/problems/0349.两个数组的交集.md @@ -281,6 +281,38 @@ impl Solution { } } ``` + +C: +```C +int* intersection1(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){ + + int nums1Cnt[1000] = {0}; + int lessSize = nums1Size < nums2Size ? nums1Size : nums2Size; + int * result = (int *) calloc(lessSize, sizeof(int)); + int resultIndex = 0; + int* tempNums; + + int i; + + //Calculate the number's counts for nums1 array + for(i = 0; i < nums1Size; i ++) { + nums1Cnt[nums1[i]]++; + } + + //Check if the value existing in nums1 count array + for(i = 0; i < nums2Size; i ++) { + if(nums1Cnt[nums2[i]] > 0) { + result[resultIndex] = nums2[i]; + resultIndex ++; + //Clear this count to avoid duplicated value + nums1Cnt[nums2[i]] = 0; + } + } + * returnSize = resultIndex; + return result; +} +``` + ## 相关题目 * 350.两个数组的交集 II From abc08b6bb6f698135efe52ad0a7f20b333d32173 Mon Sep 17 00:00:00 2001 From: FrankLin Date: Fri, 1 Apr 2022 11:01:00 -0400 Subject: [PATCH 225/328] correct comments of C version of Leetcode349 --- problems/0349.两个数组的交集.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/problems/0349.两个数组的交集.md b/problems/0349.两个数组的交集.md index 64d80a37..45f19b6e 100644 --- a/problems/0349.两个数组的交集.md +++ b/problems/0349.两个数组的交集.md @@ -294,17 +294,17 @@ int* intersection1(int* nums1, int nums1Size, int* nums2, int nums2Size, int* re int i; - //Calculate the number's counts for nums1 array + /* Calculate the number's counts for nums1 array */ for(i = 0; i < nums1Size; i ++) { nums1Cnt[nums1[i]]++; } - //Check if the value existing in nums1 count array + /* Check if the value in nums2 is existing in nums1 count array */ for(i = 0; i < nums2Size; i ++) { if(nums1Cnt[nums2[i]] > 0) { result[resultIndex] = nums2[i]; resultIndex ++; - //Clear this count to avoid duplicated value + /* Clear this count to avoid duplicated value */ nums1Cnt[nums2[i]] = 0; } } From 297a22fd880f207bd9b621b7dbd5e8dfd84340a1 Mon Sep 17 00:00:00 2001 From: FrankLin Date: Fri, 1 Apr 2022 15:11:00 -0400 Subject: [PATCH 226/328] Add C version for Leetcode202 passed Leetcode submission --- problems/0202.快乐数.md | 70 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/problems/0202.快乐数.md b/problems/0202.快乐数.md index f0a46a40..741a735a 100644 --- a/problems/0202.快乐数.md +++ b/problems/0202.快乐数.md @@ -315,5 +315,75 @@ class Solution { } ``` +C: +```C +typedef struct HashNodeTag { + int key; /* num */ + struct HashNodeTag *next; +}HashNode; + +/* Calcualte the hash key */ +static inline int hash(int key, int size) { + int index = key % size; + return (index > 0) ? (index) : (-index); +} + +/* Calculate the sum of the squares of its digits*/ +static inline int calcSquareSum(int num) { + unsigned int sum = 0; + while(num > 0) { + sum += (num % 10) * (num % 10); + num = num/10; + } + return sum; +} + +#define HASH_TABLE_SIZE (32) + +bool isHappy(int n){ + int sum = n; + int index = 0; + bool bHappy = false; + bool bExit = false; + /* allocate the memory for hash table with chaining method*/ + HashNode ** hashTable = (HashNode **)calloc(HASH_TABLE_SIZE, sizeof(HashNode)); + + while(bExit == false) { + /* check if n has been calculated */ + index = hash(n, HASH_TABLE_SIZE); + + HashNode ** p = hashTable + index; + + while((*p) && (bExit == false)) { + /* Check if this num was calculated, if yes, this will be endless loop */ + if((*p)->key == n) { + bHappy = false; + bExit = true; + } + /* move to next node of the same index */ + p = &((*p)->next); + } + + /* put n intot hash table */ + HashNode * newNode = (HashNode *)malloc(sizeof(HashNode)); + newNode->key = n; + newNode->next = NULL; + + *p = newNode; + + sum = calcSquareSum(n); + if(sum == 1) { + bHappy = true; + bExit = true; + } + else { + n = sum; + + } + } + + return bHappy; +} +``` -----------------------
From fb5571f16576d9d16274219d60674662970366ec Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sat, 2 Apr 2022 11:24:06 +0800 Subject: [PATCH 227/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880491.?= =?UTF-8?q?=E9=80=92=E5=A2=9E=E5=AD=90=E5=BA=8F=E5=88=97.md=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0491.递增子序列.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/problems/0491.递增子序列.md b/problems/0491.递增子序列.md index 6103c3d0..3ea2382b 100644 --- a/problems/0491.递增子序列.md +++ b/problems/0491.递增子序列.md @@ -396,7 +396,35 @@ var findSubsequences = function(nums) { ``` +## TypeScript + +```typescript +function findSubsequences(nums: number[]): number[][] { + const resArr: number[][] = []; + backTracking(nums, 0, []); + return resArr; + function backTracking(nums: number[], startIndex: number, route: number[]): void { + let length: number = nums.length; + if (route.length >= 2) { + resArr.push(route.slice()); + } + const usedSet: Set = new Set(); + for (let i = startIndex; i < length; i++) { + if ( + nums[i] < route[route.length - 1] || + usedSet.has(nums[i]) + ) continue; + usedSet.add(nums[i]); + route.push(nums[i]); + backTracking(nums, i + 1, route); + route.pop(); + } + } +}; +``` + ### C + ```c int* path; int pathTop; From 9b9a37b92c20fc616b7808317ba05ff03c6d8633 Mon Sep 17 00:00:00 2001 From: SianXiaoCHN Date: Sat, 2 Apr 2022 00:03:08 -0500 Subject: [PATCH 228/328] 0455 typo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 0455思路多打了一个“了” --- problems/0455.分发饼干.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/0455.分发饼干.md b/problems/0455.分发饼干.md index 210b492d..5c86e478 100644 --- a/problems/0455.分发饼干.md +++ b/problems/0455.分发饼干.md @@ -32,7 +32,7 @@ ## 思路 -为了了满足更多的小孩,就不要造成饼干尺寸的浪费。 +为了满足更多的小孩,就不要造成饼干尺寸的浪费。 大尺寸的饼干既可以满足胃口大的孩子也可以满足胃口小的孩子,那么就应该优先满足胃口大的。 From 77f1e2c85da13846b26cd33159e0dee565ef1d9d Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sat, 2 Apr 2022 19:24:03 +0800 Subject: [PATCH 229/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880046.?= =?UTF-8?q?=E5=85=A8=E6=8E=92=E5=88=97.md=EF=BC=89=EF=BC=9A=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0typesript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0046.全排列.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/problems/0046.全排列.md b/problems/0046.全排列.md index c5369ddd..836c3646 100644 --- a/problems/0046.全排列.md +++ b/problems/0046.全排列.md @@ -331,6 +331,34 @@ var permute = function(nums) { ``` +## TypeScript + +```typescript +function permute(nums: number[]): number[][] { + const resArr: number[][] = []; + const helperSet: Set = new Set(); + backTracking(nums, []); + return resArr; + function backTracking(nums: number[], route: number[]): void { + if (route.length === nums.length) { + resArr.push(route.slice()); + return; + } + let tempVal: number; + for (let i = 0, length = nums.length; i < length; i++) { + tempVal = nums[i]; + if (!helperSet.has(tempVal)) { + route.push(tempVal); + helperSet.add(tempVal); + backTracking(nums, route); + route.pop(); + helperSet.delete(tempVal); + } + } + } +}; +``` + ### C ```c From c9dfda1c955c0665108d8aa7fc78b33d5edded99 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sat, 2 Apr 2022 23:34:25 +0800 Subject: [PATCH 230/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880047.?= =?UTF-8?q?=E5=85=A8=E6=8E=92=E5=88=97II.md=EF=BC=89=EF=BC=9A=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0047.全排列II.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/problems/0047.全排列II.md b/problems/0047.全排列II.md index 0cecac50..cce25cd9 100644 --- a/problems/0047.全排列II.md +++ b/problems/0047.全排列II.md @@ -292,6 +292,34 @@ var permuteUnique = function (nums) { ``` +### TypeScript + +```typescript +function permuteUnique(nums: number[]): number[][] { + nums.sort((a, b) => a - b); + const resArr: number[][] = []; + const usedArr: boolean[] = new Array(nums.length).fill(false); + backTracking(nums, []); + return resArr; + function backTracking(nums: number[], route: number[]): void { + if (route.length === nums.length) { + resArr.push(route.slice()); + return; + } + for (let i = 0, length = nums.length; i < length; i++) { + if (i > 0 && nums[i] === nums[i - 1] && usedArr[i - 1] === false) continue; + if (usedArr[i] === false) { + route.push(nums[i]); + usedArr[i] = true; + backTracking(nums, route); + usedArr[i] = false; + route.pop(); + } + } + } +}; +``` + ### Swift ```swift From 710e816012bb0198a5a42686e94d24b50aa68760 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sun, 3 Apr 2022 11:26:52 +0800 Subject: [PATCH 231/328] =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=8820201112?= =?UTF-8?q?=E5=9B=9E=E6=BA=AF=E5=91=A8=E6=9C=AB=E6=80=BB=E7=BB=93.md?= =?UTF-8?q?=EF=BC=89=EF=BC=9A=E8=A1=A5=E5=85=85=E5=88=86=E6=9E=90=E6=8E=92?= =?UTF-8?q?=E5=88=97=E9=97=AE=E9=A2=98=E6=97=B6=E9=97=B4=E5=A4=8D=E6=9D=82?= =?UTF-8?q?=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/周总结/20201112回溯周末总结.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/周总结/20201112回溯周末总结.md b/problems/周总结/20201112回溯周末总结.md index c61de4bb..af08097b 100644 --- a/problems/周总结/20201112回溯周末总结.md +++ b/problems/周总结/20201112回溯周末总结.md @@ -76,7 +76,7 @@ * 空间复杂度:$O(n)$,递归深度为n,所以系统栈所用空间为$O(n)$,每一层递归所用的空间都是常数级别,注意代码里的result和path都是全局变量,就算是放在参数里,传的也是引用,并不会新申请内存空间,最终空间复杂度为$O(n)$。 排列问题分析: -* 时间复杂度:$O(n!)$,这个可以从排列的树形图中很明显发现,每一层节点为n,第二层每一个分支都延伸了n-1个分支,再往下又是n-2个分支,所以一直到叶子节点一共就是 n * n-1 * n-2 * ..... 1 = n!。 +* 时间复杂度:$O(n!)$,这个可以从排列的树形图中很明显发现,每一层节点为n,第二层每一个分支都延伸了n-1个分支,再往下又是n-2个分支,所以一直到叶子节点一共就是 n * n-1 * n-2 * ..... 1 = n!。每个叶子节点都会有一个构造全排列填进数组的操作(对应的代码:`result.push_back(path)`),该操作的复杂度为$O(n)$。所以,最终时间复杂度为:n * n!,简化为$O(n!)$。 * 空间复杂度:$O(n)$,和子集问题同理。 组合问题分析: From e48336238d25eac775f1897ad85b9be551ba1e69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=A2=A6=E6=B4=81?= <3224935686@qq.com> Date: Sun, 3 Apr 2022 14:03:31 +0800 Subject: [PATCH 232/328] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E7=B3=BB=E5=88=9719=20=E4=BB=8E=E4=B8=AD=E5=BA=8F?= =?UTF-8?q?=E4=B8=8E=E5=90=8E=E5=BA=8F=E9=81=8D=E5=8E=86=E5=BA=8F=E5=88=97?= =?UTF-8?q?=E6=9E=84=E9=80=A0=E4=BA=8C=E5=8F=89=E6=A0=91JS=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=8F=98=E9=87=8F=E5=90=8D=20preorder->inorder?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0106.从中序与后序遍历序列构造二叉树.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/0106.从中序与后序遍历序列构造二叉树.md b/problems/0106.从中序与后序遍历序列构造二叉树.md index 496de431..7ecca773 100644 --- a/problems/0106.从中序与后序遍历序列构造二叉树.md +++ b/problems/0106.从中序与后序遍历序列构造二叉树.md @@ -790,7 +790,7 @@ func findRootIndex(target int,inorder []int) int{ ```javascript var buildTree = function(inorder, postorder) { - if (!preorder.length) return null; + if (!inorder.length) return null; const rootVal = postorder.pop(); // 从后序遍历的数组中获取中间节点的值, 即数组最后一个值 let rootIndex = inorder.indexOf(rootVal); // 获取中间节点在中序遍历中的下标 const root = new TreeNode(rootVal); // 创建中间节点 From 1dcbf7f6f0ba7b50da6685532a42d2ceac9aeccc Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sun, 3 Apr 2022 19:43:34 +0800 Subject: [PATCH 233/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88=E5=9B=9E?= =?UTF-8?q?=E6=BA=AF=E7=AE=97=E6=B3=95=E5=8E=BB=E9=87=8D=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E7=9A=84=E5=8F=A6=E4=B8=80=E7=A7=8D=E5=86=99=E6=B3=95.md?= =?UTF-8?q?=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/回溯算法去重问题的另一种写法.md | 81 ++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/problems/回溯算法去重问题的另一种写法.md b/problems/回溯算法去重问题的另一种写法.md index b4bdda00..f48097e1 100644 --- a/problems/回溯算法去重问题的另一种写法.md +++ b/problems/回溯算法去重问题的另一种写法.md @@ -365,6 +365,87 @@ class Solution: return res ``` +TypeScript: + +**90.子集II** + +```typescript +function subsetsWithDup(nums: number[]): number[][] { + nums.sort((a, b) => a - b); + const resArr: number[][] = []; + backTraking(nums, 0, []); + return resArr; + function backTraking(nums: number[], startIndex: number, route: number[]): void { + resArr.push(route.slice()); + const helperSet: Set = new Set(); + for (let i = startIndex, length = nums.length; i < length; i++) { + if (helperSet.has(nums[i])) continue; + helperSet.add(nums[i]); + route.push(nums[i]); + backTraking(nums, i + 1, route); + route.pop(); + } + } +}; +``` + +**40. 组合总和 II** + +```typescript +function combinationSum2(candidates: number[], target: number): number[][] { + candidates.sort((a, b) => a - b); + const resArr: number[][] = []; + backTracking(candidates, target, 0, 0, []); + return resArr; + function backTracking( + candidates: number[], target: number, + curSum: number, startIndex: number, route: number[] + ) { + if (curSum > target) return; + if (curSum === target) { + resArr.push(route.slice()); + return; + } + const helperSet: Set = new Set(); + for (let i = startIndex, length = candidates.length; i < length; i++) { + let tempVal: number = candidates[i]; + if (helperSet.has(tempVal)) continue; + helperSet.add(tempVal); + route.push(tempVal); + backTracking(candidates, target, curSum + tempVal, i + 1, route); + route.pop(); + + } + } +}; +``` + +**47. 全排列 II** + +```typescript +function permuteUnique(nums: number[]): number[][] { + const resArr: number[][] = []; + const usedArr: boolean[] = []; + backTracking(nums, []); + return resArr; + function backTracking(nums: number[], route: number[]): void { + if (nums.length === route.length) { + resArr.push(route.slice()); + return; + } + const usedSet: Set = new Set(); + for (let i = 0, length = nums.length; i < length; i++) { + if (usedArr[i] === true || usedSet.has(nums[i])) continue; + usedSet.add(nums[i]); + route.push(nums[i]); + usedArr[i] = true; + backTracking(nums, route); + usedArr[i] = false; + route.pop(); + } + } +}; +``` Go: From 3635751759fcf689f9baae10ab5fe4a5d642b5f8 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sun, 3 Apr 2022 23:15:06 +0800 Subject: [PATCH 234/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880332.?= =?UTF-8?q?=E9=87=8D=E6=96=B0=E5=AE=89=E6=8E=92=E8=A1=8C=E7=A8=8B.md?= =?UTF-8?q?=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0332.重新安排行程.md | 44 +++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/problems/0332.重新安排行程.md b/problems/0332.重新安排行程.md index 01f81c4d..370db45b 100644 --- a/problems/0332.重新安排行程.md +++ b/problems/0332.重新安排行程.md @@ -448,6 +448,50 @@ var findItinerary = function(tickets) { ``` +### TypeScript + +```typescript +function findItinerary(tickets: string[][]): string[] { + /** + TicketsMap 实例: + { NRT: Map(1) { 'JFK' => 1 }, JFK: Map(2) { 'KUL' => 1, 'NRT' => 1 } } + 这里选择Map数据结构的原因是:与Object类型的一个主要差异是,Map实例会维护键值对的插入顺序。 + */ + type TicketsMap = { + [index: string]: Map + }; + tickets.sort((a, b) => { + return a[1] < b[1] ? -1 : 1; + }); + const ticketMap: TicketsMap = {}; + for (const [from, to] of tickets) { + if (ticketMap[from] === undefined) { + ticketMap[from] = new Map(); + } + ticketMap[from].set(to, (ticketMap[from].get(to) || 0) + 1); + } + const resRoute = ['JFK']; + backTracking(tickets.length, ticketMap, resRoute); + return resRoute; + function backTracking(ticketNum: number, ticketMap: TicketsMap, route: string[]): boolean { + if (route.length === ticketNum + 1) return true; + const targetMap = ticketMap[route[route.length - 1]]; + if (targetMap !== undefined) { + for (const [to, count] of targetMap.entries()) { + if (count > 0) { + route.push(to); + targetMap.set(to, count - 1); + if (backTracking(ticketNum, ticketMap, route) === true) return true; + targetMap.set(to, count); + route.pop(); + } + } + } + return false; + } +}; +``` + ### Swift 直接迭代tickets数组: From 69a9316bebce0fc3f43835bb9245f124076f105f Mon Sep 17 00:00:00 2001 From: SianXiaoCHN Date: Sun, 3 Apr 2022 23:42:04 -0500 Subject: [PATCH 235/328] =?UTF-8?q?python=200860.=E6=9F=A0=E6=AA=AC?= =?UTF-8?q?=E6=B0=B4=E6=89=BE=E9=9B=B6=20=E5=8E=BB=E9=99=A4=E6=97=A0?= =?UTF-8?q?=E7=94=A8=E5=8F=98=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit python 0860.柠檬水找零 去除无用变量:在本题中,20的数量是无用的,因为不需要用来找零,可以不用维护这个变量。 --- problems/0860.柠檬水找零.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/problems/0860.柠檬水找零.md b/problems/0860.柠檬水找零.md index f48ecf4d..ffd5490d 100644 --- a/problems/0860.柠檬水找零.md +++ b/problems/0860.柠檬水找零.md @@ -157,7 +157,7 @@ class Solution { ```python class Solution: def lemonadeChange(self, bills: List[int]) -> bool: - five, ten, twenty = 0, 0, 0 + five, ten = 0, 0 for bill in bills: if bill == 5: five += 1 @@ -169,10 +169,8 @@ class Solution: if ten > 0 and five > 0: ten -= 1 five -= 1 - twenty += 1 elif five > 2: five -= 3 - twenty += 1 else: return False return True From d3a69ff358793c6c4f6f7636935b545437404f21 Mon Sep 17 00:00:00 2001 From: Camille0512 Date: Mon, 4 Apr 2022 12:55:12 +0800 Subject: [PATCH 236/328] Add one more python code --- problems/0098.验证二叉搜索树.md | 23 +++++++++++++++++++++- problems/0101.对称二叉树.md | 35 --------------------------------- 2 files changed, 22 insertions(+), 36 deletions(-) diff --git a/problems/0098.验证二叉搜索树.md b/problems/0098.验证二叉搜索树.md index 4ed29619..ff4335fc 100644 --- a/problems/0098.验证二叉搜索树.md +++ b/problems/0098.验证二叉搜索树.md @@ -408,7 +408,28 @@ class Solution: return True ``` -## Go +```python +# 遵循Carl的写法,只添加了节点判断的部分 +class Solution: + def isValidBST(self, root: TreeNode) -> bool: + # method 2 + que, pre = [], None + while root or que: + while root: + que.append(root) + root = root.left + root = que.pop() + # 对第一个节点只做记录,对后面的节点进行比较 + if pre is None: + pre = root.val + else: + if pre >= root.val: return False + pre = root.val + root = root.right + return True +``` + +## Go ```Go import "math" diff --git a/problems/0101.对称二叉树.md b/problems/0101.对称二叉树.md index 0007b4d4..e4e232c8 100644 --- a/problems/0101.对称二叉树.md +++ b/problems/0101.对称二叉树.md @@ -437,41 +437,6 @@ class Solution: return True ``` -层序遍历 - -```python -class Solution: - def isSymmetric(self, root: TreeNode) -> bool: - if not root: return True - que, cnt = [[root.left, root.right]], 1 - while que: - nodes, tmp, sign = que.pop(), [], False - for node in nodes: - if not node: - tmp.append(None) - tmp.append(None) - else: - if node.left: - tmp.append(node.left) - sign = True - else: - tmp.append(None) - if node.right: - tmp.append(node.right) - sign = True - else: - tmp.append(None) - p1, p2 = 0, len(nodes) - 1 - while p1 < p2: - if (not nodes[p1] and nodes[p2]) or (nodes[p1] and not nodes[p2]): return False - elif nodes[p1] and nodes[p2] and nodes[p1].val != nodes[p2].val: return False - p1 += 1 - p2 -= 1 - if sign: que.append(tmp) - cnt += 1 - return True -``` - ## Go ```go From 2b80a6d36af3c00b260b55395361a8c960a02d0a Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Mon, 4 Apr 2022 16:56:36 +0800 Subject: [PATCH 237/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880051.N?= =?UTF-8?q?=E7=9A=87=E5=90=8E.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typesc?= =?UTF-8?q?ript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0051.N皇后.md | 52 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/problems/0051.N皇后.md b/problems/0051.N皇后.md index 7eb0d7a0..85524e6f 100644 --- a/problems/0051.N皇后.md +++ b/problems/0051.N皇后.md @@ -457,6 +457,58 @@ var solveNQueens = function(n) { }; ``` +## TypeScript + +```typescript +function solveNQueens(n: number): string[][] { + const board: string[][] = new Array(n).fill(0).map(_ => new Array(n).fill('.')); + const resArr: string[][] = []; + backTracking(n, 0, board); + return resArr; + function backTracking(n: number, rowNum: number, board: string[][]): void { + if (rowNum === n) { + resArr.push(transformBoard(board)); + return; + } + for (let i = 0; i < n; i++) { + if (isValid(i, rowNum, board) === true) { + board[rowNum][i] = 'Q'; + backTracking(n, rowNum + 1, board); + board[rowNum][i] = '.'; + } + } + } +}; +function isValid(col: number, row: number, board: string[][]): boolean { + const n: number = board.length; + if (col < 0 || col >= n || row < 0 || row >= n) return false; + // 检查列 + for (let row of board) { + if (row[col] === 'Q') return false; + } + // 检查45度方向 + let x: number = col, + y: number = row; + while (y >= 0 && x < n) { + if (board[y--][x++] === 'Q') return false; + } + // 检查135度方向 + x = col; + y = row; + while (x >= 0 && y >= 0) { + if (board[y--][x--] === 'Q') return false; + } + return true; +} +function transformBoard(board: string[][]): string[] { + const resArr = []; + for (let row of board) { + resArr.push(row.join('')); + } + return resArr; +} +``` + ### Swift ```swift From 5374fb48a4ebacd714cb74ae979a5fd09a4c7f28 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Mon, 4 Apr 2022 21:41:56 +0800 Subject: [PATCH 238/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880037.?= =?UTF-8?q?=E8=A7=A3=E6=95=B0=E7=8B=AC.md=EF=BC=89=EF=BC=9A=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0037.解数独.md | 49 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/problems/0037.解数独.md b/problems/0037.解数独.md index 53b9bb67..c1ac15af 100644 --- a/problems/0037.解数独.md +++ b/problems/0037.解数独.md @@ -439,6 +439,55 @@ var solveSudoku = function(board) { }; ``` +### TypeScript + +```typescript +/** + Do not return anything, modify board in-place instead. + */ +function isValid(col: number, row: number, val: string, board: string[][]): boolean { + let n: number = board.length; + // 列向检查 + for (let rowIndex = 0; rowIndex < n; rowIndex++) { + if (board[rowIndex][col] === val) return false; + } + // 横向检查 + for (let colIndex = 0; colIndex < n; colIndex++) { + if (board[row][colIndex] === val) return false; + } + // 九宫格检查 + const startX = Math.floor(col / 3) * 3; + const startY = Math.floor(row / 3) * 3; + for (let rowIndex = startY; rowIndex < startY + 3; rowIndex++) { + for (let colIndex = startX; colIndex < startX + 3; colIndex++) { + if (board[rowIndex][colIndex] === val) return false; + } + } + return true; +} +function solveSudoku(board: string[][]): void { + let n: number = 9; + backTracking(n, board); + function backTracking(n: number, board: string[][]): boolean { + for (let row = 0; row < n; row++) { + for (let col = 0; col < n; col++) { + if (board[row][col] === '.') { + for (let i = 1; i <= n; i++) { + if (isValid(col, row, String(i), board)) { + board[row][col] = String(i); + if (backTracking(n, board) === true) return true; + board[row][col] = '.'; + } + } + return false; + } + } + } + return true; + } +}; +``` + ### C ```C From f9079ddc18206cd8a16eeb8085808b65ecab6d6e Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Tue, 5 Apr 2022 10:56:53 +0800 Subject: [PATCH 239/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880455.?= =?UTF-8?q?=E5=88=86=E5=8F=91=E9=A5=BC=E5=B9=B2.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0455.分发饼干.md | 43 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/problems/0455.分发饼干.md b/problems/0455.分发饼干.md index 210b492d..f012df68 100644 --- a/problems/0455.分发饼干.md +++ b/problems/0455.分发饼干.md @@ -209,7 +209,50 @@ var findContentChildren = function(g, s) { ``` +### TypeScript + +```typescript +// 大饼干尽量喂胃口大的 +function findContentChildren(g: number[], s: number[]): number { + g.sort((a, b) => a - b); + s.sort((a, b) => a - b); + const childLength: number = g.length, + cookieLength: number = s.length; + let curChild: number = childLength - 1, + curCookie: number = cookieLength - 1; + let resCount: number = 0; + while (curChild >= 0 && curCookie >= 0) { + if (g[curChild] <= s[curCookie]) { + curCookie--; + resCount++; + } + curChild--; + } + return resCount; +}; +``` + +```typescript +// 小饼干先喂饱小胃口的 +function findContentChildren(g: number[], s: number[]): number { + g.sort((a, b) => a - b); + s.sort((a, b) => a - b); + const childLength: number = g.length, + cookieLength: number = s.length; + let curChild: number = 0, + curCookie: number = 0; + while (curChild < childLength && curCookie < cookieLength) { + if (g[curChild] <= s[curCookie]) { + curChild++; + } + curCookie++; + } + return curChild; +}; +``` + ### C + ```c int cmp(int* a, int* b) { return *a - *b; From c4992be374628782d18ffa8648fa1443825bc947 Mon Sep 17 00:00:00 2001 From: Lafish <34953046+LeUKi@users.noreply.github.com> Date: Wed, 6 Apr 2022 08:52:45 +0800 Subject: [PATCH 240/328] =?UTF-8?q?=E6=9B=B4=E6=96=B00122.=E4=B9=B0?= =?UTF-8?q?=E5=8D=96=E8=82=A1=E7=A5=A8=E7=9A=84=E6=9C=80=E4=BD=B3=E6=97=B6?= =?UTF-8?q?=E6=9C=BAII=EF=BC=9A=E9=94=99=E5=AD=97=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0122.买卖股票的最佳时机II.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/0122.买卖股票的最佳时机II.md b/problems/0122.买卖股票的最佳时机II.md index 83b852c6..b31cbae3 100644 --- a/problems/0122.买卖股票的最佳时机II.md +++ b/problems/0122.买卖股票的最佳时机II.md @@ -40,7 +40,7 @@ 本题首先要清楚两点: * 只有一只股票! -* 当前只有买股票或者买股票的操作 +* 当前只有买股票或者卖股票的操作 想获得利润至少要两天为一个交易单元。 From fa00cd53b597d9ce837319f1967d0ae6478c430e Mon Sep 17 00:00:00 2001 From: lingyin Date: Wed, 6 Apr 2022 10:28:57 +0800 Subject: [PATCH 241/328] =?UTF-8?q?=E7=AE=80=E5=8C=96Peek=E5=87=BD?= =?UTF-8?q?=E6=95=B0=EF=BC=8C=E5=A4=8D=E7=94=A8Pop?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0232.用栈实现队列.md | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/problems/0232.用栈实现队列.md b/problems/0232.用栈实现队列.md index b00ffd80..1a56d9f3 100644 --- a/problems/0232.用栈实现队列.md +++ b/problems/0232.用栈实现队列.md @@ -275,15 +275,11 @@ func (this *MyQueue) Pop() int { /** Get the front element. */ func (this *MyQueue) Peek() int { - for len(this.stack) != 0 { - val := this.stack[len(this.stack)-1] - this.stack = this.stack[:len(this.stack)-1] - this.back = append(this.back, val) - } - if len(this.back) == 0 { + val := this.Pop() + if val == 0 { return 0 } - val := this.back[len(this.back)-1] + this.back = append(this.back, val) return val } From ee93d4d62c36f74e5f878882cd28f7877c60d570 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Wed, 6 Apr 2022 15:40:01 +0800 Subject: [PATCH 242/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880376.?= =?UTF-8?q?=E6=91=86=E5=8A=A8=E5=BA=8F=E5=88=97.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0376.摆动序列.md | 50 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/problems/0376.摆动序列.md b/problems/0376.摆动序列.md index 5076c9ad..acd8996e 100644 --- a/problems/0376.摆动序列.md +++ b/problems/0376.摆动序列.md @@ -298,5 +298,55 @@ var wiggleMaxLength = function(nums) { }; ``` +### TypeScript + +**贪心** + +```typescript +function wiggleMaxLength(nums: number[]): number { + let length: number = nums.length; + if (length <= 1) return length; + let preDiff: number = 0; + let curDiff: number = 0; + let count: number = 1; + for (let i = 1; i < length; i++) { + curDiff = nums[i] - nums[i - 1]; + if ( + (preDiff <= 0 && curDiff > 0) || + (preDiff >= 0 && curDiff < 0) + ) { + preDiff = curDiff; + count++; + } + } + return count; +}; +``` + +**动态规划** + +```typescript +function wiggleMaxLength(nums: number[]): number { + const length: number = nums.length; + if (length <= 1) return length; + const dp: number[][] = new Array(length).fill(0).map(_ => []); + dp[0][0] = 1; // 第一个数作为波峰 + dp[0][1] = 1; // 第一个数作为波谷 + for (let i = 1; i < length; i++) { + dp[i][0] = 1; + dp[i][1] = 1; + for (let j = 0; j < i; j++) { + if (nums[j] < nums[i]) dp[i][0] = Math.max(dp[i][0], dp[j][1] + 1); + } + for (let j = 0; j < i; j++) { + if (nums[j] > nums[i]) dp[i][1] = Math.max(dp[i][1], dp[j][0] + 1); + } + } + return Math.max(dp[length - 1][0], dp[length - 1][1]); +}; +``` + + + -----------------------
From e4f34f3e47f6120c85e48d2032e6c00d1d13dad0 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Wed, 6 Apr 2022 16:23:34 +0800 Subject: [PATCH 243/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880053.?= =?UTF-8?q?=E6=9C=80=E5=A4=A7=E5=AD=90=E5=BA=8F=E5=92=8C.md=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0053.最大子序和.md | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/problems/0053.最大子序和.md b/problems/0053.最大子序和.md index 3d11c91e..b5fb7642 100644 --- a/problems/0053.最大子序和.md +++ b/problems/0053.最大子序和.md @@ -211,7 +211,7 @@ func maxSubArray(nums []int) int { return maxSum } ``` - + ### Javascript: ```Javascript var maxSubArray = function(nums) { @@ -230,6 +230,41 @@ var maxSubArray = function(nums) { }; ``` +### TypeScript + +**贪心** + +```typescript +function maxSubArray(nums: number[]): number { + let curSum: number = 0; + let resMax: number = -Infinity; + for (let i = 0, length = nums.length; i < length; i++) { + curSum += nums[i]; + resMax = Math.max(curSum, resMax); + if (curSum < 0) curSum = 0; + } + return resMax; +}; +``` + +**动态规划** + +```typescript +// 动态规划 +function maxSubArray(nums: number[]): number { + const length = nums.length; + if (length === 0) return 0; + const dp: number[] = []; + dp[0] = nums[0]; + let resMax: number = nums[0]; + for (let i = 1; i < length; i++) { + dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]); + resMax = Math.max(resMax, dp[i]); + } + return resMax; +}; +``` + ----------------------- From 92c6b3609fb85036f68039fd20ac52c8c919fba0 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Wed, 6 Apr 2022 22:46:46 +0800 Subject: [PATCH 244/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880122.?= =?UTF-8?q?=E4=B9=B0=E5=8D=96=E8=82=A1=E7=A5=A8=E7=9A=84=E6=9C=80=E4=BD=B3?= =?UTF-8?q?=E6=97=B6=E6=9C=BAII.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0type?= =?UTF-8?q?script=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0122.买卖股票的最佳时机II.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/problems/0122.买卖股票的最佳时机II.md b/problems/0122.买卖股票的最佳时机II.md index 83b852c6..1e4d017c 100644 --- a/problems/0122.买卖股票的最佳时机II.md +++ b/problems/0122.买卖股票的最佳时机II.md @@ -268,6 +268,18 @@ const maxProfit = (prices) => { }; ``` +TypeScript: + +```typescript +function maxProfit(prices: number[]): number { + let resProfit: number = 0; + for (let i = 1, length = prices.length; i < length; i++) { + resProfit += Math.max(prices[i] - prices[i - 1], 0); + } + return resProfit; +}; +``` + C: ```c From 1e6ec2d32a5cb21ba049646979b23ed948f46444 Mon Sep 17 00:00:00 2001 From: zhuye Date: Wed, 6 Apr 2022 23:05:01 +0800 Subject: [PATCH 245/328] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E3=80=900707-?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E9=93=BE=E8=A1=A8.md=E3=80=91TypeScript?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0707.设计链表.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/problems/0707.设计链表.md b/problems/0707.设计链表.md index 86f3a683..c5a55574 100644 --- a/problems/0707.设计链表.md +++ b/problems/0707.设计链表.md @@ -973,6 +973,9 @@ class MyLinkedList { // 处理头节点 if (index === 0) { this.head = this.head!.next; + if (index === this.size - 1) { + this.tail = null + } this.size--; return; } From 6e09456aefe7981d272e355c28e4ab43597ac5b1 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Wed, 6 Apr 2022 23:23:22 +0800 Subject: [PATCH 246/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880055.?= =?UTF-8?q?=E8=B7=B3=E8=B7=83=E6=B8=B8=E6=88=8F.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0055.跳跃游戏.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/problems/0055.跳跃游戏.md b/problems/0055.跳跃游戏.md index c0890f75..94614242 100644 --- a/problems/0055.跳跃游戏.md +++ b/problems/0055.跳跃游戏.md @@ -154,6 +154,23 @@ var canJump = function(nums) { }; ``` +### TypeScript + +```typescript +function canJump(nums: number[]): boolean { + let farthestIndex: number = 0; + let cur: number = 0; + while (cur <= farthestIndex) { + farthestIndex = Math.max(farthestIndex, cur + nums[cur]); + if (farthestIndex >= nums.length - 1) return true; + cur++; + } + return false; +}; +``` + + + -----------------------
From 31800730a2634f0a40c99075d277acc251c1634a Mon Sep 17 00:00:00 2001 From: zhuye Date: Wed, 6 Apr 2022 23:30:18 +0800 Subject: [PATCH 247/328] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E3=80=900707-?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E9=93=BE=E8=A1=A8.md=E3=80=91TypeScript?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0707.设计链表.md | 1 + 1 file changed, 1 insertion(+) diff --git a/problems/0707.设计链表.md b/problems/0707.设计链表.md index c5a55574..37ce15ad 100644 --- a/problems/0707.设计链表.md +++ b/problems/0707.设计链表.md @@ -973,6 +973,7 @@ class MyLinkedList { // 处理头节点 if (index === 0) { this.head = this.head!.next; + // 如果链表中只有一个元素,删除头节点后,需要处理尾节点 if (index === this.size - 1) { this.tail = null } From f70acb963a499e3a627d2358a4119b24649d74d7 Mon Sep 17 00:00:00 2001 From: speed <771935730@qq.com> Date: Thu, 7 Apr 2022 00:03:02 +0800 Subject: [PATCH 248/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200763.=E5=88=92?= =?UTF-8?q?=E5=88=86=E5=AD=97=E6=AF=8D=E5=8C=BA=E9=97=B4.md=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E7=B1=BB=E4=BC=BC=E5=BC=95=E7=88=86=E6=B0=94=E7=90=83?= =?UTF-8?q?=E7=9A=84=E6=80=9D=E8=B7=AF=E4=BB=A5=E5=8F=8A=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0763.划分字母区间.md | 47 +++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/problems/0763.划分字母区间.md b/problems/0763.划分字母区间.md index 03d3a73b..d3958bd5 100644 --- a/problems/0763.划分字母区间.md +++ b/problems/0763.划分字母区间.md @@ -77,6 +77,53 @@ public: 但这道题目的思路是很巧妙的,所以有必要介绍给大家做一做,感受一下。 +## 补充 + +这里提供一种与[452.用最少数量的箭引爆气球](https://programmercarl.com/0452.用最少数量的箭引爆气球.html)、[435.无重叠区间](https://programmercarl.com/0435.无重叠区间.html)相同的思路。 + +统计字符串中所有字符的起始和结束位置,记录这些区间(实际上也就是[435.无重叠区间](https://programmercarl.com/0435.无重叠区间.html)题目里的输入),**将区间按左边界从小到大排序,找到边界将区间划分成组,互不重叠。找到的边界就是答案。** + +```CPP +class Solution { +public: + static bool cmp(vector &a, vector &b) { + return a[0] < b[0]; + } + // 记录每个字母出现的区间 + void countLabels(string s, vector> &hash) { + for (int i = 0; i < s.size(); ++i) { + if (hash[s[i] - 'a'][0] == INT_MIN) { + hash[s[i] - 'a'][0] = i; + } + hash[s[i] - 'a'][1] = i; + } + } + vector partitionLabels(string s) { + vector res; + vector> hash(26, vector(2, INT_MIN)); + countLabels(s, hash); + // 按照左边界从小到大排序 + sort(hash.begin(), hash.end(), cmp); + // 记录最大右边界 + int rightBoard = INT_MIN; + int leftBoard = 0; + for (int i = 0; i < hash.size(); ++i) { + // 过滤掉字符串中没有的字母 + if (hash[i][0] == INT_MIN) { + continue; + } + // 一旦下一区间左边界大于当前右边界,即可认为出现分割点 + if (rightBoard != INT_MIN && hash[i][0] > rightBoard) { + res.push_back(rightBoard - leftBoard + 1); + leftBoard = hash[i][0]; + } + rightBoard = max(rightBoard, hash[i][1]); + } + res.push_back(rightBoard - leftBoard + 1); + return res; + } +}; +``` ## 其他语言版本 From c590dfc5f29e910a85798f144bcc7178dda2bde4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98Carl?= Date: Thu, 7 Apr 2022 09:34:25 +0800 Subject: [PATCH 249/328] Delete yarn.lock --- yarn.lock | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 yarn.lock diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 3ff608ae..00000000 --- a/yarn.lock +++ /dev/null @@ -1,4 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - From bbe312015eca5207064aa42f3530e254845a1e62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98Carl?= Date: Thu, 7 Apr 2022 09:34:51 +0800 Subject: [PATCH 250/328] Delete .yarn-integrity --- node_modules/.yarn-integrity | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 node_modules/.yarn-integrity diff --git a/node_modules/.yarn-integrity b/node_modules/.yarn-integrity deleted file mode 100644 index 29e4357c..00000000 --- a/node_modules/.yarn-integrity +++ /dev/null @@ -1,10 +0,0 @@ -{ - "systemParams": "win32-x64-83", - "modulesFolders": [], - "flags": [], - "linkedModules": [], - "topLevelPatterns": [], - "lockfileEntries": {}, - "files": [], - "artifacts": {} -} \ No newline at end of file From 3048b00d72146838275c37ec549b76eeca8813a9 Mon Sep 17 00:00:00 2001 From: speed Date: Thu, 7 Apr 2022 10:52:27 +0800 Subject: [PATCH 251/328] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BA=860763.?= =?UTF-8?q?=E5=88=92=E5=88=86=E5=AD=97=E6=AF=8D=E5=8C=BA=E9=97=B4.md=20?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=B4=AA=E5=BF=83=E6=80=9D=E8=B7=AF=E7=9A=84?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0763.划分字母区间.md | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/problems/0763.划分字母区间.md b/problems/0763.划分字母区间.md index d3958bd5..d350f255 100644 --- a/problems/0763.划分字母区间.md +++ b/problems/0763.划分字母区间.md @@ -90,35 +90,43 @@ public: return a[0] < b[0]; } // 记录每个字母出现的区间 - void countLabels(string s, vector> &hash) { + vector> countLabels(string s) { + vector> hash(26, vector(2, INT_MIN)); + vector> hash_filter; for (int i = 0; i < s.size(); ++i) { if (hash[s[i] - 'a'][0] == INT_MIN) { hash[s[i] - 'a'][0] = i; } hash[s[i] - 'a'][1] = i; } + // 去除字符串中未出现的字母所占用区间 + for (int i = 0; i < hash.size(); ++i) { + if (hash[i][0] != INT_MIN) { + hash_filter.push_back(hash[i]); + } + } + return hash_filter; } vector partitionLabels(string s) { vector res; - vector> hash(26, vector(2, INT_MIN)); - countLabels(s, hash); + // 这一步得到的 hash 即为无重叠区间题意中的输入样例格式:区间列表 + // 只不过现在我们要求的是区间分割点 + vector> hash = countLabels(s); // 按照左边界从小到大排序 sort(hash.begin(), hash.end(), cmp); // 记录最大右边界 - int rightBoard = INT_MIN; + int rightBoard = hash[0][1]; int leftBoard = 0; - for (int i = 0; i < hash.size(); ++i) { - // 过滤掉字符串中没有的字母 - if (hash[i][0] == INT_MIN) { - continue; - } + for (int i = 1; i < hash.size(); ++i) { + // 由于字符串一定能分割,因此, // 一旦下一区间左边界大于当前右边界,即可认为出现分割点 - if (rightBoard != INT_MIN && hash[i][0] > rightBoard) { + if (hash[i][0] > rightBoard) { res.push_back(rightBoard - leftBoard + 1); leftBoard = hash[i][0]; } rightBoard = max(rightBoard, hash[i][1]); } + // 最右端 res.push_back(rightBoard - leftBoard + 1); return res; } From 3e856447424fd1a4cd37ed7b54331fea33fec588 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Thu, 7 Apr 2022 15:25:48 +0800 Subject: [PATCH 252/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880045.?= =?UTF-8?q?=E8=B7=B3=E8=B7=83=E6=B8=B8=E6=88=8FII.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0045.跳跃游戏II.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/problems/0045.跳跃游戏II.md b/problems/0045.跳跃游戏II.md index 7a3f048c..4caff042 100644 --- a/problems/0045.跳跃游戏II.md +++ b/problems/0045.跳跃游戏II.md @@ -250,6 +250,27 @@ var jump = function(nums) { }; ``` +### TypeScript + +```typescript +function jump(nums: number[]): number { + const length: number = nums.length; + let curFarthestIndex: number = 0, + nextFarthestIndex: number = 0; + let curIndex: number = 0; + let stepNum: number = 0; + while (curIndex < length - 1) { + nextFarthestIndex = Math.max(nextFarthestIndex, curIndex + nums[curIndex]); + if (curIndex === curFarthestIndex) { + curFarthestIndex = nextFarthestIndex; + stepNum++; + } + curIndex++; + } + return stepNum; +}; +``` + From 38deed9e52058872eb522a8d629a265ae78df1e2 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Thu, 7 Apr 2022 15:58:32 +0800 Subject: [PATCH 253/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=881005.K?= =?UTF-8?q?=E6=AC=A1=E5=8F=96=E5=8F=8D=E5=90=8E=E6=9C=80=E5=A4=A7=E5=8C=96?= =?UTF-8?q?=E7=9A=84=E6=95=B0=E7=BB=84=E5=92=8C.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/1005.K次取反后最大化的数组和.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/problems/1005.K次取反后最大化的数组和.md b/problems/1005.K次取反后最大化的数组和.md index 45f186e2..80c47147 100644 --- a/problems/1005.K次取反后最大化的数组和.md +++ b/problems/1005.K次取反后最大化的数组和.md @@ -211,5 +211,29 @@ var largestSumAfterKNegations = function(nums, k) { }; ``` +### TypeScript + +```typescript +function largestSumAfterKNegations(nums: number[], k: number): number { + nums.sort((a, b) => Math.abs(b) - Math.abs(a)); + let curIndex: number = 0; + const length = nums.length; + while (curIndex < length && k > 0) { + if (nums[curIndex] < 0) { + nums[curIndex] *= -1; + k--; + } + curIndex++; + } + while (k > 0) { + nums[length - 1] *= -1; + k--; + } + return nums.reduce((pre, cur) => pre + cur, 0); +}; +``` + + + -----------------------
From 328b447cf44335883ce51109859f6f801e2515a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=A2=A6=E6=B4=81?= <3224935686@qq.com> Date: Thu, 7 Apr 2022 21:16:00 +0800 Subject: [PATCH 254/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0(0108.=E5=B0=86?= =?UTF-8?q?=E6=9C=89=E5=BA=8F=E6=95=B0=E7=BB=84=E8=BD=AC=E6=8D=A2=E4=B8=BA?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91.md):=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0JavaScript=E8=BF=AD=E4=BB=A3=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0108.将有序数组转换为二叉搜索树.md | 40 ++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/problems/0108.将有序数组转换为二叉搜索树.md b/problems/0108.将有序数组转换为二叉搜索树.md index bd5915fd..6ee3947b 100644 --- a/problems/0108.将有序数组转换为二叉搜索树.md +++ b/problems/0108.将有序数组转换为二叉搜索树.md @@ -355,6 +355,7 @@ func sortedArrayToBST(nums []int) *TreeNode { ``` ## JavaScript +递归 ```javascript var sortedArrayToBST = function (nums) { @@ -372,7 +373,44 @@ var sortedArrayToBST = function (nums) { return buildTree(nums, 0, nums.length - 1); }; ``` - +迭代 +```JavaScript +var sortedArrayToBST = function(nums) { + if(nums.length===0){ + return null; + } + let root=new TreeNode(0); //初始根节点 + let nodeQue=[root]; //放遍历的节点,并初始化 + let leftQue=[0]; //放左区间的下标,初始化 + let rightQue=[nums.length-1]; // 放右区间的下标 + + while(nodeQue.length){ + let curNode=nodeQue.pop(); + let left=leftQue.pop(); + let right=rightQue.pop(); + let mid=left+Math.floor((right-left)/2); + + curNode.val=nums[mid]; //将下标为mid的元素给中间节点 + +// 处理左区间 + if(left<=mid-1){ + curNode.left=new TreeNode(0); + nodeQue.push(curNode.left); + leftQue.push(left); + rightQue.push(mid-1); + } + +// 处理右区间 + if(right>=mid+1){ + curNode.right=new TreeNode(0); + nodeQue.push(curNode.right); + leftQue.push(mid+1); + rightQue.push(right); + } + } + return root; +}; +``` ## TypeScript ```typescript From 82df90fd14fc8897559256a65d3ba53258daf262 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Thu, 7 Apr 2022 23:58:15 +0800 Subject: [PATCH 255/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880134.?= =?UTF-8?q?=E5=8A=A0=E6=B2=B9=E7=AB=99.md=EF=BC=89=EF=BC=9A=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0134.加油站.md | 45 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/problems/0134.加油站.md b/problems/0134.加油站.md index 1062a91c..d3b3d453 100644 --- a/problems/0134.加油站.md +++ b/problems/0134.加油站.md @@ -235,7 +235,7 @@ class Solution { return index; } } -``` +``` ### Python ```python @@ -340,7 +340,50 @@ var canCompleteCircuit = function(gas, cost) { }; ``` +### TypeScript + +**暴力法:** + +```typescript +function canCompleteCircuit(gas: number[], cost: number[]): number { + for (let i = 0, length = gas.length; i < length; i++) { + let curSum: number = 0; + let index: number = i; + while (curSum >= 0 && index < i + length) { + let tempIndex: number = index % length; + curSum += gas[tempIndex] - cost[tempIndex]; + index++; + } + if (index === i + length && curSum >= 0) return i; + } + return -1; +}; +``` + +**解法二:** + +```typescript +function canCompleteCircuit(gas: number[], cost: number[]): number { + let total: number = 0; + let curGas: number = 0; + let tempDiff: number = 0; + let resIndex: number = 0; + for (let i = 0, length = gas.length; i < length; i++) { + tempDiff = gas[i] - cost[i]; + total += tempDiff; + curGas += tempDiff; + if (curGas < 0) { + resIndex = i + 1; + curGas = 0; + } + } + if (total < 0) return -1; + return resIndex; +}; +``` + ### C + ```c int canCompleteCircuit(int* gas, int gasSize, int* cost, int costSize){ int curSum = 0; From 1496b59646e00b189bd3586145e1474d593b65cb Mon Sep 17 00:00:00 2001 From: mxdneu Date: Fri, 8 Apr 2022 00:17:47 +0800 Subject: [PATCH 256/328] =?UTF-8?q?fix=20js=E8=9E=BA=E6=97=8B=E6=95=B0?= =?UTF-8?q?=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0059.螺旋矩阵II.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/problems/0059.螺旋矩阵II.md b/problems/0059.螺旋矩阵II.md index 5c679982..a7b19a34 100644 --- a/problems/0059.螺旋矩阵II.md +++ b/problems/0059.螺旋矩阵II.md @@ -246,11 +246,11 @@ var generateMatrix = function(n) { res[row][col] = count++; } // 下行从右到左(左闭右开) - for (; col > startX; col--) { + for (; col > startY; col--) { res[row][col] = count++; } // 左列做下到上(左闭右开) - for (; row > startY; row--) { + for (; row > startX; row--) { res[row][col] = count++; } From 0ecc3bd7cfdea391e9725030442cad617c277989 Mon Sep 17 00:00:00 2001 From: sanwulol Date: Fri, 8 Apr 2022 17:00:59 +0800 Subject: [PATCH 257/328] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E3=80=900122-?= =?UTF-8?q?=E4=B9=B0=E5=8D=96=E8=82=A1=E7=A5=A8=E7=9A=84=E6=9C=80=E4=BD=B3?= =?UTF-8?q?=E6=97=B6=E6=9C=BAII.md=E3=80=91javaScript=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0122.买卖股票的最佳时机II.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/0122.买卖股票的最佳时机II.md b/problems/0122.买卖股票的最佳时机II.md index 83b852c6..1e6dc7c0 100644 --- a/problems/0122.买卖股票的最佳时机II.md +++ b/problems/0122.买卖股票的最佳时机II.md @@ -264,7 +264,7 @@ const maxProfit = (prices) => { dp[i][1] = Math.max(dp[i-1][1], dp[i-1][0] + prices[i]); } - return dp[prices.length -1][0]; + return dp[prices.length -1][1]; }; ``` From ff135662de4d1f282ead7f76c17a35806d99259e Mon Sep 17 00:00:00 2001 From: sanwulol Date: Fri, 8 Apr 2022 17:01:19 +0800 Subject: [PATCH 258/328] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E3=80=900122-?= =?UTF-8?q?=E4=B9=B0=E5=8D=96=E8=82=A1=E7=A5=A8=E7=9A=84=E6=9C=80=E4=BD=B3?= =?UTF-8?q?=E6=97=B6=E6=9C=BAII.md(=E5=8A=A8=E6=80=81=E8=A7=84=E5=88=92)?= =?UTF-8?q?=E3=80=91javaScript=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0122.买卖股票的最佳时机II(动态规划).md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/0122.买卖股票的最佳时机II(动态规划).md b/problems/0122.买卖股票的最佳时机II(动态规划).md index 615d79bb..5a165a14 100644 --- a/problems/0122.买卖股票的最佳时机II(动态规划).md +++ b/problems/0122.买卖股票的最佳时机II(动态规划).md @@ -276,7 +276,7 @@ const maxProfit = (prices) => { dp[i][1] = Math.max(dp[i-1][1], dp[i-1][0] + prices[i]); } - return dp[prices.length -1][0]; + return dp[prices.length -1][1]; }; // 方法二:动态规划(滚动数组) From ccfa2c495fc5c7762517dc990a2fe58328a3292a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E4=BB=A4=E4=BB=A4?= Date: Fri, 8 Apr 2022 18:02:30 +0800 Subject: [PATCH 259/328] =?UTF-8?q?Update=200028.=E5=AE=9E=E7=8E=B0strStr.?= =?UTF-8?q?md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 swift 前缀表两种实现方法 --- problems/0028.实现strStr.md | 107 ++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) diff --git a/problems/0028.实现strStr.md b/problems/0028.实现strStr.md index 634d8535..d67e5f70 100644 --- a/problems/0028.实现strStr.md +++ b/problems/0028.实现strStr.md @@ -1059,5 +1059,112 @@ func getNext(_ next: inout [Int], needle: [Character]) { ``` +> 前缀表右移 + +```swift +func strStr(_ haystack: String, _ needle: String) -> Int { + + let s = Array(haystack), p = Array(needle) + guard p.count != 0 else { return 0 } + + var j = 0 + var next = [Int].init(repeating: 0, count: p.count) + getNext(&next, p) + + for i in 0 ..< s.count { + + while j > 0 && s[i] != p[j] { + j = next[j] + } + + if s[i] == p[j] { + j += 1 + } + + if j == p.count { + return i - p.count + 1 + } + } + + return -1 + } + + // 前缀表后移一位,首位用 -1 填充 + func getNext(_ next: inout [Int], _ needle: [Character]) { + + guard needle.count > 1 else { return } + + var j = 0 + next[0] = j + + for i in 1 ..< needle.count-1 { + + while j > 0 && needle[i] != needle[j] { + j = next[j-1] + } + + if needle[i] == needle[j] { + j += 1 + } + + next[i] = j + } + next.removeLast() + next.insert(-1, at: 0) + } +``` + +> 前缀表统一不减一 +```swift + +func strStr(_ haystack: String, _ needle: String) -> Int { + + let s = Array(haystack), p = Array(needle) + guard p.count != 0 else { return 0 } + + var j = 0 + var next = [Int](repeating: 0, count: needle.count) + // KMP + getNext(&next, needle: p) + + for i in 0 ..< s.count { + while j > 0 && s[i] != p[j] { + j = next[j-1] + } + + if s[i] == p[j] { + j += 1 + } + + if j == p.count { + return i - p.count + 1 + } + } + return -1 + } + + //前缀表 + func getNext(_ next: inout [Int], needle: [Character]) { + + var j = 0 + next[0] = j + + for i in 1 ..< needle.count { + + while j>0 && needle[i] != needle[j] { + j = next[j-1] + } + + if needle[i] == needle[j] { + j += 1 + } + + next[i] = j + + } + } + +``` + -----------------------
From 559f03c92869ca55ae929d66de872f5ddda70567 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E4=BB=A4=E4=BB=A4?= Date: Fri, 8 Apr 2022 18:11:05 +0800 Subject: [PATCH 260/328] =?UTF-8?q?Update=200459.=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E7=9A=84=E5=AD=90=E5=AD=97=E7=AC=A6=E4=B8=B2.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0459.重复的子字符串.md | 43 +++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/problems/0459.重复的子字符串.md b/problems/0459.重复的子字符串.md index ccfb485c..6a9b4260 100644 --- a/problems/0459.重复的子字符串.md +++ b/problems/0459.重复的子字符串.md @@ -421,5 +421,48 @@ function repeatedSubstringPattern(s: string): boolean { }; ``` + +Swift: + +> 前缀表统一减一 +```swift + func repeatedSubstringPattern(_ s: String) -> Bool { + + let sArr = Array(s) + let len = s.count + if len == 0 { + return false + } + var next = Array.init(repeating: -1, count: len) + + getNext(&next,sArr) + + if next.last != -1 && len % (len - (next[len-1] + 1)) == 0{ + return true + } + + return false + } + + func getNext(_ next: inout [Int], _ str:[Character]) { + + var j = -1 + next[0] = j + + for i in 1 ..< str.count { + + while j >= 0 && str[j+1] != str[i] { + j = next[j] + } + + if str[i] == str[j+1] { + j += 1 + } + + next[i] = j + } + } +``` + -----------------------
From 278bcb67b8250c0cea57b6a8f970e007d1259f23 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 8 Apr 2022 20:28:24 +0800 Subject: [PATCH 261/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880135.?= =?UTF-8?q?=E5=88=86=E5=8F=91=E7=B3=96=E6=9E=9C.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0135.分发糖果.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/problems/0135.分发糖果.md b/problems/0135.分发糖果.md index ccdabc16..b8bdae0e 100644 --- a/problems/0135.分发糖果.md +++ b/problems/0135.分发糖果.md @@ -238,6 +238,32 @@ var candy = function(ratings) { }; ``` +### TypeScript + +```typescript +function candy(ratings: number[]): number { + const candies: number[] = []; + candies[0] = 1; + // 保证右边高分孩子一定比左边低分孩子发更多的糖果 + for (let i = 1, length = ratings.length; i < length; i++) { + if (ratings[i] > ratings[i - 1]) { + candies[i] = candies[i - 1] + 1; + } else { + candies[i] = 1; + } + } + // 保证左边高分孩子一定比右边低分孩子发更多的糖果 + for (let i = ratings.length - 2; i >= 0; i--) { + if (ratings[i] > ratings[i + 1]) { + candies[i] = Math.max(candies[i], candies[i + 1] + 1); + } + } + return candies.reduce((pre, cur) => pre + cur); +}; +``` + + + -----------------------
From 2f5996de0d7bcb91c615dbe9ff8e07cb339a1e42 Mon Sep 17 00:00:00 2001 From: Austin <40263822+LookCos@users.noreply.github.com> Date: Fri, 8 Apr 2022 21:01:24 +0800 Subject: [PATCH 262/328] =?UTF-8?q?Update=200416.=E5=88=86=E5=89=B2?= =?UTF-8?q?=E7=AD=89=E5=92=8C=E5=AD=90=E9=9B=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 错别字。 --- problems/0416.分割等和子集.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/0416.分割等和子集.md b/problems/0416.分割等和子集.md index c8d9bc04..70f0cb51 100644 --- a/problems/0416.分割等和子集.md +++ b/problems/0416.分割等和子集.md @@ -50,7 +50,7 @@ ## 01背包问题 -背包问题,大家都知道,有N件物品和一个最多能被重量为W 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。 +背包问题,大家都知道,有N件物品和一个最多能背重量为W 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。 **背包问题有多种背包方式,常见的有:01背包、完全背包、多重背包、分组背包和混合背包等等。** From 2f3f35c5727cb9469e3c186f26217d8cb053e242 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Fri, 8 Apr 2022 21:33:51 +0800 Subject: [PATCH 263/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880860.?= =?UTF-8?q?=E6=9F=A0=E6=AA=AC=E6=B0=B4=E6=89=BE=E9=9B=B6.md=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0860.柠檬水找零.md | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/problems/0860.柠檬水找零.md b/problems/0860.柠檬水找零.md index f48ecf4d..026c2e63 100644 --- a/problems/0860.柠檬水找零.md +++ b/problems/0860.柠檬水找零.md @@ -254,5 +254,39 @@ var lemonadeChange = function(bills) { ``` +### TypeScript + +```typescript +function lemonadeChange(bills: number[]): boolean { + let five: number = 0, + ten: number = 0; + for (let bill of bills) { + switch (bill) { + case 5: + five++; + break; + case 10: + if (five < 1) return false; + five--; + ten++ + break; + case 20: + if (ten > 0 && five > 0) { + five--; + ten--; + } else if (five > 2) { + five -= 3; + } else { + return false; + } + break; + } + } + return true; +}; +``` + + + -----------------------
From 0e1cbda7153b3b5b2892110696f10afe7833a38f Mon Sep 17 00:00:00 2001 From: "Neil.Liu" <88214924@qq.com> Date: Fri, 8 Apr 2022 23:56:49 +0800 Subject: [PATCH 264/328] =?UTF-8?q?Update=200121.=E5=8D=96=E8=82=A1?= =?UTF-8?q?=E7=A5=A8=E7=9A=84=E6=9C=80=E4=BD=B3=E6=97=B6=E6=9C=BA.md=20?= =?UTF-8?q?=E8=B4=AA=E5=BF=83=E4=BB=A5=E5=8F=8A=E5=8A=A8=E6=80=81=E8=A7=84?= =?UTF-8?q?=E5=88=92=20Go=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0121.买卖股票的最佳时机.md | 52 +++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/problems/0121.买卖股票的最佳时机.md b/problems/0121.买卖股票的最佳时机.md index e7c0ac65..f0bc3b97 100644 --- a/problems/0121.买卖股票的最佳时机.md +++ b/problems/0121.买卖股票的最佳时机.md @@ -311,7 +311,36 @@ class Solution: ``` Go: +> 贪心法: +```Go +func maxProfit(prices []int) int { + low := math.MaxInt32 + rlt := 0 + for i := range prices{ + low = min(low, prices[i]) + rlt = max(rlt, prices[i]-low) + } + return rlt +} +func min(a, b int) int { + if a < b{ + return a + } + + return b +} + +func max(a, b int) int { + if a > b{ + return a + } + + return b +} +``` + +> 动态规划:版本一 ```Go func maxProfit(prices []int) int { length:=len(prices) @@ -338,6 +367,29 @@ func max(a,b int)int { } ``` +> 动态规划:版本二 +```Go +func maxProfit(prices []int) int { + dp := [2][2]int{} + dp[0][0] = -prices[0] + dp[0][1] = 0 + for i := 1; i < len(prices); i++{ + dp[i%2][0] = max(dp[(i-1)%2][0], -prices[i]) + dp[i%2][1] = max(dp[(i-1)%2][1], dp[(i-1)%2][0]+prices[i]) + } + + return dp[(len(prices)-1)%2][1] +} + +func max(a, b int) int { + if a > b{ + return a + } + + return b +} +``` + JavaScript: > 动态规划 From 888bd8fe0b2320ffd0afe4cfe014e79116d23944 Mon Sep 17 00:00:00 2001 From: dmzlingyin Date: Sat, 9 Apr 2022 00:12:46 +0800 Subject: [PATCH 265/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0(ACM=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E5=A6=82=E4=BD=95=E6=9E=84=E5=BB=BA=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91.md):=20Go=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/前序/ACM模式如何构建二叉树.md | 66 ++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/problems/前序/ACM模式如何构建二叉树.md b/problems/前序/ACM模式如何构建二叉树.md index bd2e9780..dba87ca1 100644 --- a/problems/前序/ACM模式如何构建二叉树.md +++ b/problems/前序/ACM模式如何构建二叉树.md @@ -220,6 +220,72 @@ int main() { ## Go ```Go +package main + +import "fmt" + +type TreeNode struct { + Val int + Left *TreeNode + Right *TreeNode +} + +func constructBinaryTree(array []int) *TreeNode { + var root *TreeNode + nodes := make([]*TreeNode, len(array)) + + // 初始化二叉树节点 + for i := 0; i < len(nodes); i++ { + var node *TreeNode + if array[i] != -1 { + node = &TreeNode{Val: array[i]} + } + nodes[i] = node + if i == 0 { + root = node + } + } + // 串联节点 + for i := 0; i*2+2 < len(array); i++ { + if nodes[i] != nil { + nodes[i].Left = nodes[i*2+1] + nodes[i].Right = nodes[i*2+2] + } + } + return root +} + +func printBinaryTree(root *TreeNode, n int) { + var queue []*TreeNode + if root != nil { + queue = append(queue, root) + } + + result := []int{} + for len(queue) > 0 { + for j := 0; j < len(queue); j++ { + node := queue[j] + if node != nil { + result = append(result, node.Val) + queue = append(queue, node.Left) + queue = append(queue, node.Right) + } else { + result = append(result, -1) + } + } + // 清除队列中的本层节点, 进入下一层遍历 + queue = queue[len(queue):] + } + // 参数n控制输出值数量, 否则二叉树最后一层叶子节点的孩子节点也会被打印(但是这些孩子节点是不存在的). + fmt.Println(result[:n]) +} + +func main() { + array := []int{4, 1, 6, 0, 2, 5, 7, -1, -1, -1, 3, -1, -1, -1, 8} + root := constructBinaryTree(array) + printBinaryTree(root, len(array)) +} + ``` ## JavaScript From 7ad56a33e0cb2313fd0bdaaaf1bccb26f6b09b1f Mon Sep 17 00:00:00 2001 From: lingyin <32977462+dmzlingyin@users.noreply.github.com> Date: Sat, 9 Apr 2022 00:19:52 +0800 Subject: [PATCH 266/328] =?UTF-8?q?Update=20ACM=E6=A8=A1=E5=BC=8F=E5=A6=82?= =?UTF-8?q?=E4=BD=95=E6=9E=84=E5=BB=BA=E4=BA=8C=E5=8F=89=E6=A0=91.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/前序/ACM模式如何构建二叉树.md | 93 +++++++++++++------------- 1 file changed, 47 insertions(+), 46 deletions(-) diff --git a/problems/前序/ACM模式如何构建二叉树.md b/problems/前序/ACM模式如何构建二叉树.md index dba87ca1..444f0071 100644 --- a/problems/前序/ACM模式如何构建二叉树.md +++ b/problems/前序/ACM模式如何构建二叉树.md @@ -225,65 +225,66 @@ package main import "fmt" type TreeNode struct { - Val int - Left *TreeNode - Right *TreeNode + Val int + Left *TreeNode + Right *TreeNode } func constructBinaryTree(array []int) *TreeNode { - var root *TreeNode - nodes := make([]*TreeNode, len(array)) + var root *TreeNode + nodes := make([]*TreeNode, len(array)) - // 初始化二叉树节点 - for i := 0; i < len(nodes); i++ { - var node *TreeNode - if array[i] != -1 { - node = &TreeNode{Val: array[i]} - } - nodes[i] = node - if i == 0 { - root = node - } + // 初始化二叉树节点 + for i := 0; i < len(nodes); i++ { + var node *TreeNode + if array[i] != -1 { + node = &TreeNode{Val: array[i]} } - // 串联节点 - for i := 0; i*2+2 < len(array); i++ { - if nodes[i] != nil { - nodes[i].Left = nodes[i*2+1] - nodes[i].Right = nodes[i*2+2] - } + nodes[i] = node + if i == 0 { + root = node } - return root + } + // 串联节点 + for i := 0; i*2+2 < len(array); i++ { + if nodes[i] != nil { + nodes[i].Left = nodes[i*2+1] + nodes[i].Right = nodes[i*2+2] + } + } + return root } func printBinaryTree(root *TreeNode, n int) { - var queue []*TreeNode - if root != nil { - queue = append(queue, root) - } + var queue []*TreeNode + if root != nil { + queue = append(queue, root) + } - result := []int{} - for len(queue) > 0 { - for j := 0; j < len(queue); j++ { - node := queue[j] - if node != nil { - result = append(result, node.Val) - queue = append(queue, node.Left) - queue = append(queue, node.Right) - } else { - result = append(result, -1) - } - } - // 清除队列中的本层节点, 进入下一层遍历 - queue = queue[len(queue):] - } - // 参数n控制输出值数量, 否则二叉树最后一层叶子节点的孩子节点也会被打印(但是这些孩子节点是不存在的). - fmt.Println(result[:n]) + result := []int{} + for len(queue) > 0 { + for j := 0; j < len(queue); j++ { + node := queue[j] + if node != nil { + result = append(result, node.Val) + queue = append(queue, node.Left) + queue = append(queue, node.Right) + } else { + result = append(result, -1) + } + } + // 清除队列中的本层节点, 进入下一层遍历 + queue = queue[len(queue):] + } + + // 参数n控制输出值数量, 否则二叉树最后一层叶子节点的孩子节点也会被打印(但是这些孩子节点是不存在的). + fmt.Println(result[:n]) } func main() { - array := []int{4, 1, 6, 0, 2, 5, 7, -1, -1, -1, 3, -1, -1, -1, 8} - root := constructBinaryTree(array) - printBinaryTree(root, len(array)) + array := []int{4, 1, 6, 0, 2, 5, 7, -1, -1, -1, 3, -1, -1, -1, 8} + root := constructBinaryTree(array) + printBinaryTree(root, len(array)) } ``` From 2e18054079ecfa1147bfc4335fd6c62609a44c37 Mon Sep 17 00:00:00 2001 From: jonathanx111 <57882619+jonathanx111@users.noreply.github.com> Date: Sat, 9 Apr 2022 13:49:55 -0400 Subject: [PATCH 267/328] =?UTF-8?q?=E7=BA=A0=E6=AD=A30027=E7=9A=84Swift?= =?UTF-8?q?=E7=AD=94=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Swift答案写错了。改成对的答案。 --- problems/0027.移除元素.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/problems/0027.移除元素.md b/problems/0027.移除元素.md index 8d6ca502..590cf0b9 100644 --- a/problems/0027.移除元素.md +++ b/problems/0027.移除元素.md @@ -281,10 +281,8 @@ func removeElement(_ nums: inout [Int], _ val: Int) -> Int { for fastIndex in 0.. Date: Sun, 10 Apr 2022 10:17:10 +0800 Subject: [PATCH 268/328] =?UTF-8?q?=E5=88=A0=E9=99=A4=E4=BA=86=E6=9D=A5?= =?UTF-8?q?=E8=87=AAMac=E7=9A=84.DS=5FStore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pics/.DS_Store | Bin 6148 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 pics/.DS_Store diff --git a/pics/.DS_Store b/pics/.DS_Store deleted file mode 100644 index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 Date: Sun, 10 Apr 2022 14:56:56 +0800 Subject: [PATCH 269/328] =?UTF-8?q?Update=200018.=E5=9B=9B=E6=95=B0?= =?UTF-8?q?=E4=B9=8B=E5=92=8C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加剪枝逻辑处理 --- problems/0018.四数之和.md | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/problems/0018.四数之和.md b/problems/0018.四数之和.md index 7304254e..ee70cb69 100644 --- a/problems/0018.四数之和.md +++ b/problems/0018.四数之和.md @@ -31,7 +31,7 @@ 四数之和,和[15.三数之和](https://programmercarl.com/0015.三数之和.html)是一个思路,都是使用双指针法, 基本解法就是在[15.三数之和](https://programmercarl.com/0015.三数之和.html) 的基础上再套一层for循环。 -但是有一些细节需要注意,例如: 不要判断`nums[k] > target` 就返回了,三数之和 可以通过 `nums[i] > 0` 就返回了,因为 0 已经是确定的数了,四数之和这道题目 target是任意值。(大家亲自写代码就能感受出来) +但是有一些细节需要注意,例如: 不要判断`nums[k] > target` 就返回了,三数之和 可以通过 `nums[i] > 0` 就返回了,因为 0 已经是确定的数了,四数之和这道题目 target是任意值。比如:数组是`[-4, -3, -2, -1]`,`target`是`-10`,不能因为`-4 > -10`而跳过。但是我们依旧可以去做剪枝,逻辑变成`nums[i] > target && (nums[i] >=0 || target >= 0)`就可以了。 [15.三数之和](https://programmercarl.com/0015.三数之和.html)的双指针解法是一层for循环num[i]为确定值,然后循环内有left和right下标作为双指针,找到nums[i] + nums[left] + nums[right] == 0。 @@ -72,15 +72,20 @@ public: vector> result; sort(nums.begin(), nums.end()); for (int k = 0; k < nums.size(); k++) { - // 这种剪枝是错误的,这道题目target 是任意值 - // if (nums[k] > target) { - // return result; - // } + // 剪枝处理 + if (nums[k] > target && (nums[k] >= 0 || target >= 0)) { + break; // 这里使用break,统一通过最后的return返回 + } // 去重 if (k > 0 && nums[k] == nums[k - 1]) { continue; } for (int i = k + 1; i < nums.size(); i++) { + // 2级剪枝处理 + if (nums[k] + nums[i] > target && (nums[k] + nums[i] >= 0 || target >= 0)) { + break; + } + // 正确去重方法 if (i > k + 1 && nums[i] == nums[i - 1]) { continue; From 175b71d21fc5e3bdddc21e5dafe8a73980d79016 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sun, 10 Apr 2022 21:59:21 +0800 Subject: [PATCH 270/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880406.?= =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E8=BA=AB=E9=AB=98=E9=87=8D=E5=BB=BA=E9=98=9F?= =?UTF-8?q?=E5=88=97.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0406.根据身高重建队列.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/problems/0406.根据身高重建队列.md b/problems/0406.根据身高重建队列.md index b2354d09..ecb05301 100644 --- a/problems/0406.根据身高重建队列.md +++ b/problems/0406.根据身高重建队列.md @@ -290,6 +290,24 @@ var reconstructQueue = function(people) { }; ``` +### TypeScript + +```typescript +function reconstructQueue(people: number[][]): number[][] { + people.sort((a, b) => { + if (a[0] === b[0]) return a[1] - b[1]; + return b[0] - a[0]; + }); + const resArr: number[][] = []; + for (let i = 0, length = people.length; i < length; i++) { + resArr.splice(people[i][1], 0, people[i]); + } + return resArr; +}; +``` + + + -----------------------
From ef44e750cec20980095e63db3c090c8df48f620c Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Mon, 11 Apr 2022 20:34:32 +0100 Subject: [PATCH 271/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200376.=E6=91=86?= =?UTF-8?q?=E5=8A=A8=E5=BA=8F=E5=88=97.md=20C=E8=AF=AD=E8=A8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0376.摆动序列.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/problems/0376.摆动序列.md b/problems/0376.摆动序列.md index 5076c9ad..6bd2277f 100644 --- a/problems/0376.摆动序列.md +++ b/problems/0376.摆动序列.md @@ -298,5 +298,32 @@ var wiggleMaxLength = function(nums) { }; ``` +### C +**贪心** +```c +int wiggleMaxLength(int* nums, int numsSize){ + if(numsSize <= 1) + return numsSize; + + int length = 1; + int preDiff , curDiff; + preDiff = curDiff = 0; + for(int i = 0; i < numsSize - 1; ++i) { + // 计算当前i元素与i+1元素差值 + curDiff = nums[i+1] - nums[i]; + + // 若preDiff与curDiff符号不符,则子序列长度+1。更新preDiff的符号 + // 若preDiff与curDiff符号一致,当前i元素为连续升序/连续降序子序列的中间元素。不被记录入长度 + // 注:当preDiff为0时,curDiff为正或为负都属于符号不同 + if((curDiff > 0 && preDiff <= 0) || (preDiff >= 0 && curDiff < 0)) { + preDiff = curDiff; + length++; + } + } + + return length; +} +``` + -----------------------
From ae38a29068241636052e831d96b1e446dddd979e Mon Sep 17 00:00:00 2001 From: Jamcy123 <1219502823@qq.com> Date: Tue, 12 Apr 2022 16:57:25 +0800 Subject: [PATCH 272/328] =?UTF-8?q?=E4=BF=AE=E6=94=B9=200503.=E4=B8=8B?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=E6=9B=B4=E5=A4=A7=E5=85=83=E7=B4=A0II=20java?= =?UTF-8?q?script=20=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0503.下一个更大元素II.md | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/problems/0503.下一个更大元素II.md b/problems/0503.下一个更大元素II.md index 36e183e1..d6d3850f 100644 --- a/problems/0503.下一个更大元素II.md +++ b/problems/0503.下一个更大元素II.md @@ -166,20 +166,19 @@ JavaScript: * @return {number[]} */ var nextGreaterElements = function (nums) { - // let map = new Map(); + const len = nums.length; let stack = []; - let res = new Array(nums.length).fill(-1); - for (let i = 0; i < nums.length * 2; i++) { + let res = Array(len).fill(-1); + for (let i = 0; i < len * 2; i++) { while ( stack.length && - nums[i % nums.length] > nums[stack[stack.length - 1]] + nums[i % len] > nums[stack[stack.length - 1]] ) { - let index = stack.pop(); - res[index] = nums[i % nums.length]; + const index = stack.pop(); + res[index] = nums[i % len]; } - stack.push(i % nums.length); + stack.push(i % len); } - return res; }; ``` From 82ab1706f88e390ff2f13478cd7771cc92e76754 Mon Sep 17 00:00:00 2001 From: Jamcy123 <1219502823@qq.com> Date: Tue, 12 Apr 2022 17:09:20 +0800 Subject: [PATCH 273/328] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E4=B8=80=E3=80=81=E5=A2=9E=E5=8A=A0=E7=89=88=E6=9C=AC=E4=BA=8C?= =?UTF-8?q?=200739.=E6=AF=8F=E6=97=A5=E6=B8=A9=E5=BA=A6=20javascript=20?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0739.每日温度.md | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/problems/0739.每日温度.md b/problems/0739.每日温度.md index 710f5eb6..5f53e412 100644 --- a/problems/0739.每日温度.md +++ b/problems/0739.每日温度.md @@ -301,25 +301,22 @@ func dailyTemperatures(num []int) []int { JavaScript: ```javascript -/** - * @param {number[]} temperatures - * @return {number[]} - */ +// 版本一 var dailyTemperatures = function(temperatures) { - let n = temperatures.length; - let res = new Array(n).fill(0); - let stack = []; // 递减栈:用于存储元素右面第一个比他大的元素下标 + const n = temperatures.length; + const res = Array(n).fill(0); + const stack = []; // 递增栈:用于存储元素右面第一个比他大的元素下标 stack.push(0); for (let i = 1; i < n; i++) { // 栈顶元素 - let top = stack[stack.length - 1]; + const top = stack[stack.length - 1]; if (temperatures[i] < temperatures[top]) { stack.push(i); } else if (temperatures[i] === temperatures[top]) { stack.push(i); } else { while (stack.length && temperatures[i] > temperatures[stack[stack.length - 1]]) { - let top = stack.pop(); + const top = stack.pop(); res[top] = i - top; } stack.push(i); @@ -327,6 +324,23 @@ var dailyTemperatures = function(temperatures) { } return res; }; + + +// 版本二 +var dailyTemperatures = function(temperatures) { + const n = temperatures.length; + const res = Array(n).fill(0); + const stack = []; // 递增栈:用于存储元素右面第一个比他大的元素下标 + stack.push(0); + for (let i = 1; i < n; i++) { + while (stack.length && temperatures[i] > temperatures[stack[stack.length - 1]]) { + const top = stack.pop(); + res[top] = i - top; + } + stack.push(i); + } + return res; +}; ``` From 54d0d9d1c1a579e0a8750f1be864ad78b8d13c45 Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Tue, 12 Apr 2022 10:43:46 +0100 Subject: [PATCH 274/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200053.=E6=9C=80?= =?UTF-8?q?=E5=A4=A7=E5=AD=90=E6=95=B0=E7=BB=84=E5=92=8C.md=20C=E8=AF=AD?= =?UTF-8?q?=E8=A8=80=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0053.最大子序和.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/problems/0053.最大子序和.md b/problems/0053.最大子序和.md index 3d11c91e..9af02edf 100644 --- a/problems/0053.最大子序和.md +++ b/problems/0053.最大子序和.md @@ -230,6 +230,24 @@ var maxSubArray = function(nums) { }; ``` +### C: +```c +int maxSubArray(int* nums, int numsSize){ + int maxVal = INT_MIN; + int subArrSum = 0; + + int i; + for(i = 0; i < numsSize; ++i) { + subArrSum += nums[i]; + // 若当前局部和大于之前的最大结果,对结果进行更新 + maxVal = subArrSum > maxVal ? subArrSum : maxVal; + // 若当前局部和为负,对结果无益。则从nums[i+1]开始应重新计算。 + subArrSum = subArrSum < 0 ? 0 : subArrSum; + } + + return maxVal; +} +``` ----------------------- From af724ef6d5ed95c4ba545a932f8257b487648aec Mon Sep 17 00:00:00 2001 From: xuerbujia <83055661+xuerbujia@users.noreply.github.com> Date: Tue, 12 Apr 2022 17:45:50 +0800 Subject: [PATCH 275/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880143.?= =?UTF-8?q?=E9=87=8D=E6=8E=92=E9=93=BE=E8=A1=A8.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0go=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0143.重排链表.md | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/problems/0143.重排链表.md b/problems/0143.重排链表.md index 00622623..790bcb48 100644 --- a/problems/0143.重排链表.md +++ b/problems/0143.重排链表.md @@ -336,7 +336,33 @@ class Solution: return pre ``` ### Go - +```go +# 方法三 分割链表 +func reorderList(head *ListNode) { + var slow=head + var fast=head + for fast!=nil&&fast.Next!=nil{ + slow=slow.Next + fast=fast.Next.Next + } //双指针将链表分为左右两部分 + var right =new(ListNode) + for slow!=nil{ + temp:=slow.Next + slow.Next=right.Next + right.Next=slow + slow=temp + } //翻转链表右半部分 + right=right.Next //right为反转后得右半部分 + h:=head + for right.Next!=nil{ + temp:=right.Next + right.Next=h.Next + h.Next=right + h=h.Next.Next + right=temp + } //将左右两部分重新组合 +} +``` ### JavaScript ```javascript From dd63a865717b0a439cc2ce2b5abab0a55d18d7de Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Tue, 12 Apr 2022 11:01:53 +0100 Subject: [PATCH 276/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200053.=E6=9C=80?= =?UTF-8?q?=E5=A4=A7=E5=AD=90=E6=95=B0=E7=BB=84=E5=92=8C.md=20C=E8=AF=AD?= =?UTF-8?q?=E8=A8=80=E5=8A=A8=E6=80=81=E8=A7=84=E5=88=92=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0053.最大子序和.md | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/problems/0053.最大子序和.md b/problems/0053.最大子序和.md index 9af02edf..3d4459a3 100644 --- a/problems/0053.最大子序和.md +++ b/problems/0053.最大子序和.md @@ -231,6 +231,7 @@ var maxSubArray = function(nums) { ``` ### C: +贪心: ```c int maxSubArray(int* nums, int numsSize){ int maxVal = INT_MIN; @@ -249,6 +250,39 @@ int maxSubArray(int* nums, int numsSize){ } ``` +动态规划: +```c +/** + * 解题思路:动态规划: + * 1. dp数组:dp[i]表示从0到i的子序列中最大序列和的值 + * 2. 递推公式:dp[i] = max(dp[i-1] + nums[i], nums[i]) + 若dp[i-1]<0,对最后结果无益。dp[i]则为nums[i]。 + * 3. dp数组初始化:dp[0]的最大子数组和为nums[0] + * 4. 推导顺序:从前往后遍历 + */ + +#define max(a, b) (((a) > (b)) ? (a) : (b)) + +int maxSubArray(int* nums, int numsSize){ + int dp[numsSize]; + // dp[0]最大子数组和为nums[0] + dp[0] = nums[0]; + // 若numsSize为1,应直接返回nums[0] + int subArrSum = nums[0]; + + int i; + for(i = 1; i < numsSize; ++i) { + dp[i] = max(dp[i - 1] + nums[i], nums[i]); + + // 若dp[i]大于之前记录的最大值,进行更新 + if(dp[i] > subArrSum) + subArrSum = dp[i]; + } + + return subArrSum; +} +``` + -----------------------
From 804d7e0171936ec370855ebb592fe123b731d8d8 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Tue, 12 Apr 2022 22:23:28 +0800 Subject: [PATCH 277/328] delete $ --- problems/0063.不同路径II.md | 4 +- problems/0123.买卖股票的最佳时机III.md | 8 ++-- problems/0139.单词拆分.md | 2 +- problems/0151.翻转字符串里的单词.md | 2 +- problems/0343.整数拆分.md | 4 +- problems/0450.删除二叉搜索树中的节点.md | 2 +- problems/0503.下一个更大元素II.md | 2 +- problems/0674.最长连续递增序列.md | 10 ++-- ....买卖股票的最佳时机含手续费(动态规划).md | 8 ++-- problems/0844.比较含退格的字符串.md | 2 +- problems/0922.按奇偶排序数组II.md | 2 +- ...n)的算法居然超时了,此时的n究竟是多大?.md | 2 +- .../关于时间复杂度,你不知道的都在这里!.md | 6 +-- .../关于时间复杂度,你不知道的都在这里!.md | 46 +++++++++---------- .../前序/关于空间复杂度,可能有几个疑问?.md | 14 +++--- problems/前序/编程素养部分的吹毛求疵.md | 2 +- .../前序/递归算法的时间与空间复杂度分析.md | 26 +++++------ ...一道面试题目,讲一讲递归算法的时间复杂度!.md | 24 +++++----- problems/剑指Offer58-II.左旋转字符串.md | 2 +- problems/双指针总结.md | 2 +- problems/周总结/20200927二叉树周末总结.md | 2 +- problems/周总结/20201126贪心周末总结.md | 2 +- problems/周总结/20201210复杂度分析周末总结.md | 6 +-- problems/周总结/20201217贪心周末总结.md | 2 +- problems/周总结/20210225动规周末总结.md | 16 +++---- problems/哈希表理论基础.md | 14 +++--- problems/回溯总结.md | 2 +- problems/数组总结篇.md | 2 +- .../根据身高重建队列(vector原理讲解).md | 2 +- problems/贪心算法总结篇.md | 16 +------ 30 files changed, 111 insertions(+), 123 deletions(-) diff --git a/problems/0063.不同路径II.md b/problems/0063.不同路径II.md index c71cf796..a40cceda 100644 --- a/problems/0063.不同路径II.md +++ b/problems/0063.不同路径II.md @@ -184,8 +184,8 @@ public: }; ``` -* 时间复杂度:$O(n × m)$,n、m 分别为obstacleGrid 长度和宽度 -* 空间复杂度:$O(m)$ +* 时间复杂度:O(n × m),n、m 分别为obstacleGrid 长度和宽度 +* 空间复杂度:O(m) ## 总结 diff --git a/problems/0123.买卖股票的最佳时机III.md b/problems/0123.买卖股票的最佳时机III.md index fc81c3e9..56ade343 100644 --- a/problems/0123.买卖股票的最佳时机III.md +++ b/problems/0123.买卖股票的最佳时机III.md @@ -148,8 +148,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(n × 5)$ +* 时间复杂度:O(n) +* 空间复杂度:O(n × 5) 当然,大家可以看到力扣官方题解里的一种优化空间写法,我这里给出对应的C++版本: @@ -173,8 +173,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n) +* 空间复杂度:O(1) 大家会发现dp[2]利用的是当天的dp[1]。 但结果也是对的。 diff --git a/problems/0139.单词拆分.md b/problems/0139.单词拆分.md index 7f1e6f17..ac834f04 100644 --- a/problems/0139.单词拆分.md +++ b/problems/0139.单词拆分.md @@ -207,7 +207,7 @@ public: }; ``` -* 时间复杂度:O(n^3),因为substr返回子串的副本是$O(n)$的复杂度(这里的n是substring的长度) +* 时间复杂度:O(n^3),因为substr返回子串的副本是O(n)的复杂度(这里的n是substring的长度) * 空间复杂度:O(n) diff --git a/problems/0151.翻转字符串里的单词.md b/problems/0151.翻转字符串里的单词.md index 8dfe9bbc..4865821a 100644 --- a/problems/0151.翻转字符串里的单词.md +++ b/problems/0151.翻转字符串里的单词.md @@ -79,7 +79,7 @@ void removeExtraSpaces(string& s) { 逻辑很简单,从前向后遍历,遇到空格了就erase。 -如果不仔细琢磨一下erase的时间复杂读,还以为以上的代码是$O(n)$的时间复杂度呢。 +如果不仔细琢磨一下erase的时间复杂读,还以为以上的代码是O(n)的时间复杂度呢。 想一下真正的时间复杂度是多少,一个erase本来就是O(n)的操作,erase实现原理题目:[数组:就移除个元素很难么?](https://programmercarl.com/0027.移除元素.html),最优的算法来移除元素也要O(n)。 diff --git a/problems/0343.整数拆分.md b/problems/0343.整数拆分.md index 777146ba..4a7ba6ab 100644 --- a/problems/0343.整数拆分.md +++ b/problems/0343.整数拆分.md @@ -119,8 +119,8 @@ public: }; ``` -* 时间复杂度:$O(n^2)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(n^2) +* 空间复杂度:O(n) ### 贪心 diff --git a/problems/0450.删除二叉搜索树中的节点.md b/problems/0450.删除二叉搜索树中的节点.md index cc29bea4..e8f7e54c 100644 --- a/problems/0450.删除二叉搜索树中的节点.md +++ b/problems/0450.删除二叉搜索树中的节点.md @@ -51,7 +51,7 @@ if (root == nullptr) return root; * 确定单层递归的逻辑 -这里就把平衡二叉树中删除节点遇到的情况都搞清楚。 +这里就把二叉搜索树中删除节点遇到的情况都搞清楚。 有以下五种情况: diff --git a/problems/0503.下一个更大元素II.md b/problems/0503.下一个更大元素II.md index 36e183e1..ead31c8b 100644 --- a/problems/0503.下一个更大元素II.md +++ b/problems/0503.下一个更大元素II.md @@ -68,7 +68,7 @@ public: 这种写法确实比较直观,但做了很多无用操作,例如修改了nums数组,而且最后还要把result数组resize回去。 -resize倒是不费时间,是$O(1)$的操作,但扩充nums数组相当于多了一个$O(n)$的操作。 +resize倒是不费时间,是O(1)的操作,但扩充nums数组相当于多了一个O(n)的操作。 其实也可以不扩充nums,而是在遍历的过程中模拟走了两边nums。 diff --git a/problems/0674.最长连续递增序列.md b/problems/0674.最长连续递增序列.md index 51d04e92..e941d242 100644 --- a/problems/0674.最长连续递增序列.md +++ b/problems/0674.最长连续递增序列.md @@ -107,8 +107,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(n) +* 空间复杂度:O(n) ### 贪心 @@ -135,12 +135,12 @@ public: } }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n) +* 空间复杂度:O(1) ## 总结 -本题也是动规里子序列问题的经典题目,但也可以用贪心来做,大家也会发现贪心好像更简单一点,而且空间复杂度仅是$O(1)$。 +本题也是动规里子序列问题的经典题目,但也可以用贪心来做,大家也会发现贪心好像更简单一点,而且空间复杂度仅是O(1)。 在动规分析中,关键是要理解和[动态规划:300.最长递增子序列](https://programmercarl.com/0300.最长上升子序列.html)的区别。 diff --git a/problems/0714.买卖股票的最佳时机含手续费(动态规划).md b/problems/0714.买卖股票的最佳时机含手续费(动态规划).md index b385d710..4ab63e79 100644 --- a/problems/0714.买卖股票的最佳时机含手续费(动态规划).md +++ b/problems/0714.买卖股票的最佳时机含手续费(动态规划).md @@ -38,8 +38,8 @@ 使用贪心算法,的性能是: -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n) +* 空间复杂度:O(1) 那么我们再来看看是使用动规的方法如何解题。 @@ -87,8 +87,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(n) +* 空间复杂度:O(n) ## 其他语言版本 diff --git a/problems/0844.比较含退格的字符串.md b/problems/0844.比较含退格的字符串.md index 3bbfb73e..41791114 100644 --- a/problems/0844.比较含退格的字符串.md +++ b/problems/0844.比较含退格的字符串.md @@ -71,7 +71,7 @@ public: } }; ``` -* 时间复杂度:O(n + m),n为S的长度,m为T的长度 ,也可以理解是$O(n)$的时间复杂度 +* 时间复杂度:O(n + m),n为S的长度,m为T的长度 ,也可以理解是O(n)的时间复杂度 * 空间复杂度:O(n + m) 当然以上代码,大家可以发现有重复的逻辑处理S,处理T,可以把这块公共逻辑抽离出来,代码精简如下: diff --git a/problems/0922.按奇偶排序数组II.md b/problems/0922.按奇偶排序数组II.md index 4ff419d3..cb564fb6 100644 --- a/problems/0922.按奇偶排序数组II.md +++ b/problems/0922.按奇偶排序数组II.md @@ -112,7 +112,7 @@ public: * 时间复杂度:O(n) * 空间复杂度:O(1) -这里时间复杂度并不是$O(n^2)$,因为偶数位和奇数位都只操作一次,不是n/2 * n/2的关系,而是n/2 + n/2的关系! +这里时间复杂度并不是O(n^2),因为偶数位和奇数位都只操作一次,不是n/2 * n/2的关系,而是n/2 + n/2的关系! ## 其他语言版本 diff --git a/problems/O(n)的算法居然超时了,此时的n究竟是多大?.md b/problems/O(n)的算法居然超时了,此时的n究竟是多大?.md index 75f441db..24302b2d 100644 --- a/problems/O(n)的算法居然超时了,此时的n究竟是多大?.md +++ b/problems/O(n)的算法居然超时了,此时的n究竟是多大?.md @@ -148,7 +148,7 @@ O(nlogn)的算法,1s内大概计算机可以运行 2 * (10^7)次计算,符 ![程序超时1](https://img-blog.csdnimg.cn/20201208231559175.png) -至于$O(\log n)$和$O(n^3)$ 等等这些时间复杂度在1s内可以处理的多大的数据规模,大家可以自己写一写代码去测一下了。 +至于O(log n)和O(n^3) 等等这些时间复杂度在1s内可以处理的多大的数据规模,大家可以自己写一写代码去测一下了。 # 完整测试代码 diff --git a/problems/关于时间复杂度,你不知道的都在这里!.md b/problems/关于时间复杂度,你不知道的都在这里!.md index 77fdacc4..a0fd6d92 100644 --- a/problems/关于时间复杂度,你不知道的都在这里!.md +++ b/problems/关于时间复杂度,你不知道的都在这里!.md @@ -24,7 +24,7 @@ 算法导论给出的解释:**大O用来表示上界的**,当用它作为算法的最坏情况运行时间的上界,就是对任意数据输入的运行时间的上界。 -同样算法导论给出了例子:拿插入排序来说,插入排序的时间复杂度我们都说是$O(n^2)$ 。 +同样算法导论给出了例子:拿插入排序来说,插入排序的时间复杂度我们都说是O(n^2) 。 输入数据的形式对程序运算时间是有很大影响的,在数据本来有序的情况下时间复杂度是O(n),但如果数据是逆序的话,插入排序的时间复杂度就是O(n^2),也就对于所有输入情况来说,最坏是O(n^2) 的时间复杂度,所以称插入排序的时间复杂度为O(n^2)。 @@ -44,7 +44,7 @@ ![时间复杂度,不同数据规模的差异](https://img-blog.csdnimg.cn/20200728191447384.png) -在决定使用哪些算法的时候,不是时间复杂越低的越好(因为简化后的时间复杂度忽略了常数项等等),要考虑数据规模,如果数据规模很小甚至可以用$O(n^2)$的算法比$O(n)$的更合适(在有常数项的时候)。 +在决定使用哪些算法的时候,不是时间复杂越低的越好(因为简化后的时间复杂度忽略了常数项等等),要考虑数据规模,如果数据规模很小甚至可以用O(n^2)的算法比O(n)的更合适(在有常数项的时候)。 就像上图中 O(5n^2) 和 O(100n) 在n为20之前 很明显 O(5n^2)是更优的,所花费的时间也是最少的。 @@ -125,7 +125,7 @@ O(2 × n^2 + 10 × n + 1000) < O(3 × n^2),所以说最后省略掉常数项 如果是暴力枚举的话,时间复杂度是多少呢,是O(n^2)么? -这里一些同学会忽略了字符串比较的时间消耗,这里并不像int 型数字做比较那么简单,除了n^2次的遍历次数外,字符串比较依然要消耗m次操作(m也就是字母串的长度),所以时间复杂度是$O(m × n × n)$。 +这里一些同学会忽略了字符串比较的时间消耗,这里并不像int 型数字做比较那么简单,除了n^2次的遍历次数外,字符串比较依然要消耗m次操作(m也就是字母串的长度),所以时间复杂度是O(m × n × n)。 接下来再想一下其他解题思路。 diff --git a/problems/前序/关于时间复杂度,你不知道的都在这里!.md b/problems/前序/关于时间复杂度,你不知道的都在这里!.md index b2acb7dd..f19984e6 100644 --- a/problems/前序/关于时间复杂度,你不知道的都在这里!.md +++ b/problems/前序/关于时间复杂度,你不知道的都在这里!.md @@ -9,7 +9,7 @@ * 什么是大O * 不同数据规模的差异 * 复杂表达式的化简 -* $O(\log n)$中的log是以什么为底? +* O(log n)中的log是以什么为底? * 举一个例子 @@ -23,21 +23,21 @@ 那么该如何估计程序运行时间呢,通常会估算算法的操作单元数量来代表程序消耗的时间,这里默认CPU的每个单元运行消耗的时间都是相同的。 -假设算法的问题规模为n,那么操作单元数量便用函数f(n)来表示,随着数据规模n的增大,算法执行时间的增长率和f(n)的增长率相同,这称作为算法的渐近时间复杂度,简称时间复杂度,记为 $O(f(n)$)。 +假设算法的问题规模为n,那么操作单元数量便用函数f(n)来表示,随着数据规模n的增大,算法执行时间的增长率和f(n)的增长率相同,这称作为算法的渐近时间复杂度,简称时间复杂度,记为 O(f(n))。 ## 什么是大O -这里的大O是指什么呢,说到时间复杂度,**大家都知道$O(n)$,$O(n^2)$,却说不清什么是大O**。 +这里的大O是指什么呢,说到时间复杂度,**大家都知道O(n),O(n^2),却说不清什么是大O**。 算法导论给出的解释:**大O用来表示上界的**,当用它作为算法的最坏情况运行时间的上界,就是对任意数据输入的运行时间的上界。 -同样算法导论给出了例子:拿插入排序来说,插入排序的时间复杂度我们都说是$O(n^2)$ 。 +同样算法导论给出了例子:拿插入排序来说,插入排序的时间复杂度我们都说是O(n^2) 。 -输入数据的形式对程序运算时间是有很大影响的,在数据本来有序的情况下时间复杂度是$O(n)$,但如果数据是逆序的话,插入排序的时间复杂度就是$O(n^2)$,也就对于所有输入情况来说,最坏是$O(n^2)$ 的时间复杂度,所以称插入排序的时间复杂度为$O(n^2)$。 +输入数据的形式对程序运算时间是有很大影响的,在数据本来有序的情况下时间复杂度是O(n),但如果数据是逆序的话,插入排序的时间复杂度就是O(n^2),也就对于所有输入情况来说,最坏是O(n^2) 的时间复杂度,所以称插入排序的时间复杂度为O(n^2)。 -同样的同理再看一下快速排序,都知道快速排序是$O(n\log n)$,但是当数据已经有序情况下,快速排序的时间复杂度是$O(n^2)$ 的,**所以严格从大O的定义来讲,快速排序的时间复杂度应该是$O(n^2)$**。 +同样的同理再看一下快速排序,都知道快速排序是O(nlogn),但是当数据已经有序情况下,快速排序的时间复杂度是O(n^2) 的,**所以严格从大O的定义来讲,快速排序的时间复杂度应该是O(n^2)**。 -**但是我们依然说快速排序是$O(n\log n)$的时间复杂度,这个就是业内的一个默认规定,这里说的O代表的就是一般情况,而不是严格的上界**。如图所示: +**但是我们依然说快速排序是O(nlogn)的时间复杂度,这个就是业内的一个默认规定,这里说的O代表的就是一般情况,而不是严格的上界**。如图所示: ![时间复杂度4,一般情况下的时间复杂度](https://img-blog.csdnimg.cn/20200728185745611.png) 我们主要关心的还是一般情况下的数据形式。 @@ -51,11 +51,11 @@ ![时间复杂度,不同数据规模的差异](https://img-blog.csdnimg.cn/20200728191447384.png) -在决定使用哪些算法的时候,不是时间复杂越低的越好(因为简化后的时间复杂度忽略了常数项等等),要考虑数据规模,如果数据规模很小甚至可以用$O(n^2)$的算法比$O(n)$的更合适(在有常数项的时候)。 +在决定使用哪些算法的时候,不是时间复杂越低的越好(因为简化后的时间复杂度忽略了常数项等等),要考虑数据规模,如果数据规模很小甚至可以用O(n^2)的算法比O(n)的更合适(在有常数项的时候)。 -就像上图中 $O(5n^2)$ 和 $O(100n)$ 在n为20之前 很明显 $O(5n^2)$是更优的,所花费的时间也是最少的。 +就像上图中 O(5n^2) 和 O(100n) 在n为20之前 很明显 O(5n^2)是更优的,所花费的时间也是最少的。 -那为什么在计算时间复杂度的时候要忽略常数项系数呢,也就说$O(100n)$ 就是$O(n)$的时间复杂度,$O(5n^2)$ 就是$O(n^2)$的时间复杂度,而且要默认$O(n)$ 优于$O(n^2)$ 呢 ? +那为什么在计算时间复杂度的时候要忽略常数项系数呢,也就说O(100n) 就是O(n)的时间复杂度,O(5n^2) 就是O(n^2)的时间复杂度,而且要默认O(n) 优于O(n^2) 呢 ? 这里就又涉及到大O的定义,**因为大O就是数据量级突破一个点且数据量级非常大的情况下所表现出的时间复杂度,这个数据量也就是常数项系数已经不起决定性作用的数据量**。 @@ -63,13 +63,13 @@ **所以我们说的时间复杂度都是省略常数项系数的,是因为一般情况下都是默认数据规模足够的大,基于这样的事实,给出的算法时间复杂的的一个排行如下所示**: -O(1)常数阶 < $O(\log n)$对数阶 < $O(n)$线性阶 < $O(n^2)$平方阶 < $O(n^3)$立方阶 < $O(2^n)$指数阶 +O(1)常数阶 < O(logn)对数阶 < O(n)线性阶 < O(n^2)平方阶 < O(n^3)立方阶 < O(2^n)指数阶 但是也要注意大常数,如果这个常数非常大,例如10^7 ,10^9 ,那么常数就是不得不考虑的因素了。 ## 复杂表达式的化简 -有时候我们去计算时间复杂度的时候发现不是一个简单的$O(n)$ 或者$O(n^2)$, 而是一个复杂的表达式,例如: +有时候我们去计算时间复杂度的时候发现不是一个简单的O(n) 或者O(n^2), 而是一个复杂的表达式,例如: ``` O(2*n^2 + 10*n + 1000) @@ -95,19 +95,19 @@ O(n^2 + n) O(n^2) ``` -如果这一步理解有困难,那也可以做提取n的操作,变成$O(n(n+1)$) ,省略加法常数项后也就别变成了: +如果这一步理解有困难,那也可以做提取n的操作,变成O(n(n+1)) ,省略加法常数项后也就别变成了: ``` O(n^2) ``` -所以最后我们说:这个算法的算法时间复杂度是$O(n^2)$ 。 +所以最后我们说:这个算法的算法时间复杂度是O(n^2) 。 -也可以用另一种简化的思路,其实当n大于40的时候, 这个复杂度会恒小于$O(3 × n^2)$, -$O(2 × n^2 + 10 × n + 1000) < O(3 × n^2)$,所以说最后省略掉常数项系数最终时间复杂度也是$O(n^2)$。 +也可以用另一种简化的思路,其实当n大于40的时候, 这个复杂度会恒小于O(3 × n^2), +O(2 × n^2 + 10 × n + 1000) < O(3 × n^2),所以说最后省略掉常数项系数最终时间复杂度也是O(n^2)。 -## $O(\log n)$中的log是以什么为底? +## O(logn)中的log是以什么为底? 平时说这个算法的时间复杂度是logn的,那么一定是log 以2为底n的对数么? @@ -130,21 +130,21 @@ $O(2 × n^2 + 10 × n + 1000) < O(3 × n^2)$,所以说最后省略掉常数项 通过这道面试题目,来分析一下时间复杂度。题目描述:找出n个字符串中相同的两个字符串(假设这里只有两个相同的字符串)。 -如果是暴力枚举的话,时间复杂度是多少呢,是$O(n^2)$么? +如果是暴力枚举的话,时间复杂度是多少呢,是O(n^2)么? -这里一些同学会忽略了字符串比较的时间消耗,这里并不像int 型数字做比较那么简单,除了n^2 次的遍历次数外,字符串比较依然要消耗m次操作(m也就是字母串的长度),所以时间复杂度是$O(m × n × n)$。 +这里一些同学会忽略了字符串比较的时间消耗,这里并不像int 型数字做比较那么简单,除了n^2 次的遍历次数外,字符串比较依然要消耗m次操作(m也就是字母串的长度),所以时间复杂度是O(m × n × n)。 接下来再想一下其他解题思路。 先排对n个字符串按字典序来排序,排序后n个字符串就是有序的,意味着两个相同的字符串就是挨在一起,然后在遍历一遍n个字符串,这样就找到两个相同的字符串了。 -那看看这种算法的时间复杂度,快速排序时间复杂度为$O(n\log n)$,依然要考虑字符串的长度是m,那么快速排序每次的比较都要有m次的字符比较的操作,就是$O(m × n × \log n)$ 。 +那看看这种算法的时间复杂度,快速排序时间复杂度为O(nlogn),依然要考虑字符串的长度是m,那么快速排序每次的比较都要有m次的字符比较的操作,就是O(m × n × log n) 。 -之后还要遍历一遍这n个字符串找出两个相同的字符串,别忘了遍历的时候依然要比较字符串,所以总共的时间复杂度是 $O(m × n × \log n + n × m)$。 +之后还要遍历一遍这n个字符串找出两个相同的字符串,别忘了遍历的时候依然要比较字符串,所以总共的时间复杂度是 O(m × n × logn + n × m)。 -我们对$O(m × n × \log n + n × m)$ 进行简化操作,把$m × n$提取出来变成 $O(m × n × (\log n + 1)$),再省略常数项最后的时间复杂度是 $O(m × n × \log n)$。 +我们对O(m × n × log n + n × m) 进行简化操作,把m × n提取出来变成 O(m × n × (logn + 1)),再省略常数项最后的时间复杂度是 O(m × n × log n)。 -最后很明显$O(m × n × \log n)$ 要优于$O(m × n × n)$! +最后很明显O(m × n × logn) 要优于O(m × n × n)! 所以先把字符串集合排序再遍历一遍找到两个相同字符串的方法要比直接暴力枚举的方式更快。 diff --git a/problems/前序/关于空间复杂度,可能有几个疑问?.md b/problems/前序/关于空间复杂度,可能有几个疑问?.md index 162dfe96..19384fd9 100644 --- a/problems/前序/关于空间复杂度,可能有几个疑问?.md +++ b/problems/前序/关于空间复杂度,可能有几个疑问?.md @@ -3,14 +3,14 @@ # 空间复杂度分析 * [关于时间复杂度,你不知道的都在这里!](https://programmercarl.com/前序/关于时间复杂度,你不知道的都在这里!.html) -* [$O(n)$的算法居然超时了,此时的n究竟是多大?](https://programmercarl.com/前序/On的算法居然超时了,此时的n究竟是多大?.html) +* [O(n)的算法居然超时了,此时的n究竟是多大?](https://programmercarl.com/前序/On的算法居然超时了,此时的n究竟是多大?.html) * [通过一道面试题目,讲一讲递归算法的时间复杂度!](https://programmercarl.com/前序/通过一道面试题目,讲一讲递归算法的时间复杂度!.html) 那么一直还没有讲空间复杂度,所以打算陆续来补上,内容不难,大家可以读一遍文章就有整体的了解了。 什么是空间复杂度呢? -是对一个算法在运行过程中占用内存空间大小的量度,记做$S(n)=O(f(n)$。 +是对一个算法在运行过程中占用内存空间大小的量度,记做S(n)=O(f(n)。 空间复杂度(Space Complexity)记作S(n) 依然使用大O来表示。利用程序的空间复杂度,可以对程序运行中需要多少内存有个预先估计。 @@ -41,11 +41,11 @@ for (int i = 0; i < n; i++) { } ``` -第一段代码可以看出,随着n的变化,所需开辟的内存空间并不会随着n的变化而变化。即此算法空间复杂度为一个常量,所以表示为大$O(1)$。 +第一段代码可以看出,随着n的变化,所需开辟的内存空间并不会随着n的变化而变化。即此算法空间复杂度为一个常量,所以表示为大O(1)。 -什么时候的空间复杂度是$O(n)$? +什么时候的空间复杂度是O(n)? -当消耗空间和输入参数n保持线性增长,这样的空间复杂度为$O(n)$,来看一下这段C++代码 +当消耗空间和输入参数n保持线性增长,这样的空间复杂度为O(n),来看一下这段C++代码 ```CPP int* a = new int(n); for (int i = 0; i < n; i++) { @@ -53,9 +53,9 @@ for (int i = 0; i < n; i++) { } ``` -我们定义了一个数组出来,这个数组占用的大小为n,虽然有一个for循环,但没有再分配新的空间,因此,这段代码的空间复杂度主要看第一行即可,随着n的增大,开辟的内存大小呈线性增长,即 $O(n)$。 +我们定义了一个数组出来,这个数组占用的大小为n,虽然有一个for循环,但没有再分配新的空间,因此,这段代码的空间复杂度主要看第一行即可,随着n的增大,开辟的内存大小呈线性增长,即 O(n)。 -其他的 $O(n^2)$, $O(n^3)$ 我想大家应该都可以以此例举出来了,**那么思考一下 什么时候空间复杂度是 $O(\log n)$呢?** +其他的 O(n^2), O(n^3) 我想大家应该都可以以此例举出来了,**那么思考一下 什么时候空间复杂度是 O(logn)呢?** 空间复杂度是logn的情况确实有些特殊,其实是在**递归的时候,会出现空间复杂度为logn的情况**。 diff --git a/problems/前序/编程素养部分的吹毛求疵.md b/problems/前序/编程素养部分的吹毛求疵.md index 3f18f9d1..6099747a 100644 --- a/problems/前序/编程素养部分的吹毛求疵.md +++ b/problems/前序/编程素养部分的吹毛求疵.md @@ -13,7 +13,7 @@ - 左孩子和右孩子的下标不太好理解。我给出证明过程: - 如果父节点在第$k$层,第$m,m \in [0,2^k]$个节点,则其左孩子所在的位置必然为$k+1$层,第$2*(m-1)+1$个节点。 + 如果父节点在第k层,第$m,m \in [0,2^k]$个节点,则其左孩子所在的位置必然为$k+1$层,第$2*(m-1)+1$个节点。 - 计算父节点在数组中的索引: $$ diff --git a/problems/前序/递归算法的时间与空间复杂度分析.md b/problems/前序/递归算法的时间与空间复杂度分析.md index 3c0d219c..142358da 100644 --- a/problems/前序/递归算法的时间与空间复杂度分析.md +++ b/problems/前序/递归算法的时间与空间复杂度分析.md @@ -26,7 +26,7 @@ int fibonacci(int i) { 在讲解递归时间复杂度的时候,我们提到了递归算法的时间复杂度本质上是要看: **递归的次数 * 每次递归的时间复杂度**。 -可以看出上面的代码每次递归都是$O(1)$的操作。再来看递归了多少次,这里将i为5作为输入的递归过程 抽象成一棵递归树,如图: +可以看出上面的代码每次递归都是O(1)的操作。再来看递归了多少次,这里将i为5作为输入的递归过程 抽象成一棵递归树,如图: ![递归空间复杂度分析](https://img-blog.csdnimg.cn/20210305093200104.png) @@ -36,7 +36,7 @@ int fibonacci(int i) { 我们之前也有说到,一棵深度(按根节点深度为1)为k的二叉树最多可以有 2^k - 1 个节点。 -所以该递归算法的时间复杂度为$O(2^n)$,这个复杂度是非常大的,随着n的增大,耗时是指数上升的。 +所以该递归算法的时间复杂度为O(2^n),这个复杂度是非常大的,随着n的增大,耗时是指数上升的。 来做一个实验,大家可以有一个直观的感受。 @@ -85,7 +85,7 @@ int main() * n = 40,耗时:837 ms * n = 50,耗时:110306 ms -可以看出,$O(2^n)$这种指数级别的复杂度是非常大的。 +可以看出,O(2^n)这种指数级别的复杂度是非常大的。 所以这种求斐波那契数的算法看似简洁,其实时间复杂度非常高,一般不推荐这样来实现斐波那契。 @@ -119,14 +119,14 @@ int fibonacci(int first, int second, int n) { 这里相当于用first和second来记录当前相加的两个数值,此时就不用两次递归了。 -因为每次递归的时候n减1,即只是递归了n次,所以时间复杂度是 $O(n)$。 +因为每次递归的时候n减1,即只是递归了n次,所以时间复杂度是 O(n)。 -同理递归的深度依然是n,每次递归所需的空间也是常数,所以空间复杂度依然是$O(n)$。 +同理递归的深度依然是n,每次递归所需的空间也是常数,所以空间复杂度依然是O(n)。 代码(版本二)的复杂度如下: -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(n) +* 空间复杂度:O(n) 此时再来测一下耗时情况验证一下: @@ -198,7 +198,7 @@ int main() 递归第n个斐波那契数的话,递归调用栈的深度就是n。 -那么每次递归的空间复杂度是$O(1)$, 调用栈深度为n,所以这段递归代码的空间复杂度就是$O(n)$。 +那么每次递归的空间复杂度是O(1), 调用栈深度为n,所以这段递归代码的空间复杂度就是O(n)。 ```CPP int fibonacci(int i) { @@ -233,24 +233,24 @@ int binary_search( int arr[], int l, int r, int x) { } ``` -都知道二分查找的时间复杂度是$O(\log n)$,那么递归二分查找的空间复杂度是多少呢? +都知道二分查找的时间复杂度是O(logn),那么递归二分查找的空间复杂度是多少呢? 我们依然看 **每次递归的空间复杂度和递归的深度** 每次递归的空间复杂度可以看出主要就是参数里传入的这个arr数组,但需要注意的是在C/C++中函数传递数组参数,不是整个数组拷贝一份传入函数而是传入的数组首元素地址。 -**也就是说每一层递归都是公用一块数组地址空间的**,所以 每次递归的空间复杂度是常数即:$O(1)$。 +**也就是说每一层递归都是公用一块数组地址空间的**,所以 每次递归的空间复杂度是常数即:O(1)。 -再来看递归的深度,二分查找的递归深度是logn ,递归深度就是调用栈的长度,那么这段代码的空间复杂度为 $1 * logn = O(logn)$。 +再来看递归的深度,二分查找的递归深度是logn ,递归深度就是调用栈的长度,那么这段代码的空间复杂度为 1 * logn = O(logn)。 -大家要注意自己所用的语言在传递函数参数的时,是拷贝整个数值还是拷贝地址,如果是拷贝整个数值那么该二分法的空间复杂度就是$O(n\log n)$。 +大家要注意自己所用的语言在传递函数参数的时,是拷贝整个数值还是拷贝地址,如果是拷贝整个数值那么该二分法的空间复杂度就是O(nlogn)。 ## 总结 本章我们详细分析了递归实现的求斐波那契和二分法的空间复杂度,同时也对时间复杂度做了分析。 -特别是两种递归实现的求斐波那契数列,其时间复杂度截然不容,我们还做了实验,验证了时间复杂度为$O(2^n)$是非常耗时的。 +特别是两种递归实现的求斐波那契数列,其时间复杂度截然不容,我们还做了实验,验证了时间复杂度为O(2^n)是非常耗时的。 通过本篇大家应该对递归算法的时间复杂度和空间复杂度有更加深刻的理解了。 diff --git a/problems/前序/通过一道面试题目,讲一讲递归算法的时间复杂度!.md b/problems/前序/通过一道面试题目,讲一讲递归算法的时间复杂度!.md index 12af4dd8..b2db92f5 100644 --- a/problems/前序/通过一道面试题目,讲一讲递归算法的时间复杂度!.md +++ b/problems/前序/通过一道面试题目,讲一讲递归算法的时间复杂度!.md @@ -5,13 +5,13 @@ 相信很多同学对递归算法的时间复杂度都很模糊,那么这篇来给大家通透的讲一讲。 -**同一道题目,同样使用递归算法,有的同学会写出了$O(n)$的代码,有的同学就写出了$O(\log n)$的代码**。 +**同一道题目,同样使用递归算法,有的同学会写出了O(n)的代码,有的同学就写出了O(logn)的代码**。 这是为什么呢? 如果对递归的时间复杂度理解的不够深入的话,就会这样! -那么我通过一道简单的面试题,模拟面试的场景,来带大家逐步分析递归算法的时间复杂度,最后找出最优解,来看看同样是递归,怎么就写成了$O(n)$的代码。 +那么我通过一道简单的面试题,模拟面试的场景,来带大家逐步分析递归算法的时间复杂度,最后找出最优解,来看看同样是递归,怎么就写成了O(n)的代码。 面试题:求x的n次方 @@ -26,7 +26,7 @@ int function1(int x, int n) { return result; } ``` -时间复杂度为$O(n)$,此时面试官会说,有没有效率更好的算法呢。 +时间复杂度为O(n),此时面试官会说,有没有效率更好的算法呢。 **如果此时没有思路,不要说:我不会,我不知道了等等**。 @@ -44,11 +44,11 @@ int function2(int x, int n) { ``` 面试官问:“那么这个代码的时间复杂度是多少?”。 -一些同学可能一看到递归就想到了$O(\log n)$,其实并不是这样,递归算法的时间复杂度本质上是要看: **递归的次数 * 每次递归中的操作次数**。 +一些同学可能一看到递归就想到了O(log n),其实并不是这样,递归算法的时间复杂度本质上是要看: **递归的次数 * 每次递归中的操作次数**。 那再来看代码,这里递归了几次呢? -每次n-1,递归了n次时间复杂度是$O(n)$,每次进行了一个乘法操作,乘法操作的时间复杂度一个常数项$O(1)$,所以这份代码的时间复杂度是 $n × 1 = O(n)$。 +每次n-1,递归了n次时间复杂度是O(n),每次进行了一个乘法操作,乘法操作的时间复杂度一个常数项O(1),所以这份代码的时间复杂度是 n × 1 = O(n)。 这个时间复杂度就没有达到面试官的预期。于是又写出了如下的递归算法的代码: @@ -81,11 +81,11 @@ int function3(int x, int n) { ![递归求时间复杂度](https://img-blog.csdnimg.cn/20200728195531892.png) -**时间复杂度忽略掉常数项`-1`之后,这个递归算法的时间复杂度依然是$O(n)$**。对,你没看错,依然是$O(n)$的时间复杂度! +**时间复杂度忽略掉常数项`-1`之后,这个递归算法的时间复杂度依然是O(n)**。对,你没看错,依然是O(n)的时间复杂度! -此时面试官就会说:“这个递归的算法依然还是$O(n)$啊”, 很明显没有达到面试官的预期。 +此时面试官就会说:“这个递归的算法依然还是O(n)啊”, 很明显没有达到面试官的预期。 -那么$O(\log n)$的递归算法应该怎么写呢? +那么O(logn)的递归算法应该怎么写呢? 想一想刚刚给出的那份递归算法的代码,是不是有哪里比较冗余呢,其实有重复计算的部分。 @@ -108,7 +108,7 @@ int function4(int x, int n) { 依然还是看他递归了多少次,可以看到这里仅仅有一个递归调用,且每次都是n/2 ,所以这里我们一共调用了log以2为底n的对数次。 -**每次递归了做都是一次乘法操作,这也是一个常数项的操作,那么这个递归算法的时间复杂度才是真正的$O(\log n)$**。 +**每次递归了做都是一次乘法操作,这也是一个常数项的操作,那么这个递归算法的时间复杂度才是真正的O(logn)**。 此时大家最后写出了这样的代码并且将时间复杂度分析的非常清晰,相信面试官是比较满意的。 @@ -116,11 +116,11 @@ int function4(int x, int n) { 对于递归的时间复杂度,毕竟初学者有时候会迷糊,刷过很多题的老手依然迷糊。 -**本篇我用一道非常简单的面试题目:求x的n次方,来逐步分析递归算法的时间复杂度,注意不要一看到递归就想到了$O(\log n)$!** +**本篇我用一道非常简单的面试题目:求x的n次方,来逐步分析递归算法的时间复杂度,注意不要一看到递归就想到了O(logn)!** -同样使用递归,有的同学可以写出$O(\log n)$的代码,有的同学还可以写出$O(n)$的代码。 +同样使用递归,有的同学可以写出O(logn)的代码,有的同学还可以写出O(n)的代码。 -对于function3 这样的递归实现,很容易让人感觉这是$O(\log n)$的时间复杂度,其实这是$O(n)$的算法! +对于function3 这样的递归实现,很容易让人感觉这是O(log n)的时间复杂度,其实这是O(n)的算法! ```CPP int function3(int x, int n) { diff --git a/problems/剑指Offer58-II.左旋转字符串.md b/problems/剑指Offer58-II.左旋转字符串.md index 61391274..fec83e1d 100644 --- a/problems/剑指Offer58-II.左旋转字符串.md +++ b/problems/剑指Offer58-II.左旋转字符串.md @@ -86,7 +86,7 @@ public: # 题外话 一些同学热衷于使用substr,来做这道题。 -其实使用substr 和 反转 时间复杂度是一样的 ,都是$O(n)$,但是使用substr申请了额外空间,所以空间复杂度是$O(n)$,而反转方法的空间复杂度是$O(1)$。 +其实使用substr 和 反转 时间复杂度是一样的 ,都是O(n),但是使用substr申请了额外空间,所以空间复杂度是O(n),而反转方法的空间复杂度是O(1)。 **如果想让这套题目有意义,就不要申请额外空间。** diff --git a/problems/双指针总结.md b/problems/双指针总结.md index 39096ff7..06752cac 100644 --- a/problems/双指针总结.md +++ b/problems/双指针总结.md @@ -89,7 +89,7 @@ for (int i = 0; i < array.size(); i++) { # 总结 -本文中一共介绍了leetcode上九道使用双指针解决问题的经典题目,除了链表一些题目一定要使用双指针,其他题目都是使用双指针来提高效率,一般是将$O(n^2)$的时间复杂度,降为$O(n)$。 +本文中一共介绍了leetcode上九道使用双指针解决问题的经典题目,除了链表一些题目一定要使用双指针,其他题目都是使用双指针来提高效率,一般是将O(n^2)的时间复杂度,降为$O(n)$。 建议大家可以把文中涉及到的题目在好好做一做,琢磨琢磨,基本对双指针法就不在话下了。 diff --git a/problems/周总结/20200927二叉树周末总结.md b/problems/周总结/20200927二叉树周末总结.md index 60f02205..ff8f67d4 100644 --- a/problems/周总结/20200927二叉树周末总结.md +++ b/problems/周总结/20200927二叉树周末总结.md @@ -44,7 +44,7 @@ a->right = NULL; 在介绍前中后序遍历的时候,有递归和迭代(非递归),还有一种牛逼的遍历方式:morris遍历。 -morris遍历是二叉树遍历算法的超强进阶算法,morris遍历可以将非递归遍历中的空间复杂度降为$O(1)$,感兴趣大家就去查一查学习学习,比较小众,面试几乎不会考。我其实也没有研究过,就不做过多介绍了。 +morris遍历是二叉树遍历算法的超强进阶算法,morris遍历可以将非递归遍历中的空间复杂度降为O(1),感兴趣大家就去查一查学习学习,比较小众,面试几乎不会考。我其实也没有研究过,就不做过多介绍了。 ## 周二 diff --git a/problems/周总结/20201126贪心周末总结.md b/problems/周总结/20201126贪心周末总结.md index 02fccc25..e310c0f8 100644 --- a/problems/周总结/20201126贪心周末总结.md +++ b/problems/周总结/20201126贪心周末总结.md @@ -41,7 +41,7 @@ 一些录友不清楚[贪心算法:分发饼干](https://programmercarl.com/0455.分发饼干.html)中时间复杂度是怎么来的? -就是快排$O(n\log n)$,遍历$O(n)$,加一起就是还是$O(n\log n)$。 +就是快排O(nlog n),遍历O(n),加一起就是还是O(nlogn)。 ## 周三 diff --git a/problems/周总结/20201210复杂度分析周末总结.md b/problems/周总结/20201210复杂度分析周末总结.md index 1b404bf0..5e5f696d 100644 --- a/problems/周总结/20201210复杂度分析周末总结.md +++ b/problems/周总结/20201210复杂度分析周末总结.md @@ -70,9 +70,9 @@ # 周三 -在[$O(n)$的算法居然超时了,此时的n究竟是多大?](https://programmercarl.com/前序/On的算法居然超时了,此时的n究竟是多大?.html)中介绍了大家在leetcode上提交代码经常遇到的一个问题-超时! +在[O(n)的算法居然超时了,此时的n究竟是多大?](https://programmercarl.com/前序/On的算法居然超时了,此时的n究竟是多大?.html)中介绍了大家在leetcode上提交代码经常遇到的一个问题-超时! -估计很多录友知道算法超时了,但没有注意过 $O(n)$的算法,如果1s内出结果,这个n究竟是多大? +估计很多录友知道算法超时了,但没有注意过 O(n)的算法,如果1s内出结果,这个n究竟是多大? 文中从计算机硬件出发,分析计算机的计算性能,然后亲自做实验,整理出数据如下: @@ -95,7 +95,7 @@ 文中给出了四个版本的代码实现,并逐一分析了其时间复杂度。 -此时大家就会发现,同一道题目,同样使用递归算法,有的同学会写出了$O(n)$的代码,有的同学就写出了$O(\log n)$的代码。 +此时大家就会发现,同一道题目,同样使用递归算法,有的同学会写出了O(n)的代码,有的同学就写出了$O(\log n)$的代码。 其本质是要对递归的时间复杂度有清晰的认识,才能运用递归来有效的解决问题! diff --git a/problems/周总结/20201217贪心周末总结.md b/problems/周总结/20201217贪心周末总结.md index e9d22d6e..4d12f92a 100644 --- a/problems/周总结/20201217贪心周末总结.md +++ b/problems/周总结/20201217贪心周末总结.md @@ -8,7 +8,7 @@ 在[贪心算法:加油站](https://programmercarl.com/0134.加油站.html)中给出每一个加油站的汽油和开到这个加油站的消耗,问汽车能不能开一圈。 -这道题目咋眼一看,感觉是一道模拟题,模拟一下汽车从每一个节点出发看看能不能开一圈,时间复杂度是$O(n^2)$。 +这道题目咋眼一看,感觉是一道模拟题,模拟一下汽车从每一个节点出发看看能不能开一圈,时间复杂度是O(n^2)。 即使用模拟这种情况,也挺考察代码技巧的。 diff --git a/problems/周总结/20210225动规周末总结.md b/problems/周总结/20210225动规周末总结.md index 0bf9dbdb..21cc53ad 100644 --- a/problems/周总结/20210225动规周末总结.md +++ b/problems/周总结/20210225动规周末总结.md @@ -211,8 +211,8 @@ public: }; ``` -* 时间复杂度:$O(n^2)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n^2) +* 空间复杂度:O(1) 贪心解法代码如下: @@ -233,8 +233,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n) +* 空间复杂度:O(1) 动规解法,版本一,代码如下: @@ -256,8 +256,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(n)$ +* 时间复杂度:O(n) +* 空间复杂度:O(n) 从递推公式可以看出,dp[i]只是依赖于dp[i - 1]的状态。 @@ -282,8 +282,8 @@ public: }; ``` -* 时间复杂度:$O(n)$ -* 空间复杂度:$O(1)$ +* 时间复杂度:O(n) +* 空间复杂度:O(1) 建议先写出版本一,然后在版本一的基础上优化成版本二,而不是直接就写出版本二。 diff --git a/problems/哈希表理论基础.md b/problems/哈希表理论基础.md index 40a8d0ca..3b6c5ce5 100644 --- a/problems/哈希表理论基础.md +++ b/problems/哈希表理论基础.md @@ -22,7 +22,7 @@ 例如要查询一个名字是否在这所学校里。 -要枚举的话时间复杂度是$O(n)$,但如果使用哈希表的话, 只需要$O(1)$就可以做到。 +要枚举的话时间复杂度是O(n),但如果使用哈希表的话, 只需要O(1)就可以做到。 我们只需要初始化把这所学校里学生的名字都存在哈希表里,在查询的时候通过索引直接就可以知道这位同学在不在这所学校里了。 @@ -88,17 +88,17 @@ |集合 |底层实现 | 是否有序 |数值是否可以重复 | 能否更改数值|查询效率 |增删效率| |---|---| --- |---| --- | --- | ---| -|std::set |红黑树 |有序 |否 |否 | $O(\log n)$|$O(\log n)$ | -|std::multiset | 红黑树|有序 |是 | 否| $O(\log n)$ |$O(\log n)$ | -|std::unordered_set |哈希表 |无序 |否 |否 |$O(1)$ | $O(1)$| +|std::set |红黑树 |有序 |否 |否 | O(log n)|O(log n) | +|std::multiset | 红黑树|有序 |是 | 否| O(logn) |O(logn) | +|std::unordered_set |哈希表 |无序 |否 |否 |O(1) | O(1)| std::unordered_set底层实现为哈希表,std::set 和std::multiset 的底层实现是红黑树,红黑树是一种平衡二叉搜索树,所以key值是有序的,但key不可以修改,改动key值会导致整棵树的错乱,所以只能删除和增加。 |映射 |底层实现 | 是否有序 |数值是否可以重复 | 能否更改数值|查询效率 |增删效率| |---|---| --- |---| --- | --- | ---| -|std::map |红黑树 |key有序 |key不可重复 |key不可修改 | $O(\log n)$|$O(\log n)$ | -|std::multimap | 红黑树|key有序 | key可重复 | key不可修改|$O(\log n)$ |$O(\log n)$ | -|std::unordered_map |哈希表 | key无序 |key不可重复 |key不可修改 |$O(1)$ | $O(1)$| +|std::map |红黑树 |key有序 |key不可重复 |key不可修改 | O(logn)|O(logn) | +|std::multimap | 红黑树|key有序 | key可重复 | key不可修改|O(log n) |O(log n) | +|std::unordered_map |哈希表 | key无序 |key不可重复 |key不可修改 |O(1) | O(1)| std::unordered_map 底层实现为哈希表,std::map 和std::multimap 的底层实现是红黑树。同理,std::map 和std::multimap 的key也是有序的(这个问题也经常作为面试题,考察对语言容器底层的理解)。 diff --git a/problems/回溯总结.md b/problems/回溯总结.md index 5b8e2276..54ac485b 100644 --- a/problems/回溯总结.md +++ b/problems/回溯总结.md @@ -302,7 +302,7 @@ if (startIndex >= nums.size()) { // 终止条件可以不加 **而使用used数组在时间复杂度上几乎没有额外负担!** -**使用set去重,不仅时间复杂度高了,空间复杂度也高了**,在[本周小结!(回溯算法系列三)](https://programmercarl.com/周总结/20201112回溯周末总结.html)中分析过,组合,子集,排列问题的空间复杂度都是O(n),但如果使用set去重,空间复杂度就变成了$O(n^2)$,因为每一层递归都有一个set集合,系统栈空间是n,每一个空间都有set集合。 +**使用set去重,不仅时间复杂度高了,空间复杂度也高了**,在[本周小结!(回溯算法系列三)](https://programmercarl.com/周总结/20201112回溯周末总结.html)中分析过,组合,子集,排列问题的空间复杂度都是O(n),但如果使用set去重,空间复杂度就变成了O(n^2),因为每一层递归都有一个set集合,系统栈空间是n,每一个空间都有set集合。 那有同学可能疑惑 用used数组也是占用O(n)的空间啊? diff --git a/problems/数组总结篇.md b/problems/数组总结篇.md index 242c1498..d256298b 100644 --- a/problems/数组总结篇.md +++ b/problems/数组总结篇.md @@ -102,7 +102,7 @@ 本题中,主要要理解滑动窗口如何移动 窗口起始位置,达到动态更新窗口大小的,从而得出长度最小的符合条件的长度。 -**滑动窗口的精妙之处在于根据当前子序列和大小的情况,不断调节子序列的起始位置。从而将$O(n^2)$的暴力解法降为$O(n)$。** +**滑动窗口的精妙之处在于根据当前子序列和大小的情况,不断调节子序列的起始位置。从而将O(n^2)的暴力解法降为O(n)。** 如果没有接触过这一类的方法,很难想到类似的解题思路,滑动窗口方法还是很巧妙的。 diff --git a/problems/根据身高重建队列(vector原理讲解).md b/problems/根据身高重建队列(vector原理讲解).md index 6c972b41..e229f397 100644 --- a/problems/根据身高重建队列(vector原理讲解).md +++ b/problems/根据身高重建队列(vector原理讲解).md @@ -151,7 +151,7 @@ public: 大家应该发现了,编程语言中一个普通容器的insert,delete的使用,都可能对写出来的算法的有很大影响! -如果抛开语言谈算法,除非从来不用代码写算法纯分析,**否则的话,语言功底不到位O(n)的算法可以写出$O(n^2)$的性能**,哈哈。 +如果抛开语言谈算法,除非从来不用代码写算法纯分析,**否则的话,语言功底不到位O(n)的算法可以写出O(n^2)的性能**,哈哈。 相信在这里学习算法的录友们,都是想在软件行业长远发展的,都是要从事编程的工作,那么一定要深耕好一门编程语言,这个非常重要! diff --git a/problems/贪心算法总结篇.md b/problems/贪心算法总结篇.md index 1db9b4dc..6539501f 100644 --- a/problems/贪心算法总结篇.md +++ b/problems/贪心算法总结篇.md @@ -127,9 +127,9 @@ Carl个人认为:如果找出局部最优并可以推出全局最优,就是 贪心专题汇聚为一张图: -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211110121605.png) +![](https://code-thinking-1253855093.file.myqcloud.com/pics/贪心总结water.png) -这个图是 [代码随想录知识星球](https://programmercarl.com/other/kstar.html) 成员:[青](https://wx.zsxq.com/dweb2/index/footprint/185251215558842)所画,总结的非常好,分享给大家。 +这个图是 [代码随想录知识星球](https://programmercarl.com/other/kstar.html) 成员:[海螺人](https://wx.zsxq.com/dweb2/index/footprint/844412858822412)所画,总结的非常好,分享给大家。 很多没有接触过贪心的同学都会感觉贪心有啥可学的,但只要跟着「代码随想录」坚持下来之后,就会发现,贪心是一种很重要的算法思维而且并不简单,贪心往往妙的出其不意,触不及防! @@ -145,18 +145,6 @@ Carl个人认为:如果找出局部最优并可以推出全局最优,就是 **一个系列的结束,又是一个新系列的开始,我们将在明年第一个工作日正式开始动态规划,来不及解释了,录友们上车别掉队,我们又要开始新的征程!** -## 其他语言版本 - - -Java: - - -Python: - - -Go: - - ----------------------- From 1b935259a6c83beab9f730059da4bec509bb1f61 Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Tue, 12 Apr 2022 21:01:23 +0100 Subject: [PATCH 278/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200122.=E4=B9=B0?= =?UTF-8?q?=E8=82=A1=E7=A5=A8=E7=9A=84=E6=9C=80=E4=BD=B3=E6=97=B6=E6=9C=BA?= =?UTF-8?q?II.md=20C=E8=AF=AD=E8=A8=80=E5=8A=A8=E6=80=81=E8=A7=84=E5=88=92?= =?UTF-8?q?=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0122.买卖股票的最佳时机II.md | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/problems/0122.买卖股票的最佳时机II.md b/problems/0122.买卖股票的最佳时机II.md index 83b852c6..1b84f728 100644 --- a/problems/0122.买卖股票的最佳时机II.md +++ b/problems/0122.买卖股票的最佳时机II.md @@ -269,7 +269,7 @@ const maxProfit = (prices) => { ``` C: - +贪心: ```c int maxProfit(int* prices, int pricesSize){ int result = 0; @@ -284,5 +284,27 @@ int maxProfit(int* prices, int pricesSize){ } ``` +动态规划: +```c +#define max(a, b) (((a) > (b)) ? (a) : (b)) + +int maxProfit(int* prices, int pricesSize){ + int dp[pricesSize][2]; + dp[0][0] = 0 - prices[0]; + dp[0][1] = 0; + + int i; + for(i = 1; i < pricesSize; ++i) { + // dp[i][0]为i-1天持股的钱数/在第i天用i-1天的钱买入的最大值。 + // 若i-1天持股,且第i天买入股票比i-1天持股时更亏,说明应在i-1天时持股 + dp[i][0] = max(dp[i-1][0], dp[i-1][1] - prices[i]); + //dp[i][1]为i-1天不持股钱数/在第i天卖出所持股票dp[i-1][0] + prices[i]的最大值 + dp[i][1] = max(dp[i-1][1], dp[i-1][0] + prices[i]); + } + // 返回在最后一天不持股时的钱数(将股票卖出后钱最大化) + return dp[pricesSize - 1][1]; +} +``` + -----------------------
From 0fc1cb334d4f8612e95eabfc9e97fe8d273dc25e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E4=BB=A4=E4=BB=A4?= Date: Wed, 13 Apr 2022 15:51:42 +0800 Subject: [PATCH 279/328] =?UTF-8?q?Update=200459.=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E7=9A=84=E5=AD=90=E5=AD=97=E7=AC=A6=E4=B8=B2.md=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0swift=E6=96=B9=E6=B3=95(=E5=89=8D=E7=BC=80=E8=A1=A8?= =?UTF-8?q?=E7=BB=9F=E4=B8=80=E4=B8=8D=E5=87=8F=E4=B8=80)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0459.重复的子字符串.md | 40 +++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/problems/0459.重复的子字符串.md b/problems/0459.重复的子字符串.md index 6a9b4260..f2fe728d 100644 --- a/problems/0459.重复的子字符串.md +++ b/problems/0459.重复的子字符串.md @@ -463,6 +463,46 @@ Swift: } } ``` +> 前缀表统一不减一 +```swift + func repeatedSubstringPattern(_ s: String) -> Bool { + + let sArr = Array(s) + let len = sArr.count + if len == 0 { + return false + } + + var next = Array.init(repeating: 0, count: len) + getNext(&next, sArr) + + if next[len-1] != 0 && len % (len - next[len-1]) == 0 { + return true + } + + return false + } + + // 前缀表不减一 + func getNext(_ next: inout [Int], _ sArr:[Character]) { + + var j = 0 + next[0] = 0 + + for i in 1 ..< sArr.count { + while j > 0 && sArr[i] != sArr[j] { + j = next[j-1] + } + + if sArr[i] == sArr[j] { + j += 1 + } + + next[i] = j + } + } + +``` -----------------------
From cfb8ab8b936418f6b446bad655be491f9159be14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E4=BB=A4=E4=BB=A4?= Date: Wed, 13 Apr 2022 16:01:26 +0800 Subject: [PATCH 280/328] Revert "Merge branch 'youngyangyang04:master' into master" This reverts commit 33be177e63bc622c4e1e67d9e268bc13d4d5ba54, reversing changes made to 559f03c92869ca55ae929d66de872f5ddda70567. --- problems/0332.重新安排行程.md | 58 ----------------------------------- 1 file changed, 58 deletions(-) diff --git a/problems/0332.重新安排行程.md b/problems/0332.重新安排行程.md index 041a7f03..01f81c4d 100644 --- a/problems/0332.重新安排行程.md +++ b/problems/0332.重新安排行程.md @@ -342,64 +342,6 @@ class Solution: return path ``` -### Go -```go -type pair struct { - target string - visited bool -} -type pairs []*pair - -func (p pairs) Len() int { - return len(p) -} -func (p pairs) Swap(i, j int) { - p[i], p[j] = p[j], p[i] -} -func (p pairs) Less(i, j int) bool { - return p[i].target < p[j].target -} - -func findItinerary(tickets [][]string) []string { - result := []string{} - // map[出发机场] pair{目的地,是否被访问过} - targets := make(map[string]pairs) - for _, ticket := range tickets { - if targets[ticket[0]] == nil { - targets[ticket[0]] = make(pairs, 0) - } - targets[ticket[0]] = append(targets[ticket[0]], &pair{target: ticket[1], visited: false}) - } - for k, _ := range targets { - sort.Sort(targets[k]) - } - result = append(result, "JFK") - var backtracking func() bool - backtracking = func() bool { - if len(tickets)+1 == len(result) { - return true - } - // 取出起飞航班对应的目的地 - for _, pair := range targets[result[len(result)-1]] { - if pair.visited == false { - result = append(result, pair.target) - pair.visited = true - if backtracking() { - return true - } - result = result[:len(result)-1] - pair.visited = false - } - } - return false - } - - backtracking() - - return result -} -``` - ### C语言 ```C From efe987be6b6a9cdc908d836e86954aab22227da7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E4=BB=A4=E4=BB=A4?= Date: Wed, 13 Apr 2022 16:07:23 +0800 Subject: [PATCH 281/328] =?UTF-8?q?Revert=20"Update=200459.=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E7=9A=84=E5=AD=90=E5=AD=97=E7=AC=A6=E4=B8=B2.md=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0swift=E6=96=B9=E6=B3=95(=E5=89=8D=E7=BC=80?= =?UTF-8?q?=E8=A1=A8=E7=BB=9F=E4=B8=80=E4=B8=8D=E5=87=8F=E4=B8=80)"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 0fc1cb334d4f8612e95eabfc9e97fe8d273dc25e. --- problems/0459.重复的子字符串.md | 40 --------------------------------- 1 file changed, 40 deletions(-) diff --git a/problems/0459.重复的子字符串.md b/problems/0459.重复的子字符串.md index f2fe728d..6a9b4260 100644 --- a/problems/0459.重复的子字符串.md +++ b/problems/0459.重复的子字符串.md @@ -463,46 +463,6 @@ Swift: } } ``` -> 前缀表统一不减一 -```swift - func repeatedSubstringPattern(_ s: String) -> Bool { - - let sArr = Array(s) - let len = sArr.count - if len == 0 { - return false - } - - var next = Array.init(repeating: 0, count: len) - getNext(&next, sArr) - - if next[len-1] != 0 && len % (len - next[len-1]) == 0 { - return true - } - - return false - } - - // 前缀表不减一 - func getNext(_ next: inout [Int], _ sArr:[Character]) { - - var j = 0 - next[0] = 0 - - for i in 1 ..< sArr.count { - while j > 0 && sArr[i] != sArr[j] { - j = next[j-1] - } - - if sArr[i] == sArr[j] { - j += 1 - } - - next[i] = j - } - } - -``` -----------------------
From a391c2c949c393141e7aed3d1e8cdbf6b6a0b956 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E4=BB=A4=E4=BB=A4?= Date: Wed, 13 Apr 2022 16:10:50 +0800 Subject: [PATCH 282/328] =?UTF-8?q?Update=200459.=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E7=9A=84=E5=AD=90=E5=AD=97=E7=AC=A6=E4=B8=B2.md=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0swift=E6=96=B9=E6=B3=95(=E5=89=8D=E7=BC=80=E8=A1=A8?= =?UTF-8?q?=E7=BB=9F=E4=B8=80=E4=B8=8D=E5=87=8F=E4=B8=80)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0459.重复的子字符串.md | 41 +++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/problems/0459.重复的子字符串.md b/problems/0459.重复的子字符串.md index 6a9b4260..a51c68ee 100644 --- a/problems/0459.重复的子字符串.md +++ b/problems/0459.重复的子字符串.md @@ -464,5 +464,46 @@ Swift: } ``` +> 前缀表统一不减一 +```swift + func repeatedSubstringPattern(_ s: String) -> Bool { + + let sArr = Array(s) + let len = sArr.count + if len == 0 { + return false + } + + var next = Array.init(repeating: 0, count: len) + getNext(&next, sArr) + + if next[len-1] != 0 && len % (len - next[len-1]) == 0 { + return true + } + + return false + } + + // 前缀表不减一 + func getNext(_ next: inout [Int], _ sArr:[Character]) { + + var j = 0 + next[0] = 0 + + for i in 1 ..< sArr.count { + + while j > 0 && sArr[i] != sArr[j] { + j = next[j-1] + } + + if sArr[i] == sArr[j] { + j += 1 + } + + next[i] = j + } + } +``` + -----------------------
From e1abedc13ad4d5f744ecc27fa9931aa24508364b Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Wed, 13 Apr 2022 09:41:50 +0100 Subject: [PATCH 283/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200055.=E8=B7=B3?= =?UTF-8?q?=E8=B7=83=E6=B8=B8=E6=88=8F.md=20C=E8=AF=AD=E8=A8=80=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0055.跳跃游戏.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/problems/0055.跳跃游戏.md b/problems/0055.跳跃游戏.md index c0890f75..4ba0c03b 100644 --- a/problems/0055.跳跃游戏.md +++ b/problems/0055.跳跃游戏.md @@ -154,6 +154,28 @@ var canJump = function(nums) { }; ``` +### C +```c +#define max(a, b) (((a) > (b)) ? (a) : (b)) + +bool canJump(int* nums, int numsSize){ + int cover = 0; + + int i; + // 只可能获取cover范围中的步数,所以i<=cover + for(i = 0; i <= cover; ++i) { + // 更新cover为从i出发能到达的最大值/cover的值中较大值 + cover = max(i + nums[i], cover); + + // 若更新后cover可以到达最后的元素,返回true + if(cover >= numsSize - 1) + return true; + } + + return false; +} +``` + -----------------------
From b73a7da7585b03b42ab51515f5463259ac2e0631 Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Fri, 15 Apr 2022 18:25:41 +0100 Subject: [PATCH 284/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=201005.K=E6=AC=A1?= =?UTF-8?q?=E5=8F=96=E5=8F=8D=E5=90=8E=E6=9C=80=E5=A4=A7=E5=8C=96=E7=9A=84?= =?UTF-8?q?=E6=95=B0=E7=BB=84=E5=92=8C.md=20C=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/1005.K次取反后最大化的数组和.md | 39 ++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/problems/1005.K次取反后最大化的数组和.md b/problems/1005.K次取反后最大化的数组和.md index 45f186e2..0d122d91 100644 --- a/problems/1005.K次取反后最大化的数组和.md +++ b/problems/1005.K次取反后最大化的数组和.md @@ -211,5 +211,44 @@ var largestSumAfterKNegations = function(nums, k) { }; ``` +### C +```c +#define abs(a) (((a) > 0) ? (a) : (-(a))) + +// 对数组求和 +int sum(int *nums, int numsSize) { + int sum = 0; + + int i; + for(i = 0; i < numsSize; ++i) { + sum += nums[i]; + } + return sum; +} + +int cmp(const void* v1, const void* v2) { + return abs(*(int*)v2) - abs(*(int*)v1); +} + +int largestSumAfterKNegations(int* nums, int numsSize, int k){ + qsort(nums, numsSize, sizeof(int), cmp); + + int i; + for(i = 0; i < numsSize; ++i) { + // 遍历数组,若当前元素<0则将当前元素转变,k-- + if(nums[i] < 0 && k > 0) { + nums[i] *= -1; + --k; + } + } + + // 若遍历完数组后k还有剩余(此时所有元素应均为正),则将绝对值最小的元素nums[numsSize - 1]变为负 + if(k % 2 == 1) + nums[numsSize - 1] *= -1; + + return sum(nums, numsSize); +} +``` + -----------------------
From 7c26aba0e1d9ba38a631eb5dbae8577890deb2d2 Mon Sep 17 00:00:00 2001 From: Falldio <1031249495@qq.com> Date: Sun, 17 Apr 2022 11:59:30 +0800 Subject: [PATCH 285/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880209.?= =?UTF-8?q?=E9=95=BF=E5=BA=A6=E6=9C=80=E5=B0=8F=E7=9A=84=E5=AD=90=E6=95=B0?= =?UTF-8?q?=E7=BB=84.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0Kotlin=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0209.长度最小的子数组.md | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/problems/0209.长度最小的子数组.md b/problems/0209.长度最小的子数组.md index 82a11381..fd72cf1b 100644 --- a/problems/0209.长度最小的子数组.md +++ b/problems/0209.长度最小的子数组.md @@ -198,7 +198,7 @@ JavaScript: var minSubArrayLen = function(target, nums) { // 长度计算一次 const len = nums.length; - let l = r = sum = 0, + let l = r = sum = 0, res = len + 1; // 子数组最大不会超过自身 while(r < len) { sum += nums[r++]; @@ -260,12 +260,12 @@ Rust: ```rust impl Solution { - pub fn min_sub_array_len(target: i32, nums: Vec) -> i32 { + pub fn min_sub_array_len(target: i32, nums: Vec) -> i32 { let (mut result, mut subLength): (i32, i32) = (i32::MAX, 0); let (mut sum, mut i) = (0, 0); - + for (pos, val) in nums.iter().enumerate() { - sum += val; + sum += val; while sum >= target { subLength = (pos - i + 1) as i32; if result > subLength { @@ -364,7 +364,7 @@ int minSubArrayLen(int target, int* nums, int numsSize){ int minLength = INT_MAX; int sum = 0; - int left = 0, right = 0; + int left = 0, right = 0; //右边界向右扩展 for(; right < numsSize; ++right) { sum += nums[right]; @@ -380,5 +380,26 @@ int minSubArrayLen(int target, int* nums, int numsSize){ } ``` +Kotlin: +```kotlin +class Solution { + fun minSubArrayLen(target: Int, nums: IntArray): Int { + var start = 0 + var end = 0 + var ret = Int.MAX_VALUE + var count = 0 + while (end < nums.size) { + count += nums[end] + while (count >= target) { + ret = if (ret > (end - start + 1)) end - start + 1 else ret + count -= nums[start++] + } + end++ + } + return if (ret == Int.MAX_VALUE) 0 else ret + } +} +``` + -----------------------
From 0375a5b147c40a449c04ef7f988dfcb2d93b9e01 Mon Sep 17 00:00:00 2001 From: Guacker <92098421+Guacker@users.noreply.github.com> Date: Sun, 17 Apr 2022 17:19:00 +0800 Subject: [PATCH 286/328] =?UTF-8?q?Update=20=E4=BA=8C=E5=8F=89=E6=A0=91?= =?UTF-8?q?=E7=9A=84=E9=80=92=E5=BD=92=E9=81=8D=E5=8E=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改了c语言实现的先序遍历函数名 和内部调用时用的函数名 及在preorderTraversal中的调用先序遍历操作的函数名 --- problems/二叉树的递归遍历.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/problems/二叉树的递归遍历.md b/problems/二叉树的递归遍历.md index 35d19d7b..612f2394 100644 --- a/problems/二叉树的递归遍历.md +++ b/problems/二叉树的递归遍历.md @@ -371,18 +371,18 @@ C: ```c //前序遍历: -void preOrderTraversal(struct TreeNode* root, int* ret, int* returnSize) { +void preOrder(struct TreeNode* root, int* ret, int* returnSize) { if(root == NULL) return; ret[(*returnSize)++] = root->val; - preOrderTraverse(root->left, ret, returnSize); - preOrderTraverse(root->right, ret, returnSize); + preOrder(root->left, ret, returnSize); + preOrder(root->right, ret, returnSize); } int* preorderTraversal(struct TreeNode* root, int* returnSize){ int* ret = (int*)malloc(sizeof(int) * 100); *returnSize = 0; - preOrderTraversal(root, ret, returnSize); + preOrder(root, ret, returnSize); return ret; } From db84840986aab5ce791230eba963084bf1d5ba4b Mon Sep 17 00:00:00 2001 From: GitHubQAQ <31883473+GitHubQAQ@users.noreply.github.com> Date: Tue, 19 Apr 2022 14:23:08 +0800 Subject: [PATCH 287/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=A2=84=E5=88=A4?= =?UTF-8?q?=E6=96=AD=E9=95=BF=E5=BA=A6=E7=9A=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在magazine中字符存入数组前,预先判断ransomNote和magazine的相对长度,进行处理。 --- problems/0383.赎金信.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/problems/0383.赎金信.md b/problems/0383.赎金信.md index 00707347..5d9e8295 100644 --- a/problems/0383.赎金信.md +++ b/problems/0383.赎金信.md @@ -84,6 +84,10 @@ class Solution { public: bool canConstruct(string ransomNote, string magazine) { int record[26] = {0}; + //add + if (ransomNote.size() > magazine.size()) { + return false; + } for (int i = 0; i < magazine.length(); i++) { // 通过recode数据记录 magazine里各个字符出现次数 record[magazine[i]-'a'] ++; From 68e47dc4b30ffe38d1a26bb5104614f2f1cc067a Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Tue, 19 Apr 2022 17:10:20 +0800 Subject: [PATCH 288/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880452.?= =?UTF-8?q?=E7=94=A8=E6=9C=80=E5=B0=91=E6=95=B0=E9=87=8F=E7=9A=84=E7=AE=AD?= =?UTF-8?q?=E5=BC=95=E7=88=86=E6=B0=94=E7=90=83.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0452.用最少数量的箭引爆气球.md | 26 ++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/problems/0452.用最少数量的箭引爆气球.md b/problems/0452.用最少数量的箭引爆气球.md index 33bbad55..2ab14b61 100644 --- a/problems/0452.用最少数量的箭引爆气球.md +++ b/problems/0452.用最少数量的箭引爆气球.md @@ -193,7 +193,7 @@ func min(a,b int) int{ } return a } -``` +``` ### Javascript ```Javascript @@ -214,7 +214,31 @@ var findMinArrowShots = function(points) { }; ``` +### TypeScript + +```typescript +function findMinArrowShots(points: number[][]): number { + const length: number = points.length; + if (length === 0) return 0; + points.sort((a, b) => a[0] - b[0]); + let resCount: number = 1; + let right: number = points[0][1]; // 右边界 + let tempPoint: number[]; + for (let i = 1; i < length; i++) { + tempPoint = points[i]; + if (tempPoint[0] > right) { + resCount++; + right = tempPoint[1]; + } else { + right = Math.min(right, tempPoint[1]); + } + } + return resCount; +}; +``` + ### C + ```c int cmp(const void *a,const void *b) { From 84f41f6685e744b138890cf7143ed3069a02a78e Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Tue, 19 Apr 2022 17:00:17 +0100 Subject: [PATCH 289/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200135.=E5=88=86?= =?UTF-8?q?=E5=8F=91=E7=B3=96=E6=9E=9C.md=20C=E8=AF=AD=E8=A8=80=E8=A7=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0135.分发糖果.md | 41 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/problems/0135.分发糖果.md b/problems/0135.分发糖果.md index ccdabc16..27071aee 100644 --- a/problems/0135.分发糖果.md +++ b/problems/0135.分发糖果.md @@ -238,6 +238,47 @@ var candy = function(ratings) { }; ``` +### C +```c +#define max(a, b) (((a) > (b)) ? (a) : (b)) + +int *initCandyArr(int size) { + int *candyArr = (int*)malloc(sizeof(int) * size); + + int i; + for(i = 0; i < size; ++i) + candyArr[i] = 1; + + return candyArr; +} + +int candy(int* ratings, int ratingsSize){ + // 初始化数组,每个小孩开始至少有一颗糖 + int *candyArr = initCandyArr(ratingsSize); + + int i; + // 先判断右边是否比左边评分高。若是,右边孩子的糖果为左边孩子+1(candyArr[i] = candyArr[i - 1] + 1) + for(i = 1; i < ratingsSize; ++i) { + if(ratings[i] > ratings[i - 1]) + candyArr[i] = candyArr[i - 1] + 1; + } + + // 再判断左边评分是否比右边高。 + // 若是,左边孩子糖果为右边孩子糖果+1/自己所持糖果最大值。(若糖果已经比右孩子+1多,则不需要更多糖果) + // 举例:ratings为[1, 2, 3, 1]。此时评分为3的孩子在判断右边比左边大后为3,虽然它比最末尾的1(ratings[3])大,但是candyArr[3]为1。所以不必更新candyArr[2] + for(i = ratingsSize - 2; i >= 0; --i) { + if(ratings[i] > ratings[i + 1]) + candyArr[i] = max(candyArr[i], candyArr[i + 1] + 1); + } + + // 求出糖果之和 + int result = 0; + for(i = 0; i < ratingsSize; ++i) { + result += candyArr[i]; + } + return result; +} +``` -----------------------
From f9146a3b98fd46ca548c8852bf3b7df0625cfe72 Mon Sep 17 00:00:00 2001 From: zhenghao <1650937065@qq.com> Date: Wed, 20 Apr 2022 10:23:18 +0800 Subject: [PATCH 290/328] =?UTF-8?q?=E6=9B=B4=E6=96=B00435=20=E6=97=A0?= =?UTF-8?q?=E9=87=8D=E5=8F=A0=E5=8C=BA=E9=97=B4=20java=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8F=B3=E8=BE=B9=E7=95=8C=E8=A7=A3=E6=B3=95=E4=B8=AD=E6=8E=92?= =?UTF-8?q?=E5=BA=8F=E7=9A=84=E5=88=A4=E6=96=AD=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0435.无重叠区间.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/problems/0435.无重叠区间.md b/problems/0435.无重叠区间.md index b24ca024..cf58b9e2 100644 --- a/problems/0435.无重叠区间.md +++ b/problems/0435.无重叠区间.md @@ -184,13 +184,14 @@ public: class Solution { public int eraseOverlapIntervals(int[][] intervals) { Arrays.sort(intervals, (a, b) -> { - if (a[0] == a[0]) return a[1] - b[1]; - return a[0] - b[0]; + // 按照区间右边界升序排序 + return a[1] - b[1]; }); int count = 0; int edge = Integer.MIN_VALUE; for (int i = 0; i < intervals.length; i++) { + // 若上一个区间的右边界小于当前区间的左边界,说明无交集 if (edge <= intervals[i][0]) { edge = intervals[i][1]; } else { From b5f11af3edc66af674d486ace76cde8a99637170 Mon Sep 17 00:00:00 2001 From: zhenyu <48195906+szluyu99@users.noreply.github.com> Date: Wed, 20 Apr 2022 23:56:20 +0800 Subject: [PATCH 291/328] =?UTF-8?q?Update=20=E8=83=8C=E5=8C=85=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80=E5=AE=8C=E5=85=A8?= =?UTF-8?q?=E8=83=8C=E5=8C=85.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/背包问题理论基础完全背包.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/背包问题理论基础完全背包.md b/problems/背包问题理论基础完全背包.md index faa1dc46..3ec399f1 100644 --- a/problems/背包问题理论基础完全背包.md +++ b/problems/背包问题理论基础完全背包.md @@ -37,7 +37,7 @@ * [动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html) 首先在回顾一下01背包的核心代码 -``` +```cpp for(int i = 0; i < weight.size(); i++) { // 遍历物品 for(int j = bagWeight; j >= weight[i]; j--) { // 遍历背包容量 dp[j] = max(dp[j], dp[j - weight[i]] + value[i]); From 4154d3db2eadecdddaba45d09f09bfe16c0cc594 Mon Sep 17 00:00:00 2001 From: 243wresfdxvc Date: Thu, 21 Apr 2022 09:55:19 +0000 Subject: [PATCH 292/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200134.=20=E5=8A=A0?= =?UTF-8?q?=E6=B2=B9=E7=AB=99.md=20C=E8=AF=AD=E8=A8=80=E8=B4=AA=E5=BF=83?= =?UTF-8?q?=E8=A7=A3=E6=B3=95=E6=96=B9=E6=B3=95=E4=BA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0134.加油站.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/problems/0134.加油站.md b/problems/0134.加油站.md index ca95af67..45e05fed 100644 --- a/problems/0134.加油站.md +++ b/problems/0134.加油站.md @@ -341,6 +341,7 @@ var canCompleteCircuit = function(gas, cost) { ``` ### C +贪心算法:方法一 ```c int canCompleteCircuit(int* gas, int gasSize, int* cost, int costSize){ int curSum = 0; @@ -370,5 +371,36 @@ int canCompleteCircuit(int* gas, int gasSize, int* cost, int costSize){ } ``` +贪心算法:方法二 +```c +int canCompleteCircuit(int* gas, int gasSize, int* cost, int costSize){ + int curSum = 0; + int totalSum = 0; + int start = 0; + + int i; + for(i = 0; i < gasSize; ++i) { + // 当前i站中加油量与耗油量的差 + int diff = gas[i] - cost[i]; + + curSum += diff; + totalSum += diff; + + // 若0到i的加油量都为负,则开始位置应为i+1 + if(curSum < 0) { + curSum = 0; + // 当i + 1 == gasSize时,totalSum < 0(此时i为gasSize - 1),油车不可能返回原点 + start = i + 1; + } + } + + // 若总和小于0,加油车无论如何都无法返回原点。返回-1 + if(totalSum < 0) + return -1; + + return start; +} +``` + -----------------------
From be07599474b87bf7dba3e97107b19435a304e5e7 Mon Sep 17 00:00:00 2001 From: berserk-112 <40333359+berserk-112@users.noreply.github.com> Date: Fri, 22 Apr 2022 09:16:34 +0800 Subject: [PATCH 293/328] =?UTF-8?q?Update=200309.=E6=9C=80=E4=BD=B3?= =?UTF-8?q?=E4=B9=B0=E5=8D=96=E8=82=A1=E7=A5=A8=E6=97=B6=E6=9C=BA=E5=90=AB?= =?UTF-8?q?=E5=86=B7=E5=86=BB=E6=9C=9F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0309.最佳买卖股票时机含冷冻期.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/problems/0309.最佳买卖股票时机含冷冻期.md b/problems/0309.最佳买卖股票时机含冷冻期.md index 53caa46e..8bd2fcf8 100644 --- a/problems/0309.最佳买卖股票时机含冷冻期.md +++ b/problems/0309.最佳买卖股票时机含冷冻期.md @@ -214,8 +214,8 @@ class Solution { for (int i = 2; i <= prices.length; i++) { /* - dp[i][0] 第i天未持有股票收益; - dp[i][1] 第i天持有股票收益; + dp[i][0] 第i天持有股票收益; + dp[i][1] 第i天不持有股票收益; 情况一:第i天是冷静期,不能以dp[i-1][1]购买股票,所以以dp[i - 2][1]买股票,没问题 情况二:第i天不是冷静期,理论上应该以dp[i-1][1]购买股票,但是第i天不是冷静期说明,第i-1天没有卖出股票, 则dp[i-1][1]=dp[i-2][1],所以可以用dp[i-2][1]买股票,没问题 From c3f746a25d81c299ca8a3efa4fc1f9e8d45509d3 Mon Sep 17 00:00:00 2001 From: qyg <1600314850@qq.com> Date: Fri, 22 Apr 2022 10:55:01 +0800 Subject: [PATCH 294/328] =?UTF-8?q?0209.=E9=95=BF=E5=BA=A6=E6=9C=80?= =?UTF-8?q?=E5=B0=8F=E7=9A=84=E5=AD=90=E6=95=B0=E7=BB=84=EF=BC=9A=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E7=AC=94=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0209.长度最小的子数组.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/0209.长度最小的子数组.md b/problems/0209.长度最小的子数组.md index 82a11381..23b27edd 100644 --- a/problems/0209.长度最小的子数组.md +++ b/problems/0209.长度最小的子数组.md @@ -112,7 +112,7 @@ public: **一些录友会疑惑为什么时间复杂度是O(n)**。 -不要以为for里放一个while就以为是O(n^2)啊, 主要是看每一个元素被操作的次数,每个元素在滑动窗后进来操作一次,出去操作一次,每个元素都是被被操作两次,所以时间复杂度是 2 × n 也就是O(n)。 +不要以为for里放一个while就以为是O(n^2)啊, 主要是看每一个元素被操作的次数,每个元素在滑动窗后进来操作一次,出去操作一次,每个元素都是被操作两次,所以时间复杂度是 2 × n 也就是O(n)。 ## 相关题目推荐 From 4d668b0efc89cd15f50dcb93da01e1ace633b07b Mon Sep 17 00:00:00 2001 From: qyg <1600314850@qq.com> Date: Fri, 22 Apr 2022 11:02:11 +0800 Subject: [PATCH 295/328] =?UTF-8?q?0059.=E8=9E=BA=E6=97=8B=E7=9F=A9?= =?UTF-8?q?=E9=98=B5II=EF=BC=9A=E8=B0=83=E6=95=B4=E7=AC=94=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0059.螺旋矩阵II.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/problems/0059.螺旋矩阵II.md b/problems/0059.螺旋矩阵II.md index 5c679982..1162c7eb 100644 --- a/problems/0059.螺旋矩阵II.md +++ b/problems/0059.螺旋矩阵II.md @@ -30,7 +30,7 @@ 相信很多同学刚开始做这种题目的时候,上来就是一波判断猛如虎。 -结果运行的时候各种问题,然后开始各种修修补补,最后发现改了这里哪里有问题,改了那里这里又跑不起来了。 +结果运行的时候各种问题,然后开始各种修修补补,最后发现改了这里那里有问题,改了那里这里又跑不起来了。 大家还记得我们在这篇文章[数组:每次遇到二分法,都是一看就会,一写就废](https://programmercarl.com/0704.二分查找.html)中讲解了二分法,提到如果要写出正确的二分法一定要坚持**循环不变量原则**。 @@ -47,7 +47,7 @@ 可以发现这里的边界条件非常多,在一个循环中,如此多的边界条件,如果不按照固定规则来遍历,那就是**一进循环深似海,从此offer是路人**。 -这里一圈下来,我们要画每四条边,这四条边怎么画,每画一条边都要坚持一致的左闭右开,或者左开又闭的原则,这样这一圈才能按照统一的规则画下来。 +这里一圈下来,我们要画每四条边,这四条边怎么画,每画一条边都要坚持一致的左闭右开,或者左开右闭的原则,这样这一圈才能按照统一的规则画下来。 那么我按照左闭右开的原则,来画一圈,大家看一下: @@ -59,7 +59,7 @@ 一些同学做这道题目之所以一直写不好,代码越写越乱。 -就是因为在画每一条边的时候,一会左开又闭,一会左闭右闭,一会又来左闭右开,岂能不乱。 +就是因为在画每一条边的时候,一会左开右闭,一会左闭右闭,一会又来左闭右开,岂能不乱。 代码如下,已经详细注释了每一步的目的,可以看出while循环里判断的情况是很多的,代码里处理的原则也是统一的左闭右开。 From 664746fe155a137f01c5d1478b0325c2dd8e0ffe Mon Sep 17 00:00:00 2001 From: qyg <1600314850@qq.com> Date: Fri, 22 Apr 2022 11:21:18 +0800 Subject: [PATCH 296/328] =?UTF-8?q?=E6=95=B0=E7=BB=84=E6=80=BB=E7=BB=93?= =?UTF-8?q?=E7=AF=87=EF=BC=9A=E8=B0=83=E6=95=B4=E7=AC=94=E8=AF=AF=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=8C=E7=BB=B4=E6=95=B0=E7=BB=84=E7=9A=84?= =?UTF-8?q?=E5=86=85=E5=AE=B9=E6=98=AF=E9=92=88=E5=AF=B9Java=E8=AF=AD?= =?UTF-8?q?=E8=A8=80=E7=9A=84=E9=99=90=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/数组总结篇.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/problems/数组总结篇.md b/problems/数组总结篇.md index d256298b..39fa17a6 100644 --- a/problems/数组总结篇.md +++ b/problems/数组总结篇.md @@ -43,19 +43,19 @@ **那么二维数组在内存的空间地址是连续的么?** -我们来举一个例子,例如: `int[][] rating = new int[3][4];` , 这个二维数据在内存空间可不是一个 `3*4` 的连续地址空间 +我们来举一个Java的例子,例如: `int[][] rating = new int[3][4];` , 这个二维数组在内存空间可不是一个 `3*4` 的连续地址空间 看了下图,就应该明白了: -所以**二维数据在内存中不是 `3*4` 的连续地址空间,而是四条连续的地址空间组成!** +所以**Java的二维数组在内存中不是 `3*4` 的连续地址空间,而是四条连续的地址空间组成!** # 数组的经典题目 在面试中,数组是必考的基础数据结构。 -其实数据的题目在思想上一般比较简单的,但是如果想高效,并不容易。 +其实数组的题目在思想上一般比较简单的,但是如果想高效,并不容易。 我们之前一共讲解了四道经典数组题目,每一道题目都代表一个类型,一种思想。 @@ -115,7 +115,7 @@ 在这道题目中,我们再一次介绍到了**循环不变量原则**,其实这也是写程序中的重要原则。 -相信大家又遇到过这种情况: 感觉题目的边界调节超多,一波接着一波的判断,找边界,踩了东墙补西墙,好不容易运行通过了,代码写的十分冗余,毫无章法,其实**真正解决题目的代码都是简洁的,或者有原则性的**,大家可以在这道题目中体会到这一点。 +相信大家有遇到过这种情况: 感觉题目的边界调节超多,一波接着一波的判断,找边界,拆了东墙补西墙,好不容易运行通过了,代码写的十分冗余,毫无章法,其实**真正解决题目的代码都是简洁的,或者有原则性的**,大家可以在这道题目中体会到这一点。 # 总结 From 074937378aad536271afd42fdb5cc27a1f193f7f Mon Sep 17 00:00:00 2001 From: qyg <1600314850@qq.com> Date: Fri, 22 Apr 2022 11:42:50 +0800 Subject: [PATCH 297/328] =?UTF-8?q?=E9=93=BE=E8=A1=A8=E7=90=86=E8=AE=BA?= =?UTF-8?q?=E5=9F=BA=E7=A1=80=EF=BC=9A=E8=B0=83=E6=95=B4=E7=AC=94=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/链表理论基础.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/problems/链表理论基础.md b/problems/链表理论基础.md index 095282f5..2fe9f14c 100644 --- a/problems/链表理论基础.md +++ b/problems/链表理论基础.md @@ -24,7 +24,7 @@ ## 双链表 -单链表中的节点只能指向节点的下一个节点。 +单链表中的指针域只能指向节点的下一个节点。 双链表:每一个节点有两个指针域,一个指向下一个节点,一个指向上一个节点。 @@ -56,7 +56,7 @@ ![链表3](https://img-blog.csdnimg.cn/20200806194613920.png) -这个链表起始节点为2, 终止节点为7, 各个节点分布在内存个不同地址空间上,通过指针串联在一起。 +这个链表起始节点为2, 终止节点为7, 各个节点分布在内存的不同地址空间上,通过指针串联在一起。 # 链表的定义 From be4051893888427b41b172135b21add3fa096579 Mon Sep 17 00:00:00 2001 From: Jamcy123 <1219502823@qq.com> Date: Fri, 22 Apr 2022 15:34:06 +0800 Subject: [PATCH 298/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=201047.=20=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E5=AD=97=E7=AC=A6=E4=B8=B2=E4=B8=AD=E7=9A=84=E6=89=80?= =?UTF-8?q?=E6=9C=89=E7=9B=B8=E9=82=BB=E9=87=8D=E5=A4=8D=E9=A1=B9=20?= =?UTF-8?q?=E5=8F=8C=E6=8C=87=E9=92=88=E8=A7=A3=E6=B3=95=20javascript?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/1047.删除字符串中的所有相邻重复项.md | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/problems/1047.删除字符串中的所有相邻重复项.md b/problems/1047.删除字符串中的所有相邻重复项.md index 54455f62..638c8f4e 100644 --- a/problems/1047.删除字符串中的所有相邻重复项.md +++ b/problems/1047.删除字符串中的所有相邻重复项.md @@ -250,11 +250,9 @@ func removeDuplicates(s string) string { javaScript: +法一:使用栈 + ```js -/** - * @param {string} s - * @return {string} - */ var removeDuplicates = function(s) { const stack = []; for(const x of s) { @@ -267,6 +265,25 @@ var removeDuplicates = function(s) { }; ``` +法二:双指针(模拟栈) + +```js +// 原地解法(双指针模拟栈) +var removeDuplicates = function(s) { + s = [...s]; + let top = -1; // 指向栈顶元素的下标 + for(let i = 0; i < s.length; i++) { + if(top === -1 || s[top] !== s[i]) { // top === -1 即空栈 + s[++top] = s[i]; // 入栈 + } else { + top--; // 推出栈 + } + } + s.length = top + 1; // 栈顶元素下标 + 1 为栈的长度 + return s.join(''); +}; +``` + TypeScript: ```typescript From 5a7e247e5f5a70c1e33dfce4cc42b498cc031f61 Mon Sep 17 00:00:00 2001 From: ChubbyPan Date: Fri, 22 Apr 2022 07:59:32 +0000 Subject: [PATCH 299/328] update build binary tree in ACM pattern with python --- problems/前序/ACM模式如何构建二叉树.md | 56 +++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/problems/前序/ACM模式如何构建二叉树.md b/problems/前序/ACM模式如何构建二叉树.md index bd2e9780..f6ec2dd3 100644 --- a/problems/前序/ACM模式如何构建二叉树.md +++ b/problems/前序/ACM模式如何构建二叉树.md @@ -213,7 +213,61 @@ int main() { ## Python -```Python +```Python3 +class TreeNode: + def __init__(self, val = 0, left = None, right = None): + self.val = val + self.left = left + self.right = right + + +# 根据数组构建二叉树 + +def construct_binary_tree(nums: []) -> TreeNode: + if not nums: + return None + # 用于存放构建好的节点 + root = TreeNode(-1) + Tree = [] + # 将数组元素全部转化为树节点 + for i in range(len(nums)): + if nums[i]!= -1: + node = TreeNode(nums[i]) + else: + node = None + Tree.append(node) + if i == 0: + root = node + for i in range(len(Tree)): + node = Tree[i] + if node and (2 * i + 2) < len(Tree): + node.left = Tree[i * 2 + 1] + node.right = Tree[i * 2 + 2] + return root + + + +# 算法:中序遍历二叉树 + +class Solution: + def __init__(self): + self.T = [] + def inorder(self, root: TreeNode) -> []: + if not root: + return + self.inorder(root.left) + self.T.append(root.val) + self.inorder(root.right) + return self.T + + + +# 验证创建二叉树的有效性,二叉排序树的中序遍历应为顺序排列 + +test_tree = [3, 1, 5, -1, 2, 4 ,6] +root = construct_binary_tree(test_tree) +A = Solution() +print(A.inorder(root)) ``` From a0c16d48cb851b3c118cf3da0900797be767f9d0 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sat, 23 Apr 2022 18:19:36 +0800 Subject: [PATCH 300/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880435.?= =?UTF-8?q?=E6=97=A0=E9=87=8D=E5=8F=A0=E5=8C=BA=E9=97=B4.md=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0435.无重叠区间.md | 51 ++++++++++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/problems/0435.无重叠区间.md b/problems/0435.无重叠区间.md index b24ca024..c7f755bf 100644 --- a/problems/0435.无重叠区间.md +++ b/problems/0435.无重叠区间.md @@ -263,7 +263,7 @@ func min(a,b int)int{ } return a } -``` +``` ### Javascript: - 按右边界排序 @@ -306,6 +306,55 @@ var eraseOverlapIntervals = function(intervals) { } ``` +### TypeScript + +> 按右边界排序,从左往右遍历 + +```typescript +function eraseOverlapIntervals(intervals: number[][]): number { + const length = intervals.length; + if (length === 0) return 0; + intervals.sort((a, b) => a[1] - b[1]); + let right: number = intervals[0][1]; + let count: number = 1; + for (let i = 1; i < length; i++) { + if (intervals[i][0] >= right) { + count++; + right = intervals[i][1]; + } + } + return length - count; +}; +``` + +> 按左边界排序,从左往右遍历 + +```typescript +function eraseOverlapIntervals(intervals: number[][]): number { + if (intervals.length === 0) return 0; + intervals.sort((a, b) => a[0] - b[0]); + let right: number = intervals[0][1]; + let tempInterval: number[]; + let resCount: number = 0; + for (let i = 1, length = intervals.length; i < length; i++) { + tempInterval = intervals[i]; + if (tempInterval[0] >= right) { + // 未重叠 + right = tempInterval[1]; + } else { + // 有重叠,移除当前interval和前一个interval中右边界更大的那个 + right = Math.min(right, tempInterval[1]); + resCount++; + } + } + return resCount; +}; +``` + + + + + -----------------------
From 7c752afaf472f8e3056d9bfefd9628548cbec5d8 Mon Sep 17 00:00:00 2001 From: h4 <20080114+tan-i-ham@users.noreply.github.com> Date: Sat, 23 Apr 2022 22:19:09 +0900 Subject: [PATCH 301/328] chore: Sync 150 markdown render format --- problems/0150.逆波兰表达式求值.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/problems/0150.逆波兰表达式求值.md b/problems/0150.逆波兰表达式求值.md index f4dad823..fd3d69aa 100644 --- a/problems/0150.逆波兰表达式求值.md +++ b/problems/0150.逆波兰表达式求值.md @@ -109,7 +109,7 @@ public: }; ``` -# 题外话 +## 题外话 我们习惯看到的表达式都是中缀表达式,因为符合我们的习惯,但是中缀表达式对于计算机来说就不是很友好了。 @@ -128,7 +128,7 @@ public: -# 其他语言版本 +## 其他语言版本 java: From 531c1b0a3bfac9867a8403baaf95a6cd284f6a41 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sat, 23 Apr 2022 21:19:23 +0800 Subject: [PATCH 302/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880763.?= =?UTF-8?q?=E5=88=92=E5=88=86=E5=AD=97=E6=AF=8D=E5=8C=BA=E9=97=B4.md?= =?UTF-8?q?=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0763.划分字母区间.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/problems/0763.划分字母区间.md b/problems/0763.划分字母区间.md index 03d3a73b..901dccb4 100644 --- a/problems/0763.划分字母区间.md +++ b/problems/0763.划分字母区间.md @@ -174,6 +174,31 @@ var partitionLabels = function(s) { }; ``` +### TypeScript + +```typescript +function partitionLabels(s: string): number[] { + const length: number = s.length; + const resArr: number[] = []; + const helperMap: Map = new Map(); + for (let i = 0; i < length; i++) { + helperMap.set(s[i], i); + } + let left: number = 0; + let right: number = 0; + for (let i = 0; i < length; i++) { + right = Math.max(helperMap.get(s[i])!, right); + if (i === right) { + resArr.push(i - left + 1); + left = i + 1; + } + } + return resArr; +}; +``` + + + -----------------------
From 8966752197c174e46052ab549495a045ce1a5f14 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sat, 23 Apr 2022 21:44:11 +0800 Subject: [PATCH 303/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880056.?= =?UTF-8?q?=E5=90=88=E5=B9=B6=E5=8C=BA=E9=97=B4.md=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0056.合并区间.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/problems/0056.合并区间.md b/problems/0056.合并区间.md index a9caeaf0..b44d602c 100644 --- a/problems/0056.合并区间.md +++ b/problems/0056.合并区间.md @@ -266,6 +266,26 @@ var merge = function(intervals) { }; ``` +### TypeScript + +```typescript +function merge(intervals: number[][]): number[][] { + const resArr: number[][] = []; + intervals.sort((a, b) => a[0] - b[0]); + resArr[0] = [...intervals[0]]; // 避免修改原intervals + for (let i = 1, length = intervals.length; i < length; i++) { + let interval: number[] = intervals[i]; + let last: number[] = resArr[resArr.length - 1]; + if (interval[0] <= last[1]) { + last[1] = Math.max(interval[1], last[1]); + } else { + resArr.push([...intervals[i]]); + } + } + return resArr; +}; +``` + ----------------------- From e2807eb59ad5b9e45311544278c905fd942e85b3 Mon Sep 17 00:00:00 2001 From: 243wresfdxvc Date: Sat, 23 Apr 2022 16:15:53 +0000 Subject: [PATCH 304/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200203.=E7=A7=BB?= =?UTF-8?q?=E5=87=BA=E9=93=BE=E8=A1=A8=E5=85=83=E7=B4=A0.md=20C=E8=AF=AD?= =?UTF-8?q?=E8=A8=80=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0203.移除链表元素.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/problems/0203.移除链表元素.md b/problems/0203.移除链表元素.md index c34831b7..751553e2 100644 --- a/problems/0203.移除链表元素.md +++ b/problems/0203.移除链表元素.md @@ -145,6 +145,38 @@ public: ## 其他语言版本 C: +用原来的链表操作: +```c +struct ListNode* removeElements(struct ListNode* head, int val){ + struct ListNode* temp; + // 当头结点存在并且头结点的值等于val时 + while(head && head->val == val) { + temp = head; + // 将新的头结点设置为head->next并删除原来的头结点 + head = head->next; + free(temp); + } + + struct ListNode *cur = head; + // 当cur存在并且cur->next存在时 + // 此解法需要判断cur存在因为cur指向head。若head本身为NULL或者原链表中元素都为val的话,cur也会为NULL + while(cur && (temp = cur->next)) { + // 若cur->next的值等于val + if(temp->val == val) { + // 将cur->next设置为cur->next->next并删除cur->next + cur->next = temp->next; + free(temp); + } + // 若cur->next不等于val,则将cur后移一位 + else + cur = cur->next; + } + + // 返回头结点 + return head; +} +``` +设置一个虚拟头结点: ```c /** * Definition for singly-linked list. From 7cf68bd1f2eaa6ad83d69b969f29b1b146397dfa Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Sun, 24 Apr 2022 17:40:23 +0800 Subject: [PATCH 305/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880738.?= =?UTF-8?q?=E5=8D=95=E8=B0=83=E9=80=92=E5=A2=9E=E7=9A=84=E6=95=B0=E5=AD=97?= =?UTF-8?q?.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0738.单调递增的数字.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/problems/0738.单调递增的数字.md b/problems/0738.单调递增的数字.md index c8ce8a2b..4e4079a7 100644 --- a/problems/0738.单调递增的数字.md +++ b/problems/0738.单调递增的数字.md @@ -225,6 +225,28 @@ var monotoneIncreasingDigits = function(n) { }; ``` +### TypeScript + +```typescript +function monotoneIncreasingDigits(n: number): number { + let strArr: number[] = String(n).split('').map(i => parseInt(i)); + const length = strArr.length; + let flag: number = length; + for (let i = length - 2; i >= 0; i--) { + if (strArr[i] > strArr[i + 1]) { + strArr[i] -= 1; + flag = i + 1; + } + } + for (let i = flag; i < length; i++) { + strArr[i] = 9; + } + return parseInt(strArr.join('')); +}; +``` + + + -----------------------
From d5f21d534198069fee0dd4a90397d1322d435179 Mon Sep 17 00:00:00 2001 From: eat to 160 pounds <2915390277@qq.com> Date: Sun, 24 Apr 2022 21:05:31 +0800 Subject: [PATCH 306/328] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=86=E4=B8=89?= =?UTF-8?q?=E6=95=B0=E4=B9=8B=E5=92=8Cjavascript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0015.三数之和.md | 70 +++++++++++++++------------------------ 1 file changed, 26 insertions(+), 44 deletions(-) diff --git a/problems/0015.三数之和.md b/problems/0015.三数之和.md index bfde6b35..cc184c87 100644 --- a/problems/0015.三数之和.md +++ b/problems/0015.三数之和.md @@ -313,54 +313,36 @@ func threeSum(nums []int)[][]int{ javaScript: ```js -/** - * @param {number[]} nums - * @return {number[][]} - */ - -// 循环内不考虑去重 var threeSum = function(nums) { - const len = nums.length; - if(len < 3) return []; - nums.sort((a, b) => a - b); - const resSet = new Set(); - for(let i = 0; i < len - 2; i++) { - if(nums[i] > 0) break; - let l = i + 1, r = len - 1; + const res = [], len = nums.length + // 将数组排序 + nums.sort((a, b) => a - b) + for (let i = 0; i < len; i++) { + let l = i + 1, r = len - 1, iNum = nums[i] + // 数组排过序,如果第一个数大于0直接返回res + if (iNum > 0) return res + // 去重 + if (iNum == nums[i - 1]) continue while(l < r) { - const sum = nums[i] + nums[l] + nums[r]; - if(sum < 0) { l++; continue }; - if(sum > 0) { r--; continue }; - resSet.add(`${nums[i]},${nums[l]},${nums[r]}`); - l++; - r--; + let lNum = nums[l], rNum = nums[r], threeSum = iNum + lNum + rNum + // 三数之和小于0,则左指针向右移动 + if (threeSum < 0) l++ + else if (threeSum > 0) r-- + else { + res.push([iNum, lNum, rNum]) + // 去重 + while(l < r && nums[l] == nums[l + 1]){ + l++ + } + while(l < r && nums[r] == nums[r - 1]) { + r-- + } + l++ + r-- + } } } - return Array.from(resSet).map(i => i.split(",")); -}; - -// 去重优化 -var threeSum = function(nums) { - const len = nums.length; - if(len < 3) return []; - nums.sort((a, b) => a - b); - const res = []; - for(let i = 0; i < len - 2; i++) { - if(nums[i] > 0) break; - // a去重 - if(i > 0 && nums[i] === nums[i - 1]) continue; - let l = i + 1, r = len - 1; - while(l < r) { - const sum = nums[i] + nums[l] + nums[r]; - if(sum < 0) { l++; continue }; - if(sum > 0) { r--; continue }; - res.push([nums[i], nums[l], nums[r]]) - // b c 去重 - while(l < r && nums[l] === nums[++l]); - while(l < r && nums[r] === nums[--r]); - } - } - return res; + return res }; ``` TypeScript: From 84750aca45f96f15e4dc271410c32cde78667e41 Mon Sep 17 00:00:00 2001 From: 243wresfdxvc Date: Sun, 24 Apr 2022 18:32:09 +0000 Subject: [PATCH 307/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200860.=E6=9F=A0?= =?UTF-8?q?=E6=AA=AC=E6=B0=B4=E6=89=BE=E9=9B=B6.md=20C=E8=AF=AD=E8=A8=80?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0860.柠檬水找零.md | 43 +++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/problems/0860.柠檬水找零.md b/problems/0860.柠檬水找零.md index ffd5490d..2738f574 100644 --- a/problems/0860.柠檬水找零.md +++ b/problems/0860.柠檬水找零.md @@ -250,6 +250,49 @@ var lemonadeChange = function(bills) { return true }; +``` +### C +```c +bool lemonadeChange(int* bills, int billsSize){ + // 分别记录五元、十元的数量(二十元不用记录,因为不会用到20元找零) + int fiveCount = 0; int tenCount = 0; + + int i; + for(i = 0; i < billsSize; ++i) { + // 分情况讨论每位顾客的付款 + switch(bills[i]) { + // 情况一:直接收款五元 + case 5: + fiveCount++; + break; + // 情况二:收款十元 + case 10: + // 若没有五元找零,返回false + if(fiveCount == 0) + return false; + // 收款十元并找零五元 + fiveCount--; + tenCount++; + break; + // 情况三:收款二十元 + case 20: + // 若可以,优先用十元和五元找零(因为十元只能找零20,所以需要尽量用掉。而5元能找零十元和二十元) + if(fiveCount > 0 && tenCount > 0) { + fiveCount--; + tenCount--; + } + // 若没有十元,但是有三张五元。用三张五元找零 + else if(fiveCount >= 3) + fiveCount-=3; + // 无法找开,返回false + else + return false; + break; + } + } + // 全部可以找开,返回true + return true; +} ``` ----------------------- From 8291e5e1c6d1b9c913a35015848124ad9cfd1808 Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Mon, 25 Apr 2022 14:05:53 +0800 Subject: [PATCH 308/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880714.?= =?UTF-8?q?=E4=B9=B0=E5=8D=96=E8=82=A1=E7=A5=A8=E7=9A=84=E6=9C=80=E4=BD=B3?= =?UTF-8?q?=E6=97=B6=E6=9C=BA=E5=90=AB=E6=89=8B=E7=BB=AD=E8=B4=B9.md?= =?UTF-8?q?=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0714.买卖股票的最佳时机含手续费.md | 44 +++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/problems/0714.买卖股票的最佳时机含手续费.md b/problems/0714.买卖股票的最佳时机含手续费.md index 2f27d6ea..b27631c6 100644 --- a/problems/0714.买卖股票的最佳时机含手续费.md +++ b/problems/0714.买卖股票的最佳时机含手续费.md @@ -293,6 +293,50 @@ var maxProfit = function(prices, fee) { }; ``` +TypeScript: + +> 贪心 + +```typescript +function maxProfit(prices: number[], fee: number): number { + if (prices.length === 0) return 0; + let minPrice: number = prices[0]; + let profit: number = 0; + for (let i = 1, length = prices.length; i < length; i++) { + if (minPrice > prices[i]) { + minPrice = prices[i]; + } + if (minPrice + fee < prices[i]) { + profit += prices[i] - minPrice - fee; + minPrice = prices[i] - fee; + } + } + return profit; +}; +``` + +> 动态规划 + +```typescript +function maxProfit(prices: number[], fee: number): number { + /** + dp[i][1]: 第i天不持有股票的最大所剩现金 + dp[i][0]: 第i天持有股票的最大所剩现金 + */ + const length: number = prices.length; + const dp: number[][] = new Array(length).fill(0).map(_ => []); + dp[0][1] = 0; + dp[0][0] = -prices[0]; + for (let i = 1, length = prices.length; i < length; i++) { + dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] + prices[i] - fee); + dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] - prices[i]); + } + return Math.max(dp[length - 1][0], dp[length - 1][1]); +}; +``` + + + -----------------------
From 7b45a3209014190bbee02de8df566638701db734 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BD=B3=E4=B9=90?= <1791781644@qq.com> Date: Mon, 25 Apr 2022 22:10:18 +0800 Subject: [PATCH 309/328] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E7=BB=99=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91=E9=81=8D=E5=8E=86=E9=A2=98=E7=9B=AE=E5=8A=A0?= =?UTF-8?q?=E4=B8=8A=E5=8A=9B=E6=89=A3=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/二叉树的迭代遍历.md | 6 +++--- problems/二叉树的递归遍历.md | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/problems/二叉树的迭代遍历.md b/problems/二叉树的迭代遍历.md index 8164724b..13ba5f1e 100644 --- a/problems/二叉树的迭代遍历.md +++ b/problems/二叉树的迭代遍历.md @@ -11,9 +11,9 @@ 看完本篇大家可以使用迭代法,再重新解决如下三道leetcode上的题目: -* 144.二叉树的前序遍历 -* 94.二叉树的中序遍历 -* 145.二叉树的后序遍历 +* [144.二叉树的前序遍历](https://leetcode-cn.com/problems/binary-tree-preorder-traversal/) +* [94.二叉树的中序遍历](https://leetcode-cn.com/problems/binary-tree-inorder-traversal/) +* [145.二叉树的后序遍历](https://leetcode-cn.com/problems/binary-tree-postorder-traversal/) 为什么可以用迭代法(非递归的方式)来实现二叉树的前后中序遍历呢? diff --git a/problems/二叉树的递归遍历.md b/problems/二叉树的递归遍历.md index 35d19d7b..13e704ea 100644 --- a/problems/二叉树的递归遍历.md +++ b/problems/二叉树的递归遍历.md @@ -99,9 +99,9 @@ void traversal(TreeNode* cur, vector& vec) { 此时大家可以做一做leetcode上三道题目,分别是: -* 144.二叉树的前序遍历 -* 145.二叉树的后序遍历 -* 94.二叉树的中序遍历 +* [144.二叉树的前序遍历](https://leetcode-cn.com/problems/binary-tree-preorder-traversal/) +* [145.二叉树的后序遍历](https://leetcode-cn.com/problems/binary-tree-postorder-traversal/) +* [94.二叉树的中序遍历](https://leetcode-cn.com/problems/binary-tree-inorder-traversal/) 可能有同学感觉前后中序遍历的递归太简单了,要打迭代法(非递归),别急,我们明天打迭代法,打个通透! From 9da09584cd39f56c937b5c68b7375ab0d602957b Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Tue, 26 Apr 2022 00:03:54 +0800 Subject: [PATCH 310/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880968.?= =?UTF-8?q?=E7=9B=91=E6=8E=A7=E4=BA=8C=E5=8F=89=E6=A0=91.md=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0968.监控二叉树.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/problems/0968.监控二叉树.md b/problems/0968.监控二叉树.md index 35c3ccdc..9a510a1b 100644 --- a/problems/0968.监控二叉树.md +++ b/problems/0968.监控二叉树.md @@ -476,7 +476,35 @@ var minCameraCover = function(root) { }; ``` +### TypeScript + +```typescript +function minCameraCover(root: TreeNode | null): number { + /** 0-无覆盖, 1-有摄像头, 2-有覆盖 */ + type statusCode = 0 | 1 | 2; + let resCount: number = 0; + if (recur(root) === 0) resCount++; + return resCount; + function recur(node: TreeNode | null): statusCode { + if (node === null) return 2; + const left: statusCode = recur(node.left), + right: statusCode = recur(node.right); + let resStatus: statusCode = 0; + if (left === 0 || right === 0) { + resStatus = 1; + resCount++; + } else if (left === 1 || right === 1) { + resStatus = 2; + } else { + resStatus = 0; + } + return resStatus; + } +}; +``` + ### C + ```c /* **函数后序遍历二叉树。判断一个结点状态时,根据其左右孩子结点的状态进行判断 From 3ec08f41dd08cdd830215bdf2b602bbdcfc92512 Mon Sep 17 00:00:00 2001 From: 243wresfdxvc Date: Mon, 25 Apr 2022 18:18:50 +0000 Subject: [PATCH 311/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200406.=E6=A0=B9?= =?UTF-8?q?=E6=8D=AE=E8=BA=AB=E9=AB=98=E9=87=8D=E5=BB=BA=E9=98=9F=E5=88=97?= =?UTF-8?q?.md=20C=E8=AF=AD=E8=A8=80=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0406.根据身高重建队列.md | 47 +++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/problems/0406.根据身高重建队列.md b/problems/0406.根据身高重建队列.md index b2354d09..9cefa11c 100644 --- a/problems/0406.根据身高重建队列.md +++ b/problems/0406.根据身高重建队列.md @@ -290,6 +290,53 @@ var reconstructQueue = function(people) { }; ``` +### C +```c +int cmp(const void *p1, const void *p2) { + int *pp1 = *(int**)p1; + int *pp2 = *(int**)p2; + // 若身高相同,则按照k从小到大排列 + // 若身高不同,按身高从大到小排列 + return pp1[0] == pp2[0] ? pp1[1] - pp2[1] : pp2[0] - pp1[0]; +} + +// 将start与end中间的元素都后移一位 +// start为将要新插入元素的位置 +void moveBack(int **people, int peopleSize, int start, int end) { + int i; + for(i = end; i > start; i--) { + people[i] = people[i-1]; + } +} + +int** reconstructQueue(int** people, int peopleSize, int* peopleColSize, int* returnSize, int** returnColumnSizes){ + int i; + // 将people按身高从大到小排列(若身高相同,按k从小到大排列) + qsort(people, peopleSize, sizeof(int*), cmp); + + for(i = 0; i < peopleSize; ++i) { + // people[i]要插入的位置 + int position = people[i][1]; + int *temp = people[i]; + // 将position到i中间的元素后移一位 + // 注:因为已经排好序,position不会比i大。(举例:排序后people最后一位元素最小,其可能的k最大值为peopleSize-2,小于此时的i) + moveBack(people, peopleSize, position, i); + // 将temp放置到position处 + people[position] = temp; + + } + + + // 设置返回二维数组的大小以及里面每个一维数组的长度 + *returnSize = peopleSize; + *returnColumnSizes = (int*)malloc(sizeof(int) * peopleSize); + for(i = 0; i < peopleSize; ++i) { + (*returnColumnSizes)[i] = 2; + } + return people; +} +``` + -----------------------
From fa2e1b097b555f900dce38f01e158634df074817 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Tue, 26 Apr 2022 10:59:56 +0800 Subject: [PATCH 312/328] Update --- problems/0110.平衡二叉树.md | 2 +- problems/数组总结篇.md | 9 ++++----- problems/链表总结篇.md | 4 ++++ 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/problems/0110.平衡二叉树.md b/problems/0110.平衡二叉树.md index 411434d4..d98ff8a9 100644 --- a/problems/0110.平衡二叉树.md +++ b/problems/0110.平衡二叉树.md @@ -264,7 +264,7 @@ int getDepth(TreeNode* cur) { } ``` -然后再用栈来模拟前序遍历,遍历每一个节点的时候,再去判断左右孩子的高度是否符合,代码如下: +然后再用栈来模拟后序遍历,遍历每一个节点的时候,再去判断左右孩子的高度是否符合,代码如下: ```CPP bool isBalanced(TreeNode* root) { diff --git a/problems/数组总结篇.md b/problems/数组总结篇.md index d256298b..ef7a4876 100644 --- a/problems/数组总结篇.md +++ b/problems/数组总结篇.md @@ -120,14 +120,13 @@ # 总结 +![](https://code-thinking-1253855093.file.myqcloud.com/pics/数组总结.png) + +这个图是 [代码随想录知识星球](https://programmercarl.com/other/kstar.html) 成员:[海螺人](https://wx.zsxq.com/dweb2/index/footprint/844412858822412),所画,总结的非常好,分享给大家。 + 从二分法到双指针,从滑动窗口到螺旋矩阵,相信如果大家真的认真做了「代码随想录」每日推荐的题目,定会有所收获。 推荐的题目即使大家之前做过了,再读一遍文章,也会帮助你提炼出解题的精髓所在。 -如果感觉有所收获,希望大家多多支持,打卡转发,点赞在看 都是对我最大的鼓励! - -最后,大家周末愉快! - - -----------------------
diff --git a/problems/链表总结篇.md b/problems/链表总结篇.md index abbb288e..e3fe4740 100644 --- a/problems/链表总结篇.md +++ b/problems/链表总结篇.md @@ -76,6 +76,10 @@ ## 总结 +![](https://code-thinking-1253855093.file.myqcloud.com/pics/链表总结.png) + +这个图是 [代码随想录知识星球](https://programmercarl.com/other/kstar.html) 成员:[海螺人](https://wx.zsxq.com/dweb2/index/footprint/844412858822412),所画,总结的非常好,分享给大家。 + 考察链表的操作其实就是考察指针的操作,是面试中的常见类型。 链表篇中开头介绍[链表理论知识](https://programmercarl.com/0203.移除链表元素.html),然后分别通过经典题目介绍了如下知识点: From e15492b0b69ca06d8d90057093237de8767bf784 Mon Sep 17 00:00:00 2001 From: dbcai Date: Tue, 26 Apr 2022 22:08:25 +0800 Subject: [PATCH 313/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E5=89=8D=E5=BA=8F?= =?UTF-8?q?.ACM=E6=A8=A1=E5=BC=8F=E5=A6=82=E4=BD=95=E6=9E=84=E5=BB=BA?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91.md=20Java=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/前序/ACM模式如何构建二叉树.md | 53 ++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/problems/前序/ACM模式如何构建二叉树.md b/problems/前序/ACM模式如何构建二叉树.md index 28c4b6f7..07674b31 100644 --- a/problems/前序/ACM模式如何构建二叉树.md +++ b/problems/前序/ACM模式如何构建二叉树.md @@ -217,6 +217,59 @@ int main() { ## Java ```Java +public class Solution { + // 节点类 + static class TreeNode { + // 节点值 + int val; + + // 左节点 + TreeNode left; + + // 右节点 + TreeNode right; + + // 节点的构造函数(默认左右节点都为null) + public TreeNode(int x) { + this.val = x; + this.left = null; + this.right = null; + } + } + + /** + * 根据数组构建二叉树 + * @param arr 树的数组表示 + * @return 构建成功后树的根节点 + */ + public TreeNode constructBinaryTree(final int[] arr) { + // 构建和原数组相同的树节点列表 + List treeNodeList = arr.length > 0 ? new ArrayList<>(arr.length) : null; + TreeNode root = null; + // 把输入数值数组,先转化为二叉树节点列表 + for (int i = 0; i < arr.length; i++) { + TreeNode node = null; + if (arr[i] != -1) { // 用 -1 表示null + node = new TreeNode(arr[i]); + } + treeNodeList.add(node); + if (i == 0) { + root = node; + } + } + // 遍历一遍,根据规则左右孩子赋值就可以了 + // 注意这里 结束规则是 i * 2 + 2 < arr.length,避免空指针 + for (int i = 0; i * 2 + 2 < arr.length; i++) { + TreeNode node = treeNodeList.get(i); + if (node != null) { + // 线性存储转连式存储关键逻辑 + node.left = treeNodeList.get(2 * i + 1); + node.right = treeNodeList.get(2 * i + 2); + } + } + return root; + } +} ``` From ce8e2019db658788e1231c5d56d2e50c3cc417a0 Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Wed, 27 Apr 2022 00:00:37 +0800 Subject: [PATCH 314/328] Update --- README.md | 42 +--- problems/0051.N皇后.md | 2 - .../刷力扣用不用库函数.md | 8 +- problems/知识星球精选/HR特意刁难非科班.md | 47 ----- problems/知识星球精选/HR面注意事项.md | 89 -------- problems/知识星球精选/offer对比-决赛圈.md | 87 -------- .../知识星球精选/offer总决赛,何去何从.md | 88 -------- problems/知识星球精选/offer的选择.md | 137 ------------- problems/知识星球精选/不一样的七夕.md | 73 ------- problems/知识星球精选/不喜欢写代码怎么办.md | 45 ---- problems/知识星球精选/不少录友想放弃秋招.md | 81 -------- problems/知识星球精选/专业技能可以这么写.md | 69 ------- .../知识星球精选/入职后担心代码能力跟不上.md | 55 ----- problems/知识星球精选/关于实习大家的疑问.md | 87 -------- problems/知识星球精选/关于提前批的一些建议.md | 72 ------- problems/知识星球精选/写简历的一些问题.md | 100 --------- .../知识星球精选/初入大三选择考研VS工作.md | 49 ----- problems/知识星球精选/刷题攻略要刷两遍.md | 67 ------ problems/知识星球精选/博士转行计算机.md | 53 ----- problems/知识星球精选/合适自己的就是最好的.md | 37 ---- problems/知识星球精选/备战2022届秋招.md | 67 ------ problems/知识星球精选/大厂新人培养体系.md | 81 -------- problems/知识星球精选/天下乌鸦一般黑.md | 71 ------- .../知识星球精选/如何权衡实习与秋招复习.md | 47 ----- problems/知识星球精选/客三消.md | 95 --------- .../知识星球精选/技术不好如何选择技术方向.md | 32 --- problems/知识星球精选/提前批已经开始了.md | 48 ----- .../知识星球精选/秋招下半场依然没offer.md | 99 --------- problems/知识星球精选/秋招开奖.md | 65 ------ problems/知识星球精选/秋招总结1.md | 194 ------------------ problems/知识星球精选/秋招总结2.md | 48 ----- problems/知识星球精选/秋招总结3.md | 83 -------- problems/知识星球精选/秋招的上半场.md | 55 ----- .../知识星球精选/秋招进行中的迷茫与焦虑.md | 55 ----- problems/知识星球精选/英语到底重不重要.md | 58 ------ problems/知识星球精选/要不要考研.md | 45 ---- problems/知识星球精选/逼签.md | 51 ----- problems/知识星球精选/非科班2021秋招总结.md | 117 ----------- problems/知识星球精选/非科班的困扰.md | 54 ----- problems/知识星球精选/面试中发散性问题.md | 45 ---- 40 files changed, 3 insertions(+), 2695 deletions(-) rename problems/{知识星球精选 => 前序}/刷力扣用不用库函数.md (82%) delete mode 100644 problems/知识星球精选/HR特意刁难非科班.md delete mode 100644 problems/知识星球精选/HR面注意事项.md delete mode 100644 problems/知识星球精选/offer对比-决赛圈.md delete mode 100644 problems/知识星球精选/offer总决赛,何去何从.md delete mode 100644 problems/知识星球精选/offer的选择.md delete mode 100644 problems/知识星球精选/不一样的七夕.md delete mode 100644 problems/知识星球精选/不喜欢写代码怎么办.md delete mode 100644 problems/知识星球精选/不少录友想放弃秋招.md delete mode 100644 problems/知识星球精选/专业技能可以这么写.md delete mode 100644 problems/知识星球精选/入职后担心代码能力跟不上.md delete mode 100644 problems/知识星球精选/关于实习大家的疑问.md delete mode 100644 problems/知识星球精选/关于提前批的一些建议.md delete mode 100644 problems/知识星球精选/写简历的一些问题.md delete mode 100644 problems/知识星球精选/初入大三选择考研VS工作.md delete mode 100644 problems/知识星球精选/刷题攻略要刷两遍.md delete mode 100644 problems/知识星球精选/博士转行计算机.md delete mode 100644 problems/知识星球精选/合适自己的就是最好的.md delete mode 100644 problems/知识星球精选/备战2022届秋招.md delete mode 100644 problems/知识星球精选/大厂新人培养体系.md delete mode 100644 problems/知识星球精选/天下乌鸦一般黑.md delete mode 100644 problems/知识星球精选/如何权衡实习与秋招复习.md delete mode 100644 problems/知识星球精选/客三消.md delete mode 100644 problems/知识星球精选/技术不好如何选择技术方向.md delete mode 100644 problems/知识星球精选/提前批已经开始了.md delete mode 100644 problems/知识星球精选/秋招下半场依然没offer.md delete mode 100644 problems/知识星球精选/秋招开奖.md delete mode 100644 problems/知识星球精选/秋招总结1.md delete mode 100644 problems/知识星球精选/秋招总结2.md delete mode 100644 problems/知识星球精选/秋招总结3.md delete mode 100644 problems/知识星球精选/秋招的上半场.md delete mode 100644 problems/知识星球精选/秋招进行中的迷茫与焦虑.md delete mode 100644 problems/知识星球精选/英语到底重不重要.md delete mode 100644 problems/知识星球精选/要不要考研.md delete mode 100644 problems/知识星球精选/逼签.md delete mode 100644 problems/知识星球精选/非科班2021秋招总结.md delete mode 100644 problems/知识星球精选/非科班的困扰.md delete mode 100644 problems/知识星球精选/面试中发散性问题.md diff --git a/README.md b/README.md index 148f49d8..1d7f219d 100644 --- a/README.md +++ b/README.md @@ -102,6 +102,7 @@ * [看了这么多代码,谈一谈代码风格!](./problems/前序/代码风格.md) * [力扣上的代码想在本地编译运行?](./problems/前序/力扣上的代码想在本地编译运行?.md) * [什么是核心代码模式,什么又是ACM模式?](./problems/前序/什么是核心代码模式,什么又是ACM模式?.md) + * [刷题要不要用库函数](./problems/前序/刷力扣用不用库函数.md) * [ACM模式如何构造二叉树](./problems/前序/ACM模式如何构建二叉树.md) * [解密互联网大厂研发流程](./problems/前序/互联网大厂研发流程.md) @@ -129,45 +130,6 @@ * [递归算法的时间与空间复杂度分析!](./problems/前序/递归算法的时间与空间复杂度分析.md) * [刷了这么多题,你了解自己代码的内存消耗么?](./problems/前序/刷了这么多题,你了解自己代码的内存消耗么?.md) -## 知识星球精选 - -* [秋招面试,心态很重要!](./problems/知识星球精选/秋招总结3.md) -* [秋招倒霉透顶,触底反弹!](./problems/知识星球精选/秋招总结2.md) -* [无竞赛,无实习,如何秋招?](./problems/知识星球精选/秋招总结1.md) -* [offer总决赛,何去何从!](./problems/知识星球精选/offer总决赛,何去何从.md) -* [入职后担心代码能力跟不上!](./problems/知识星球精选/入职后担心代码能力跟不上.md) -* [秋招进入offer决赛圈!](./problems/知识星球精选/offer对比-决赛圈.md) -* [非科班的困扰](./problems/知识星球精选/非科班的困扰.md) -* [offer的选择-开奖](./problems/知识星球精选/秋招开奖.md) -* [看到代码就抵触!怎么办?](./problems/知识星球精选/不喜欢写代码怎么办.md) -* [遭遇逼签,怎么办?](./problems/知识星球精选/逼签.md) -* [HR特意刁难非科班!](./problems/知识星球精选/HR特意刁难非科班.md) -* [offer的选择](./problems/知识星球精选/offer的选择.md) -* [天下乌鸦一般黑,哪家没有PUA?](./problems/知识星球精选/天下乌鸦一般黑.md) -* [初入大三,考研VS工作](./problems/知识星球精选/初入大三选择考研VS工作.md) -* [非科班2021秋招总结](./problems/知识星球精选/非科班2021秋招总结.md) -* [秋招下半场依然没offer,怎么办?](./problems/知识星球精选/秋招下半场依然没offer.md) -* [合适自己的就是最好的](./problems/知识星球精选/合适自己的就是最好的.md) -* [为什么都说客户端会消失](./problems/知识星球精选/客三消.md) -* [博士转计算机如何找工作](./problems/知识星球精选/博士转行计算机.md) -* [不一样的七夕](./problems/知识星球精选/不一样的七夕.md) -* [HR面注意事项](./problems/知识星球精选/HR面注意事项.md) -* [刷题攻略要刷两遍!](./problems/知识星球精选/刷题攻略要刷两遍.md) -* [秋招进行中的迷茫与焦虑......](./problems/知识星球精选/秋招进行中的迷茫与焦虑.md) -* [大厂新人培养体系应该是什么样的?](./problems/知识星球精选/大厂新人培养体系.md) -* [你的简历里「专业技能」写的够专业么?](./problems/知识星球精选/专业技能可以这么写.md) -* [Carl看了上百份简历,总结了这些!](./problems/知识星球精选/写简历的一些问题.md) -* [备战2022届秋招](./problems/知识星球精选/备战2022届秋招.md) -* [技术不太好,如果选择方向](./problems/知识星球精选/技术不好如何选择技术方向.md) -* [刷题要不要使用库函数](./problems/知识星球精选/刷力扣用不用库函数.md) -* [关于实习的几点问题](./problems/知识星球精选/关于实习大家的疑问.md) -* [面试中遇到了发散性问题,怎么办?](./problems/知识星球精选/面试中发散性问题.md) -* [英语到底重不重要!](./problems/知识星球精选/英语到底重不重要.md) -* [计算机专业要不要读研!](./problems/知识星球精选/要不要考研.md) -* [关于提前批的一些建议](./problems/知识星球精选/关于提前批的一些建议.md) -* [已经在实习的录友要如何准备秋招](./problems/知识星球精选/如何权衡实习与秋招复习.md) -* [华为提前批已经开始了](./problems/知识星球精选/提前批已经开始了.md) - ## 杂谈 * [「代码随想录」刷题网站上线](https://mp.weixin.qq.com/s/-6rd_g7LrVD1fuKBYk2tXQ)。 @@ -569,7 +531,7 @@ 如果是已工作,备注:姓名-城市-岗位-组队刷题。如果学生,备注:姓名-学校-年级-组队刷题。**备注没有自我介绍不通过哦** -
+
diff --git a/problems/0051.N皇后.md b/problems/0051.N皇后.md index 85524e6f..c03e48c2 100644 --- a/problems/0051.N皇后.md +++ b/problems/0051.N皇后.md @@ -129,7 +129,6 @@ for (int col = 0; col < n; col++) { ```CPP bool isValid(int row, int col, vector& chessboard, int n) { - int count = 0; // 检查列 for (int i = 0; i < row; i++) { // 这是一个剪枝 if (chessboard[i][col] == 'Q') { @@ -178,7 +177,6 @@ void backtracking(int n, int row, vector& chessboard) { } } bool isValid(int row, int col, vector& chessboard, int n) { - int count = 0; // 检查列 for (int i = 0; i < row; i++) { // 这是一个剪枝 if (chessboard[i][col] == 'Q') { diff --git a/problems/知识星球精选/刷力扣用不用库函数.md b/problems/前序/刷力扣用不用库函数.md similarity index 82% rename from problems/知识星球精选/刷力扣用不用库函数.md rename to problems/前序/刷力扣用不用库函数.md index c8e2f5c6..ae0940bf 100644 --- a/problems/知识星球精选/刷力扣用不用库函数.md +++ b/problems/前序/刷力扣用不用库函数.md @@ -1,8 +1,3 @@ -

- - - - # 究竟什么时候用库函数,什么时候要自己实现 在[知识星球](https://programmercarl.com/other/kstar.html)里有录友问我,刷题究竟要不要用库函数? 刷题的时候总是禁不住库函数的诱惑,如果都不用库函数一些题目做起来还很麻烦。 @@ -11,7 +6,7 @@ 一些同学可能比较喜欢看力扣上直接调用库函数的评论和题解,**其实我感觉娱乐一下还是可以的,但千万别当真,别沉迷!** -例如:[字符串:151. 翻转字符串里的单词](https://mp.weixin.qq.com/s/X3qpi2v5RSp08mO-W5Vicw)这道题目本身是综合考察同学们对字符串的处理能力,如果 split + reverse的话,那就失去了题目的意义了。 +例如:[字符串:151. 翻转字符串里的单词](https://programmercarl.com/0151.%E7%BF%BB%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2%E9%87%8C%E7%9A%84%E5%8D%95%E8%AF%8D.html)这道题目本身是综合考察同学们对字符串的处理能力,如果 split + reverse的话,那就失去了题目的意义了。 有的同学可能不屑于实现这么简单的功能,直接调库函数完事,把字符串分成一个个单词,一想就是那么一回事,多简单。 @@ -31,4 +26,3 @@ 在刷题的时候本着我说的标准来使用库函数,详细对大家回有所帮助! - diff --git a/problems/知识星球精选/HR特意刁难非科班.md b/problems/知识星球精选/HR特意刁难非科班.md deleted file mode 100644 index d5d39fe3..00000000 --- a/problems/知识星球精选/HR特意刁难非科班.md +++ /dev/null @@ -1,47 +0,0 @@ - -

- - - - -# HR特意刁难非科班! - -不少录友都是非科班转程序员,或者进军互联网的,但有一些HR在HR面的时候特意刁难大家。 - -正如[知识星球](https://programmercarl.com/other/kstar.html)里,这位录友所遭受的情景。 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211006230202.png) - -1. 你的研究方向并不是这个方面的,你为什么要转行? -2. 你和非科班的同学相比肯定有一些劣势,你打算怎么赶上他们?或者是你如何应对你作为非科班生在工作中的挑战? - -以下是我的回答: - -对于问题一,你这么说没问题,可以再润色一下,说一说自己看过哪些技术大牛的传记,例如《黑客与画家》,对自己影响很大,然后对编程就非常感兴趣,想从事这个行业 等等。 或者说 你感觉 新能源汽车是以后非常明确的方向,而自动驾驶是新能源汽车的标配,所以想投身这个行业。 - -问题二: 首先要自信起来,说:在技术方面和对编程的热情方面,我不比科班同学差,因为大学里教的内容和企业要求的基本脱钩的,大家准备面试进大厂都是靠自学,**反而因为我是非科班,我更加的努力,也特别珍惜来之不易的机会**。 - -如果要说科班同学有什么优势的话,我感觉他们的学习编程的氛围会好好一些,也就是遇到问题大家能一起交流,因为我车辆工程专业,所以我会经常去蹭计算机的课,也会去认识很多计算机专业的同学和他们一起讨论问题。 - -总之在HR面的时候,不要说自己哪里的缺点,也不说自己哪里技术掌握的不好,**HR不懂技术,你说自己哪里不懂,他就真认为你不懂了**。 - -缺点就说一些不痛不痒的,甚至化缺点为自己的优势。 - -例如问你的缺点是什么? - -**可以说自己有时候 对技术细节过于执着,以至于影响整体的进度**。 - -这种缺点 无形之中 就体现出自己 对技术的热爱和专研 (起到装逼于无形的效果),而且 这种缺点 是分分钟就可以改的。 - -如果问你 :作为非科班生在工作中的挑战? - -你也这么说:其实大家都是靠自学,如果说非科班在工作中遇到的挑战,我相信 科班同学在工作中也是遇到一样的挑战,工作之后自学能力更加重要,互联网变化是飞快的,只有自学能力强的同学才能跟上步伐。 - -然后随便举例一下,说明自己自学能力如何如何的强,就可以了。 - -**总之不能示弱,不能说自己哪里不好,哪里不行!** - -HR也不懂技术,主要就是看你的态度。 - -就酱,希望对录友们有所启发,加油💪 - diff --git a/problems/知识星球精选/HR面注意事项.md b/problems/知识星球精选/HR面注意事项.md deleted file mode 100644 index 5dba672c..00000000 --- a/problems/知识星球精选/HR面注意事项.md +++ /dev/null @@ -1,89 +0,0 @@ -

- - - - - -# HR面注意事项 - -[知识星球](https://programmercarl.com/other/kstar.html)里已经有一些录友开始准备HR面。 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210807155107.png) - -甚至星球里已经有录友拿到百度提前批的offer - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210808102821.png) - -看到一些录友面试这么顺利还是非常开心的,同时我也在知识星球里分享了HR面最容易遇到的 问题,已经应该如何回答。 - -相信公众号里不少录友也会遇到同样的问题,所以就给大家再分享一下。 - -HR面的话,如果不犯重大问题,一般不会刷人。 - -但有些同学也会犯重大问题,这样丢了offer,可就太可惜了。 - -**HR的职责是选择符合公司文化价值观的员工**,那么说到文化价值观,大家可能感觉 这虚无缥缈的,怎么能证明自己符合文化价值观呢。 - -其实HR主要从如下几个问题来考察,大家只要把这几个问题想清楚,就差不多了。 - - -## 为什么选择我们公司? - -这个大家一定要有所准备,不能被问到了之后一脸茫然,然后说 “就是想找个工作”,那基本就没戏了 - -要从**技术氛围,职业发展,公司潜力**等等方面来说自己为什么选择这家公司。 - -要表现自己如何如何看好这家公司,期待和这家公司一起成长。 - -## 有没有职业规划? - -一般应届生都没有明确的职业规划,不过当HR问起来的时候,不要说 自己想工作几年想做项目经理,工作几年想做产品经理,甚至想当leader带团队,这样会被HR认为 职业规划不清晰,尽量从技术的角度规划自己。 - -这个策略同样适用于社招。 - -虽然大部分程序员的终极目标都想做leader,或者做管理,(极少数想要写一辈子代码的大牛除外,不过国内环境对这种大牛并不友好) - -大家都想做战略做规划,那比写代码有意思,有成就感多了。 - -但不要说出来,一定要围绕技术这块来规划,根据你的岗位,**一年 技术达到什么程度,三年在某个技术领域有深入研究,五年成为技术专家之类的**等等。 - -这块其实我和HR朋友还真的讨论过,我说:就大厂,百分之九十五以上的程序员都不想写代码,以后指定是想转产品或者升leader做项目管理, 但你为什么还要问这么 无聊的问题呢。 - -HR朋友的回答是:你不说真相,我会认为你可能对技术有追求,但如果你说出真相,那么明确你对技术没有追求。 - -所以,即使你有其他想法,在职业规划HR面的时候,**也要仅仅围绕技术,树立自己要深耕技术的形象**。 - -## 是否接受加班? - -虽然大家都不喜欢加班,但是这个问题,我还是建议如果手头没有offer的话,大家尽量选择接受了吧 - -就说:自己可以介绍 XX程度的加班。 - -如果确实身体不适,那就直接拒绝,毕竟健康是第一位。 - -## 坚持最长的一件事情是什么? - -这个问题,大家最好之前就想好,有一些同学可能印象里自己没有坚持很长的事情,也没有好好想过这个问题,在HR面的时候被问到的时候,一脸茫然,不知道该说啥。 - -憋了半天说出一个不痛不痒的事情。这就是一个减分项了! - -问这个问题主要是考察大家的韧性,会不会做一个件事遇到困难就中途放弃了。 - -星球里的录友可以说自己坚持每日打卡总结,这也是可以的,毕竟这种需要自己克制才能做到的事情。 - -## 如果校招,直接会问:期望薪资XXX是否接受? - -这里大家如果感觉自己表现的很好 给面试官留下的很好的印象,**可以在这里争取 special offer** - -这都是可以的,但是要真的对自己信心十足。 - -## 如果社招,则会了解前一家目前公司薪水多少 ? - -**这里大家切记不要虚报工资,因为入职前是要查流水的,也就是要把上一件公司的银行流水截图报上来,这个是比较严肃的问题。** - - -好了,说了这么多,希望对大家有所帮助。 - ---------------- - -加入「代码随想录」知识星球,[点击这里](https://programmercarl.com/other/kstar.html) diff --git a/problems/知识星球精选/offer对比-决赛圈.md b/problems/知识星球精选/offer对比-决赛圈.md deleted file mode 100644 index 081ae5ec..00000000 --- a/problems/知识星球精选/offer对比-决赛圈.md +++ /dev/null @@ -1,87 +0,0 @@ -

- - - - -# offer选择进入决赛圈.md - -秋招已经结束了,该开奖的差不多都陆续开奖了,很多录友的也进入了offer决赛圈。 - -我每天都在[知识星球](https://programmercarl.com/other/kstar.html)里,回答十几个offer对比的问题,我也是结合自己过来人的经验给大家做做分析,我也选几个案例,在公众号上也给大家分享一下,希望对大家有所启发。 - -以下是知识星球里的部分问答: - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211031113844.png) - -C++后端开发 总包40w,这个薪资和岗位很不错了,至于干的活杂不杂 都不是你能打听出来的,要进去,看具体工作,以及领导的具体安排,只有亲自去感受了,才知道是不是打杂。 - -深信服 云计算 大多数是做toB的业务,做私有云,几乎是和硬件设备一起卖,和阿里云,腾讯云,这些公有云厂商不是一个概念的。 - -深信服也不错,但不用奔着云计算这个壳子就去冲 深信服,进去干的活未必和云计算有多关系,而且去深信服 你就能保证不打杂了么? 对吧 - -所以 具体工作内容是 我们控制不了的,知道个大概方向就可以了。 - -去百度吧,挺好的。 - -------------- - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211031105039.png) - -普渡科技 是是一家C轮创业公司,一般创业公司 双休的可能性不太大。而且 看两家给你的薪资,如果算上公积金的话,到手的钱没有百度开的高。 - -应届生去创业公司,有一点吃亏,就是你刚进去,因为你还不能干活,有明显的产出,或者能力有限,并不会给你 期权甚至股份,可能股份兑现不了,但表示的是对候选人的重视程度。 - -创业公司研发流程还不够规范,所谓的野蛮成长 就是没有流程。 **关键是能成长起来 万事大吉,就怕长不起来**。 - -百度虽然是测开的岗位,但薪资开得挺高了,可以看出对你的重视,飞桨深度学习平台部,也很不错,是百度重点打造的深度学习框架。 - -我倾向于选百度,虽然是测开,但进去依然可以学很多东西。 这样稳一些。 - -当然如果你想赌一把,可以去普渡科技,谁也说不好,万一后面起飞了呢。 - ----------- - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211031111110.png) - -双非本,还是电子信息类专业,能拿到这些offer,真的很不容易了👍 - -如果喜欢搞硬件,嵌入式应用方向其实也挺宽的,需求面也很广,华为 中兴,还有一堆手机厂商 新能源车企,智能家居,涉及到物联网的行业,都需要嵌入式开发。 - -中新赛克 也是上市公司,其实和 海康威视 大华股份 都差不多,这几家给薪资都差不多,一样的薪资,你在南京可比在杭州舒服多了啊,而且你家也在南京。 - -如果要真的是去大厂学技术,或者工资特别高,背井离乡也是可以的,但 海康威视 大华股份 估计也没有达到这个程度,薪资也没高出来,甚至可能不如 中新赛克 ,你还有 中新赛克给你的签字费呢。 - -综上,我倾向于 去 中新赛克,在老家,这个薪资不挺舒服的么,南京也很不错。 好好干吧💪 - -------------- - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211031110153.png) - -腾讯 这个部门有点边缘,技术栈比较浅。企业IT部就是做 企业内部应用的,最多也就是 几万人使用吧,大概率也没有机会磨练技术。系统很成熟,当然不加班。 - -百度推荐架构部,还是挺核心的,技术能力 还是比较强的。 **在上海应届生可以落户了,比深圳户口香太多太多了**。 - -至于晋升,百度晋升 一点也不慢,顺利的话,T3 到 T6 可以三年,一般情况是4年, T6跳 腾讯可以对应的是3-1 或者 3-2级别了。 - -至于光环,对个人来说,百度工程师在业内是很受认可的,一点不比腾讯差, 很多人说:拼多多啊,京东啊 市值都超过百度了,百度不是第一梯队了,等等。 - -说实话,**那公司的市值和我们这些码农有关系么**,对吧,**我们对关心的是 自己技术的成长,自己值多少钱,而不是公司值多少钱**。 - -至于薪资,相对于岗位,一年差6w,不算多,倾向于选百度。 - -------------- - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211031105736.png) - -去字节吧, 云存储方向 这个方向值得深耕, 是一个技术驱动的方向,而且各大厂商 都搞分布式存储,就业机会挺多的,再说 字节给的薪资也不错。 - -如果以后想离家近,你可以跳槽 腾讯云 继续做分布式存储,薪资还能涨一波。 - -如果对技术有追求的话,整个技术生涯都是可以认准云存储方向。存储是刚需! - -你可别在准备春招了,这大厂offer 都不要,准备啥 春招啊,哈哈哈,别卷了,休息吧。 - ----------- - -以上就是我在知识星球,针对录友们offer决赛圈的解答,希望对大家也有所帮助。 - diff --git a/problems/知识星球精选/offer总决赛,何去何从.md b/problems/知识星球精选/offer总决赛,何去何从.md deleted file mode 100644 index e22c5d4a..00000000 --- a/problems/知识星球精选/offer总决赛,何去何从.md +++ /dev/null @@ -1,88 +0,0 @@ - -

- - - - -# offer总决赛,何去何从! - -最近在[知识星球](https://programmercarl.com/other/kstar.html)上,给至少300位录友做了offer选择,准对大家的情况,结合我的经验做一做分析。 - -希望可以给大家带来不一样的分析视角,帮大家少走弯路。 - -以下是我在知识星球里分析的部分案例,公众号上再给大家分享一波。 - ------------ - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211108102416.png) - -1. C++ 后端,客户端,测开,指定选 C++后端啊,这是送分题。 -2. 转型的问题不好回答,各有各的出路,**就算大厂里,95%以上的程序员都不想写代码,就想指点江山**,但为什么大家都在写代码呢,因为出路没有固定的公式,没有固定的方法,很多人完美转型看的是运气,看时机,也看努力,**但最重要的是运气和时机**。 最不缺的就是努力的人,其实大家都挺努力的。 -3. 不会的,大厂里也没有一家语言独大,这种担心没必要。 -4. 不同公司处理情况不一样,甚至每年都会变,大部分都不会黑名单,你这几家都不会。 -5. 你的担心有点过头了,既然你拿到的offer就要对自己有信心,你也不是走后门拿到的offer,对自己能力这么没信心么,进去之后好好干就好了。剩下的交给缘分。 计划的在周密都没有变化快。 -6. 你问的太全面了[捂脸],我都没想到 拿到大厂offer,能但担心出来 这么多事情。已经很周密了👍 - -最后 倾向于你去阿里云吧,这么好的的机会 有啥犹豫的。 - - ------------------ - - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211108103414.png) - -我感觉你不用不甘心大白菜,其实挺好的,客观来看 非科班转码 拿腾信后端开发的 offer 挺不错的。 - -虾皮在公司影响力上 和 腾讯不是一个数量级的。 - -跳槽虽然看base,但也看公司的,腾讯光环加持 比 虾皮可有力多了。 - -腾讯的总包是有点虚(花样有点多),但第一年到 43w了 挺不错的,腾讯好好干,升到高级工程师,在外年很值钱的。 现在这点钱也不算啥。**而且现在应届生薪资真的挺高的,不用在去追高,容易摔到的**。 - -我建议你直接去腾讯就好, 这个选择题 其实挺好选的。 - -------------- - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211108103835.png) - -广州没有百度吧,可以活水到深圳百度,工位很宽敞,比北京工位舒服多了。 - -我倾向于选百度吧,而且百度的岗位也不错,薪资也比 虎牙高(虎牙的股票价值不好说),**虎牙你听说是 965 但未必是 965,可能你已入职项目就忙起来了,瞬间996,这个工作强度都不是永恒的,都是跟着项目走**。 - -广州可选择的互联网公司不错的,你去广州虎牙,一旦离职 其实不太好选下一家。 - -百度 试用期不过,这个感觉有点谣言,哪家大厂都有试用期不过的,不过这个看项目组,整体来说 基本试用期都能过,问题不大。 - -虾皮还在抽盲盒,就不考虑了。 - -去百度吧,好好锻炼几年,然后再找机会 回南方。或者transfer 深圳 也不错。 - ------------- - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211108104558.png) - -1. 公积金可以提出来 80%,包括自己交的和公司交的,还是挺方便的,现在支付宝可以一键提取。剩下的等你买房之后 可以全部提取。 - -2. 如果先去腾讯的话,你去 字节 做客户端更合适一些,而且你还是做 游戏直播的客户端,和腾讯互娱还是很匹配的。 - -至于研究生做客户端亏了 的问题,其实 95% 的研究生 基本都是做研发,后端或者客户端。 - -确实很多人感觉 读个研究生不做算法,不搞AI,和本科生没啥区别,**但事实是 搞算法 搞AI 可能都找不到工作了,那么就没有必要有这个执念**。 - -你现在能拿到 字节offer,也有你是研究生的加持 ,虽然 学历不等于能力,但 人多而卷,用学历晒人是最高效的方式。 - ------------- - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211108104735.png) - - -1. 一般来说管培计划,都是培养企业未来高管的,是很不错的,不同原员工干到高管多难,**但如果参加管培计划,那就不一样的,资源 和 机会 要不正常员工 多很多**, 从 去哪给你的薪资和签字费就能看出来。 不过去哪网的管培其实我不了解,我只是说一说普遍管培的情况。 - -2. 小米有很多东西可以学习? 这个其实 你现在是应届生,去哪家公司 都有很多东西可以学习,这个看具体内容了。 -3. 我感觉不用了吧,这offer也不错啊,当然如果还有激情,再战也可以的。毕竟没啥损失,不过感觉可以休息了,躺平吧。 - -建议再去详细了解一下 去哪网管培计划 的具体内容,因为不同公司 管培计划不太一样,你是 技术岗管培 还是其他方向管培。 - - -以上就是我在知识星球,针对录友们offer决赛圈的解答,希望对大家也有所帮助。 - diff --git a/problems/知识星球精选/offer的选择.md b/problems/知识星球精选/offer的选择.md deleted file mode 100644 index 106bc5f8..00000000 --- a/problems/知识星球精选/offer的选择.md +++ /dev/null @@ -1,137 +0,0 @@ - -

- - - - -# offer的选择 - -秋招基本要结束了,一些录友也拿到了一些offer,如果是拿到大厂和小厂的offer,那当然就不用纠结了,直接选大厂。 - -不过大部分同学应该拿到的是 两个大厂offer,或者说拿到两个小厂offer,还要考虑岗位,业务,公司前景,那么就要纠结如何选择了。 - -在[知识星球](https://programmercarl.com/other/kstar.html)里,我已经给很多录友提供了选择offer的建议,这里也分享出来,希望对大家在选择offer上有所启发。 - -## 保研与工作 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211005233504.png) - -1. 建议你直接工作,你都已经拿到了大厂offer,没有必要读研究生了,如果你是保研到 985高校,倒是可以考虑考虑。 -2. 这是送分题,去百度吧,贴吧不算边缘,而且百度对新人的培养体系是很到位了,及时是边缘,对你技术成长也很有帮助,而且还有大厂光环。 - -3. 星球里 前端同学也很多啊,只不过你没注意到而已,我经常看到。而且前端和后端都是一样的,不能说没地位,不过不同的部门不太一样而已。(大家都是打工的,不用搞出鄙视链哈哈) -4. 躺平吧,可以歇息了,给还没拿offer的录友一条出路 - - -## 阿里云与微众 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211005233646.png) - -中间件一点都不吭啊。 - -有云的地方,有分布式的地方,就有中间件,应用面很广泛,各大厂哪个能离开云计算,哪个能离开分布式,你就知道中间件有多重要了。当然中间件也是很大的一个领域了,是基础架构范畴。 - -关于业务部门和基础架构部门的选择,**我也倾向于 应届生选择基础架构部, 业务部门很忙没有时间沉底技术**。 - -其实你还要考虑,以后跳槽出来如何,在微众做基础架构,以后 跳槽可能更容易一些。注意跳槽不一定是你主动的,可能是被动跳槽。 - -假如阿里给你来个3.25 你就要找下家了,做 供应链管理 技术上没有太精进的话,找下家不太容易。 - -关于两个公司,我感觉差不多,微众也很不错,一般给出的薪资都比较高。 - -至于买房,杭州现在的房价涨的很猛,虽然说整体没有深圳高,但也差不多了,码农聚集地,就别想着房价多便宜。 - -互联网金融 这块后面发展一定是大势所趋的,不会差。 - -两个offer都不错,选哪个都可以! - -对技术有追求,我倾向于微众,如果对BAT有执念,就去阿里吧。 都差不多。 - -## 深信服、小米和海康 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211006094624.png) - -音视频开发现在很火,是一个很好的方向,音视频里也是一个很大的方向了,里面有 音视频信号分析与处理、音视频编解码格式压缩、音视频文件打包封装、流媒体推流协议处理等等。 - -现在 腾讯会议,阿里钉钉,zoom都是靠音视频技术起家。 而且发展势头很不错。 - -但如果只是基于现有音视频做 SDK开发,那就没啥意思了。所以也是看具体的工作内容了。 - -股票这个 不用报太大期望,大概率 你等不到那个时候。 - -其实 深信服的技术栈 也挺封闭的,毕竟是算是比较偏硬的厂商,深信服做云计算,也是私有云,最终也是卖硬件。 - -不过小米其实你也说不好最终入职具体是干啥。 - -选一个的话,倾向于选深信服吧,毕竟深信服总部就在深圳,同事多,大家有个交流,相对来说发展稳定一些。小米 好像最近 深圳才有部门吧,估计应该没多少人,甚至入职之后 可能你单兵作战,和同事没有交流的话,无论是工作还是成长都比较难。 - -海康更硬一些,是做安防的,所以C++服务器开发基本是服务安防设备。 相对来说,选深信服更好一些,毕竟深信服是做网络安全和云计算的。 - -## 奇安信、顺网科技和东方财富 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211005234238.png) - -这两家公司我也不太了解。 我就从业务上 简单分析一下 - -现在很多公司做私有云都有用OpenStack,你针对OpenStack 做二次开发,估计不太用深入理解OpenStack,但如何你能沉下心来学下去,以后跳槽的话 出路还是比较多的。 **就要看你对技术有没有钻劲了**。 - -东方财富 毕竟不是互联网公司,**主要业务也不是技术驱动,可能技术部门话语权还是挺低的**,大概率 可能是日常后台增删改查处理一些信息,(注意这也是我猜的,真实情况也要亲自体验了才知道) - -综上,我感觉 如果对技术热情一般,可以考虑东方财富(毕竟给的钱多), 如果想以后技术立身,考虑奇安信。 - - -## 字节客户端、度小满后端 -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211005234515.png) - -你这拿到这么多大厂offer,还说自己菜,凡尔赛石锤了,哈哈哈 - -客户端确实在劝退,但 客户端不会消失,现在客户端都在往大前端方向去转,**如果你很喜欢字节,喜欢 抖音的话,可以考虑去抖音做IOS**。但如果你一直做IOS的话,指定是发展不容乐观,入职之后就要考虑自己的下一步方向。 - -度小满后端支付业务 这个其实也不错,支付业务是核心部门,以后跳 微信支付,跳蚂蚁 都是可以的,每个互联网巨头都要做自己的支付。 - -这两个offer都可以。 - -如果非要选一个的话,我倾向于 选度小满后端支付业务吧。 以后 跳槽 选择更多一些。可以 通过社招 再去BAT,这时候自己的方向也比较稳定。缺点:不是大厂 - -如果对字节有情节,去也可以的,大厂福利待遇都不错,缺点:要考虑自己以后的方向。 - - -## 百度和华为 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211006095816.png) - -针对于你的问题,我挨个说一下哈: - -1. 大华是做安防的,和主流互联网偏了一些。 -2. 成都有没有招人的机会,这个我也确定不了,但可以确定的是,第一份工作确实很重要!对以后的发展还是有很大影响的。 不过和 女朋友异地 如何权衡还是要看你自己。 -3. 百度大数据 也有做toB,就是给企业提供服务,做toB是比较辛苦,而且赚的不多(这里指的是部门营收),不过相对于你的其他几个offer,我倾向于你选百度,百度对应届生的培养还是很到位的。对你以后的技术发展有帮助。 而且大数据做tob的不止百度一家,阿里云,腾讯云,等等很多都做大数据toB,以后跳槽也容易。 -4. 这种情况有没有救,我也不清楚了,大概率是不太行了,不用过于纠结,能抓住目前的机会就很好了。 - - -## 大华和小米 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211005234847.png) - -倾向于选小米吧,大华是做安防的,**在安防公司里做客户端,可以说是偏上加偏了**。 - -关于 小米南京工资 我也不了解,不过一般来说 南京工资都会低一些。 - -小米手机部门,以后你的选择 也会多一些,毕竟国内这么多手机厂商,而且小米的发展势头还是可以的,最近小米在发力小米汽车,如果能内部转岗到小米汽车,就很不错了,这是未来十年的一个重大机会,可以跟着雷总起飞。 - -在看以后定居,南京的房价可比杭州亲民多了,南京也就2w一平左右,以后你在南京定居基本压力不大,如果算上房价,杭州大华多出来的那点工资 简直不值一提了。 - -# 总结 - -最后我也只是针对大家给我的情况,我来做一个基本的分析,给出我的判断。 - -毕竟最了解你的,还是你自己,而且入职之后 工作具体内容,部门发展,其实我们都无法预测,只能结合我们能确定的内容来做分析。 - -拿我自己来举例,我当初毕业拿到是腾讯互娱XX工作室的后端开发offer 和 华为2012 数据库部门的offer,当然还有其他offer就不提了,那么当时问身边朋友前辈,一定是选 腾讯了,我也倾向于腾讯,但这么多年过后 反过来看,我感觉当初如果去华为可能更好一些。 - -具体原因我也会在知识星球里做分享。 - -所以 **在选择offer上,是有很多是未知的,再好的部门也有坑,再差的部门 遇到好领导也会很舒服**。 - -**我们只能把握住 目前能把握的,至于后面怎么样,只有经历了才知道**。 - -录友们在选择offer上,也多和问一问身边的同学,前辈们,多方面接受建议,在结合自己的情况做出判断,也希望录友们都有一个好的发展,加油💪 - diff --git a/problems/知识星球精选/不一样的七夕.md b/problems/知识星球精选/不一样的七夕.md deleted file mode 100644 index 40d15ecd..00000000 --- a/problems/知识星球精选/不一样的七夕.md +++ /dev/null @@ -1,73 +0,0 @@ -

- - - - -# 特殊的七夕 - -昨天在[知识星球](https://programmercarl.com/other/kstar.html)发了一个状态: - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210815084126.png) - -我还以为 过节嘛,录友们应该不会打卡了,但还依旧阻挡不辽录友打卡学习的步伐,来瞅瞅: - - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210815100028.png) - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210815100109.png) - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210815100212.png) - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210815095902.png) - - -当然了,我截图了一小部分,星球里每天的信息量都非常大。 - -如果说一个人坚持每天总结记笔记,**其实是很容易放弃的,今天不记,明天不急,后天不整理感觉也无所谓**。 - -这样时间就一点一点的被浪费掉了。 - -**因为我们学过的东西都会忘,不及时整理,时间就不能沉淀下来**,这就造成了一边学,一边忘,最后感觉自己好像也没学啥的感觉! - -所以每天记笔记,及时整理,是非常重要的。 - -这个习惯其实靠自己约束很容易放弃,但一群人一起坚持,就会不一样,大家相互监督,每天不总结记录点什么就会感觉少了点啥。 - -而且,大家每天的总结,我都会看,有问题 我都及时指出来,这样也防止自己学着学着学跑偏了。 - -昨天我也在[知识星球](https://mp.weixin.qq.com/s/X1XCH-KevURi3LnakJsCkA)回答了几位录友的问题,其中有两个问题 还是比较典型的,估计公众号里的录友也会遇到这样的疑惑。 - -所以也给大家说一说: - -## 准备的太晚了,想放弃秋招,直接准备春招 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210815091442.png) - -很多准备今年秋招的录友感觉自己还没准备好,想先找实习,或者 自己在学习学习,然后直接春招。 - -其实不到万不得已,我还是建议要冲刺秋招。 - -如果说,因为没准备好,提前批放弃还是可以的,但秋招不能也直接放弃了! - -秋招没找到好工作,一般11月份左右,一些大厂还会有补招,腾讯就经常补招,实在不行再准备春招,春招可能国企单位会多一些。 - -**而且面试也很看缘分,永远没有真正准备好的时候,知识一直都学不完**,所以 把秋招当做最后的机会,就算秋招没找到,也可以在冲春招,而不是 直接放弃秋招。 - -还有就心态方面来说,直接放弃秋招,等 今年 10月份,身边同学都找到工作了,天天吃喝玩乐,见面打招呼就问:你去哪了,你签哪了。那时候 自己心里压力会非常大,甚至会影响 春招找工作。 - - -## HR/面试官问你手上有没有其他offer,如何回答 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210815091819.png) - -这个问题,无论是校招还是社招,大家都会遇到。 - -如果大家手上有其他更好的offer,或者说同等水平公司的offer,可以说一说,这样凸显出自己的优势,即:你们不要我,有更好的公司要我, 这样给面试官或者HR点压力,可以争取到更高的薪酬。 - -如果没有更好的offer,可以说没有,然后解释:只认准贵公司,从技术氛围,职业发展,公司前景,来说贵司多么多么的好,我多么渴望和贵司一起成长之类的。**总之,就是捧起来,显得自己很专一**。 - -都是套路,哈哈哈哈。 - -**好了,说了这么多,希望对大家有所帮助**。 - - diff --git a/problems/知识星球精选/不喜欢写代码怎么办.md b/problems/知识星球精选/不喜欢写代码怎么办.md deleted file mode 100644 index 84d372f0..00000000 --- a/problems/知识星球精选/不喜欢写代码怎么办.md +++ /dev/null @@ -1,45 +0,0 @@ - -# 看到代码就抵触!怎么办? - -最近在[知识星球](https://programmercarl.com/other/kstar.html)里,看到了不少录友,其实是不喜欢写代码,看到 哪些八股文都是很抵触的。 - -其实是一个普遍现象,我在星球里分享了一下,我对这一情况的一些想法。 - -发表在星球里,很快就有了60多个赞,也确实说道大家的心里去了。 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211019222938.png) - -我在这里再给公众号的录友们也分享一下: - -很多同学不喜欢计算机,也不喜欢写代码,看到各种大堆的面经 八股文,心里是十分抗拒的。 - -所以总是拿一些其他的事情来拖延,最后发现秋招或者春招 完全拖过去了,或者说等求职的时候发现自己完全没有达到应聘的水平,再陷入 深深的焦虑之中。 - -这里有一个很重要的问题,就是**当你发现你不喜欢计算机的时候,那问问自己喜欢什么呢?** - -如果喜欢看电影,逛街,打游戏,甚至格调再高一点 喜欢画画,喜欢音乐,唱歌之类的,这些爱好如果没有达到专业的程度,那么仅仅是日常消遣而已。(甚至是一种逃避) - -**真实情况是大部分人都说不出来自己真正喜欢什么的**。 - -这是中国教育制度的问题,大家从小学、初中、高中、到大学再到工作 就没有时间或者机会去思考自己真正想干什么。 - -别说在校学生了,就互联网大厂的程序员,我敢说 百分之九十以上 都不喜欢写代码,都感觉写代码是最苦逼的,天天对着屏幕,写写一堆正常人看不懂的英文单词,有啥意思,对吧。 - -但为什么大家都依旧写代码呢。 - -**要生活啊,要赚钱啊!** - -那种可以不考虑经济问题,一言不合就寻找人生意义的选手,都是家里有矿的,那种咱们不讨论。 - -还一些同学迷茫的时候,就放空自己。 还有已经工作的,可能会去一趟西藏,“寻找一下生命的意义”。 - -其实我也是不建议的,**放空自己之后,并不会找到 自己真正的方向,只会更迷茫!** - -所以,**当你不知道自己真正喜欢什么的时候,就先把眼前的事情做好吧!** - -如果你知道自己不喜欢计算机,不喜欢写代码,但也不知道自己究竟喜欢什么的时候,那么就先把自己现在该做的事情做好,制定计划,算法题刷题起来,八股文看起来。 - -**这才是是最重要的**。 - -希望对录友们有所启发,加油💪 - diff --git a/problems/知识星球精选/不少录友想放弃秋招.md b/problems/知识星球精选/不少录友想放弃秋招.md deleted file mode 100644 index 81c99503..00000000 --- a/problems/知识星球精选/不少录友想放弃秋招.md +++ /dev/null @@ -1,81 +0,0 @@ -

- - - - -# 不少录友想放弃秋招了..... - -马上就要九月份了,互联网大厂的秋招的序幕早已拉开。 - -发现[知识星球](https://programmercarl.com/other/kstar.html)里有一部分录友想放弃秋招,直接准备明年的春招,估计关注公众号的录友也有不少有这种想法的。 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210813103515.png) - -一般有这种想法的录友都是 **之前没有准备好,或者是总感觉时间赶趟赶趟,然后突然间 发现时间不赶趟了。。。** - -也有一些感觉自己没有实习经历,简历上也没什么好写,想下半年去找一找实习,不去秋招,然后直接准备春招。 - -**对于这种情况,我的建议依然要冲刺秋招!** - -# 把秋招当做最后的机会 - -**等到春招的时候,可以选岗位已经很少了,各个大厂几乎都招满了**。 - -而且就算秋招没找到好工作,一般 11月份左右,一些大厂还会有补招,腾讯就经常补招。 - -补招的情况是就是腾讯发出了 offer,有的候选人 选择违约,不来了,那么腾讯就需要补招,把人数凑齐。 - -可能有录友想,谁居然连腾讯的offer都拒绝呢? - -其实挺多的,例如:有其他大厂的核心部门offer,父母给安排了 国企、央企 的核心岗位,或者有的选择 读博了之类的,导师毕业能给安排留校 或者去其他高校任教。 - -所以几乎每年,腾讯都要补招,其他大厂也会有补招,一般是11月份,所以就算秋招没拿到大厂offer,依然有机会! - -话再说回来,面试其实也很看缘分,**永远没有真正准备好的时候,知识一直都学不完**。 - -所以 **把秋招当做最后的机会,就算秋招没找到,也可以在冲春招,而不是 直接放弃秋招**。 - - -# 放弃秋招,对心态的影响 - -如果直接放弃秋招,等 今年 10月份,身边同学都找到工作了,那时候的场面就是歌舞升平,大家天天吃喝玩乐。 - -见面打会招呼就问:你去哪了,你签哪了? - -那时候如果自己还没有面试,还在准备面试,此时自己心里阴影面积有多大,甚至会影响春招找工作。 - -# 面试要趁早准备 - -每年这时候,都会有同学后悔,我怎么就没早点准备,就感觉时间不够用。 - -所以也给明年找工作的录友们(2023届)提一个醒,现在就要系统性的准备起来了,因为明年春季实习招聘 是一个很好的进大厂的机会,剩下的时间也不是很多了。 - -来看看[知识星球](https://programmercarl.com/other/kstar.html)里,一位准大三的录友准备的情况 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/星球大三.jpg) - -再来看看一位准大二的录友准备情况 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/星球大二.jpg) - -**我已经预感到 这两位 等到秋招的时候就是稳稳的offer收割机**。 - -[知识星球](https://programmercarl.com/other/kstar.html)还有很多已经开始提前准备,或者看了 星球发文状态就开始着手准备的录友了。 - - -所以 **所谓的大牛,都是 很早就规划自己要学的东西,很早就开始向过来人请教应该如何找工作,很早就知道自己应该学哪些技术,看哪些书, 这样等到找工作的时候,才是剑锋出鞘的时候**。 - -我们远远还没有到拼智商的程度。 - -这里 也是给公众号里的录友们提一个醒,估计还有不少录友依然在感觉时间还赶趟,但 未来的卷王已经在路上了 哈哈哈。 - -**不过话说回来,现在互联网求职确实卷!** - -但这是社会问题,我们改变不了。 - -**卷的核心是,好的东西少,但要想的人多!** - -**如果你也想要,就要提前准备,提前规划,提前努力!** - -也希望录友们都能找到一个自己心仪的工作,加油💪。 - diff --git a/problems/知识星球精选/专业技能可以这么写.md b/problems/知识星球精选/专业技能可以这么写.md deleted file mode 100644 index a1b7ba3a..00000000 --- a/problems/知识星球精选/专业技能可以这么写.md +++ /dev/null @@ -1,69 +0,0 @@ -

- - - - - - -# 你简历里的「专业技能」写的够专业么? - - -其实我几乎每天都要看一些简历,有一些写的不错的,我都会在[知识星球](https://programmercarl.com/other/kstar.html)里分享一下。 -![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210626172902.png) - -这次呢,我再专门说一说简历中的【专业技能】这一栏应该怎么写。 - -很多同学【专业技能】这块写的很少,其实不是掌握的少,而是没有表达出来。 - -例如有的同学这么写: - - -![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210626173915.png) - ---------------------- - -![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210626173940.png) - --------------------- - -![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210626174018.png) - -------------------- - -![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210626174809.png) - - -这些【专业技能】都写的很少,其实是可以在丰富一些的。 - -我来给大家拓展一下、 - - -* 熟练C++,(列举C++的若干知识点),了解 Java,python,go (适当补充对这些语言的理解) -* 熟悉常见设计模式(例句一些设计模式) -* 熟悉linux操作系统vim开发环境,(列举网络编程相关知识,例如epoll,socket等等) -* 熟悉网络,(列举网络协议相关考点,tcp/ip,http, https, 三次,四次握手,流量控制等等) -* 数量掌握数据结构与算法(列举常用算法,最好搞透一个算法,说对该算法有独到见解) -* 数量使用Git,等版本控制 -* 以上为公共写法,下面可以在补充自己的其他领域的内容 - - -针对以上这个模板, 再来补充相关内容: - -1. 熟悉C/C++,熟练使用C的指针应用及内存管理,C++的封装继承多态,STL常用容器,C++11常用特性(智能指针等) ,了解 Python,Gtest等。 -2. 熟悉常用设计模式(单例模式,工厂模式等) -3. 熟悉Linux下vim开发环境,了解网络编程,IO多路复用,epoll等等。 -4. 熟悉OSI五层网络模型,熟悉TCP/IP,UDP,HTTP/HTTPS,DNS等网络协议,熟悉TCP三次握手,四次挥手,流量控制,拥塞控制等手段。 -5. 熟悉常用的数据结构(链表、栈、队列、二叉树等),熟练使用排序,贪心,动态规划等算法。 -6. 熟悉使用Git,vscode工具使用。 - -但需要注意的是,这里写的点,自己一定要熟练掌握,因为简历上写的,面试官一定会问。 - -这样有一个好处,就是 **缩小面试官的问题范围**, 只要简历上写的,你都准备好了,那么简历上的知识点面试官一定会问,这样你就掌握了主动权。 - -举一个例子,如果简历上直写:熟悉C++。其他都没介绍,那么面试官指定围绕C++漫天遍野的问起来了,你也猜不透面试官想问啥。 - -如果简历写熟悉C/C++,熟练使用C的指针应用及内存管理,C++的封装继承多态,STL常用容器,C++11常用特性(智能指针等)。那么面试官基本上只会问,内存管理,多态,STL和C++11的一些特性, **这样你就把面试官的问题都圈在可控范围内**,从而掌握主动权! - -这一点很重要,希望大家要有这个思路,去写自己的简历。 - - diff --git a/problems/知识星球精选/入职后担心代码能力跟不上.md b/problems/知识星球精选/入职后担心代码能力跟不上.md deleted file mode 100644 index 58b8c32c..00000000 --- a/problems/知识星球精选/入职后担心代码能力跟不上.md +++ /dev/null @@ -1,55 +0,0 @@ - -

- - - - -# 入职后担心代码能力跟不上 - -在[知识星球](https://programmercarl.com/other/kstar.html)上,很多录友已经担心自己去了公司工作以后,代码能力跟不上,会压力很大。 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211031202952.png) - -其实 星球里 也有很多 已经确定offer的录友,想在入职之前提升代码能力,或者说 如何可以更快的融入项目组。 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211031203944.png) - -这里我把应届生刚刚工作需要培养的能力都说一说,其实也适用于毕业一两年的录友。 - -## 代码能力 - -练习代码能力最直接的方式就是多写,最简单的是用你的语言写一个管理系统,甚至你每天刷刷题,也是可以的。 - -再直白一遍,不是有26种设计模式,你全都实现一遍,即锻炼 代码能力,还学习了设计模式,等入职之后多看项目代码,看看大家在设计上使用了那种设计模式,或者说哪里还可以优化。 - -设计模式可以说 面试中最实用的知识的,大部分面试内容,工作中其实都用不上,所以大家会发现面试造大炮,工作拧螺丝。 - -## 心态 - -工作之后 从心态上来说,要不怕困难,不怕bug,不怕未知技术。 - -很多同学之所以代码能力弱,**就是太怕 难点**,遇到点 困难 就想:恨不得谁告诉我应该怎么怎么办得了,而不是自己去解决问题。 - -要善于使用搜索引擎,如何所谓问题是一个技术活,有的问题你怎么搜都搜不出来答案,但有的同学一搜 就搜出来了。 - -为什么呢? - -这是遇到问题,提取关键词的能力,很多同学遇到问题,不知道用什么关键词去搜。 - -**还有要有一种 越挫越勇 的精神**,这样你后面 的困难就会越来越少,也会培养出一种自信。 - -写代码也需要自信,工作之后 经常 有一些比较难任务,有的 同学就不敢接,怕做不出来,有的同学就敢接,并不说这位同学技术上一定强,而是他有自信。 - -**这种自信都在是以往 解决各种问题,排查各种bug,练就出来的**。一旦拥有自信,那能量就是 摧枯拉朽,真正的逢山开路遇水搭桥。领导也喜欢这样的组员 - -## 快速成长 - -刚入职的时候,不要怕问问题,不要怕出错,不要怕不好意思。 - -因为你是新人,就算问简单的问题,大家不会嫌弃你,但 这个新人窗口期是很短的,如果 过了几个月 还问一些非常基础的问题,那么 可能职场上就不太好了。 - -所以要在新人窗口期,快速成长,我看过太多的应届生,入职的时候 都是畏头畏尾,然后 过了新人期,能力还没有提高,还问很基础的问题,这样 项目组也不会分给他 有难度的任务,他也就得不到锻炼,越得不到锻炼,就能力越没提升,就越没自信,就越接不到有难度的活,然后陷入死循环! - - -综上,算是从学校到职场的上的一个转变。 希望对大家有帮助。 - diff --git a/problems/知识星球精选/关于实习大家的疑问.md b/problems/知识星球精选/关于实习大家的疑问.md deleted file mode 100644 index 88de4436..00000000 --- a/problems/知识星球精选/关于实习大家的疑问.md +++ /dev/null @@ -1,87 +0,0 @@ -

- - - - -# 关于实习,大家可能有点迷茫! - -我在[知识星球](https://programmercarl.com/other/kstar.html)里回答了很多关于实习相关的问题,其实很多录友可能都有这么样的疑问,主要关于实习的问题有如下四点: - -* 秋招什么时候开始准备 -* 要不要准备实习 -* 实习是不是重要? -* 什么时候找实习最有帮助 -* 如何选择实习的offer - -下面都分别来说一说: - -## 秋招什么时候开始准备 - -![实习二](https://img-blog.csdnimg.cn/20210502145513517.png) - -**准备工作指定是越早越好的**。 - -准备的越早,在8,9月份就越淡定,每年校招很多同学都会对于准备找工作总感觉赶趟赶趟,结果到了8月份开始慌得一笔了。 - -正常校招8月份就开始提前批(各大企业提前抢优秀毕业生)了,有的企业甚至7月份就开始。 - -基本到了7月份可能就没有整块的时间静下心来准备找工作,那时候已经铺天盖地的各种招聘信息,甚至一些同学已经拿到了offer了。 - -所以准备找工作的内容以7月为终结点比较稳妥,七月份之后以复习为主,有个整体框架,定时复习补充补充,多和同学交流面试经验。 - -## 要不要准备实习 - -有的同学是3,4月份准备面实习,然后7、8月份就去企业实习了,**实习有利有弊**。 - -如果可以去一线互联网公司实习,而且岗位也合适,那当然要去,如果去不了也别难过,因为实习生大部分都是打杂,干的活甚至都写不到简历上。 - -也有一小部分的实习生能够真正做到项目。 - -如果没有去实习,就把基础好好补充一下,**基础打好,毕竟对于应届生基础最为重要**, 编程语言、数据结构算法、计算机网络、操作系统、数据库这些都是基础,规划好时间把这些内容学好。 - -**对于应届生来说,项目经历是锦上添花,不是决定性的**。 - -有实习经历(前提是实习工作内容是真正的做项目,不是打杂),那么面试的时候面试官可能对项目经历感兴趣,问基础的内容就比较少, 如果没有实习经历,就把基础内容巩固一下,校招是一样的。 - -## 实习是不是非常重要? - -![实习一](https://img-blog.csdnimg.cn/20210502114600147.png) - -**大厂的实习经历对秋招还是很有帮助的**。 - - -但也不绝对,实习的话会耽误三个月左右,如果没有转正,而且一直在打杂的话,再去找秋招工作,**那时候一些基础的内容就都忘光了,反而秋招很被动**。 - -现在当然也可以按照准备找实习的状态来要求自己,给自己点压力,毕竟找实习准备的知识和秋招准备的知识差不多。 - -也可以提前经历一下面试,培养一下面试感觉,数据库方面知识你比较短缺,可以通过大量看这方面的面经迅速补充一下(秋招之前还可以系统看一看)。 - -如果拿到了大厂的实习offer,就去吧,实习的时候心里要有个秤,如果工作是打杂,就要尽快自己抽时间看基础准备秋招。 - -**另外需要注意的是,有些公司投递过简历面试没通过是有记录的,所以投递要当心,不要感觉投简历没有成本**,我知道的例如阿里,你每次投简历都有记录,如果实习面试都挂了,秋招的时候面试官也会看当时实习面试的记录(会考虑当时实习面试的结果)。 - -## 什么时候找实习最有帮助 - -![在这里插入图片描述](https://img-blog.csdnimg.cn/20210502151249354.png) - -6月份那时候基本不招实习生了,找的话也是日常实习(没有转正,实习时间是比较长的,要六个月),如果不是暑期实习就直接准备秋招吧。 - -**只有应届的暑期实习才有转正的机会,因为企业这样安排也是为了提前发现优秀毕业生!** - -例如:今年暑期实习,只招明年毕业的应届生。 - - -## 如何选择实习的offer - -![在这里插入图片描述](https://img-blog.csdnimg.cn/20210502152023574.png) - -如果目标应该是C++后端开发,那客户端实习offer可以选择别去了。 或者 选一个实习时间最短的offer先去着,例如两个月之类的,这样既能体现一下工作流程,也别耽误太多时间(毕竟客户端开发不是你的目标)。 - -**实习也不是必要的,一要看实习的岗位,是不是你想要的工作,二是实习的内容是不是打杂**,一些实习岗位其实是在浪费时间,如果转正不了的话,秋招就特别被动了,耽误了复习基础的时间。 - -还有就是**秋招的时候,一定要找小公司先练手,然后在面大公司**。 - - -以上基本覆盖了大家对实习的各种疑惑,不过现在已经到了5月份,实习面试基本结束了,如果没有拿到实习offer,大家安心准备秋招吧,依然可以冲刺大厂! - - diff --git a/problems/知识星球精选/关于提前批的一些建议.md b/problems/知识星球精选/关于提前批的一些建议.md deleted file mode 100644 index 6a316bd2..00000000 --- a/problems/知识星球精选/关于提前批的一些建议.md +++ /dev/null @@ -1,72 +0,0 @@ -

- - - - -# 秋招和提前批都越来越提前了.... - -正在准备秋招的录友,可能都感受到了,现在的秋招越来越提前了.... - -以前提前批,都是 8月份,8月份中序左右,而不少大厂现在就已经提前批了。 - -不少录友在 公众号留言,和[知识星球](https://programmercarl.com/other/kstar.html)里,表示提前批来的还是有点快。 - -![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210618162214.png) - -还没有把刷题攻略刷完的录友,要尽快刷完,至少先刷一遍,了解相关题型。 - -星球里,也有一些录友感受到了提前批的突如其来。 - -![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210619190111.png) - -目前已经开始的提前批有 vivo, tp-link,京东,百度..... - -![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210619190022.png) - - -有的录友已经明显紧张起来了。 - -![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210619190354.png) - -其实这才刚刚开始,等 7月份 以后,又是铺天盖地的信息,大家更没心情静下心来看书了。 - - -# 关于提前批的一点小建议 - -**首先我们要知道为什么有提前批?** - -提前批不是大厂们呆着没事闲着多给我们一次面试机会,**而是提前抢优秀毕业生**,这一点大家一定要明确。 - - -了解了为什么有提前批,这样我们就有正确的心态面对它了。 - -如果没有准备好,或者自己定位因为不是 “优秀毕业生”,先不要碰提前提。 - -当然可以先面一些自己不想去的公司的提前批,用来练手。 - -至于对于自己心仪的公司,如果盲目参加提前批,首先会打乱自己的复习计划,和心态,然后就是提前批挂了后台都是有记录的。 - -只要是大厂的内部信息化做的比较完善,提前批挂了,是一定会记录的。 - -**那么提前批有没有影响呢?** - -很多招聘宣传的时候说,提前批挂了对秋招没影响,确实在一定程度上没影响,因为提前批挂了,依然可以投递秋招。 - -然后秋招面试的时候,面试官在不在意你的提前批成绩,就是另一回事了。 - -我之前内推了一些录友面试腾讯微信支付的部门,面试官和我很熟悉,我最近还和他吃了饭,聊一聊我内推的同学,他说看后台记录有些同学都投过好几次了,他看了之前面试结果的评价之后,就直接pass了。 - -所以大家可能要想好一个回答,就是面试官可能问:你的提前批为什么挂了? - -而且提前批挂了,都是有当时面试官评语的,如果7月份提前批面试,面试官评价:这位候选人基础不行。 - -秋招的时候,面试官也不会相信,一两个月能把基础补上来了。 即使你的基础其实没问题,只不过恰巧面试中的几个问题没答好而已。 - - -对于技术能力确实强的同学,我建议全力以赴准备提前批面试,因为提前批要求就比较高,很容易谈sp offer。而且现在就拿到了大厂offer,比找实习还香。 - -如果没准备好的同学,建议不要让提前批打乱阵脚,有计划的巩固基础,准备秋招。或者先拿自己不想去的公司的提前批练手。 - - -好了,说了这么多,希望对录友们有所帮助,加油💪 - diff --git a/problems/知识星球精选/写简历的一些问题.md b/problems/知识星球精选/写简历的一些问题.md deleted file mode 100644 index 426eb2a6..00000000 --- a/problems/知识星球精选/写简历的一些问题.md +++ /dev/null @@ -1,100 +0,0 @@ -

- - - - -# 程序员应该这么写简历! - -自运营[知识星球](https://programmercarl.com/other/kstar.html)以来,我已经给星球里的录友们看了 一百多份简历,并准对大家简历上的问题都给出了对应的详细建议。 - -社招,校招,实习的都有,其实大家的简历看多了,发现有很多共性的问题,这里就和大家分享一下。 - -我的简历模板也分享出来了,大家在「代码随想录」后台回复:简历模板,就可以获取! - -# 简历布局 - -不少录友的简历布局就很不合理, 有的把专业技能放在最下面了,有的甚至把教育经历放下面了,建议简历布局的顺序是这样: - -* 教育工作经历 -* 专业技能 -* 项目经验 -* 荣誉奖项 -* 个人简述 - -# 教育工作经历 - -一些录友可能本科学历不是很好,然后 简历上直接不写自己的本科学校。 - -其实教育经历是最基本的,你不写 面试官也一定会问,问出来 那么感觉更不好,所以关于教育经历,大家是一定要写的。 - -写本科以后教育经历的就行了,一些录友可能是 高中就读了一些特别牛逼的高中,然后把高中也写出来了,哈哈哈,高中经历真的就不用写了。 - -还有一些社招的录友,研究生和本科之间空了几年,这几年 一定要说清楚做了些什么,甚至是“编一下”,因为这个面试官也会问的。 - -# 专业技能 - -一些录友简历上没有「专业技能」这一栏,或者写的很短。 - -可能是不知道该写啥,甚至就不写了。 - -通常「专业技能」是在 「教育工作经历」之后的,我这里给出一个模板,大家按照这个格式来写「专业技能」就可以。 - -1. 熟练使用 C++,掌握Go,了解 Java、Python、PHP 等编程语言 -2. 熟练使用 linux 下 vim、Git 开发环境 -3. 了解 Linux 下网络编程、TCP/IP 协议 -4. 掌握基础数据结构和算法的基本原理 -5. 英语六级:XXX - - -一些录友会列举自己主修的课程,列了一堆,其实凑篇幅 我是理解的,就是感觉简历太单薄的,列课程来凑。 - -但大家凑篇幅 尽力在「专业技能」和「项目经验」上凑篇幅,如果把 自己主修可能都列出来,会让面试官感觉没有什么干货。(有的同学甚至靠留白才凑篇幅,这就更不要了) - -当然应届生如果有一些课程自己成绩确实很好,可以和「教育经历」写在一起,简单并行列举一下就可以了。 - -# 项目经验 - -很多录友写项目经验就是流水账,这是什么项目,自己完成了功能1,2,3,4。堆了很多字。 - -要知道面试官是不了解你的项目的,面试也只有 一个小时左右的时间,如果堆了很多文字 面试官也懒得去读。 - -面试官最在意的是什么呢? - -**项目中有哪些技术难点,以及 你是如何克服的**。 - -这是面试官最关心的,也是最能体现出候选人技术深度的问题。 - -所以大家在描述项目经验的时候,一定要时刻想着,这个项目的难点究竟是什么,要反复问自己这个问题。 - -可能有的同学说了,我这项目本来就没有难点啊,就是1,2,3,4功能,然后 遇到不会的,百度搜一下,差不多就这样了。 - -**项目没有难点,也要自己“造难点”**。 因为这个问题是面试官必问的! - -所以一定要准备好。 - -还有不少录友的项目经历都写了 web server,使用线程池 + 非阻塞 socket + epoll(ET 和 LT) + 事件处理 (Reactor 和模拟 Proactor) 等等。 - -这个项目可能是很多准备后台开发的同学 首选的 项目。 - -这种自己搞的小项目,**最好把你的代码上传的github上,然后在简历中贴出github地址**,面试官一定会看的。 - -如果看你的代码写的确实不错,那指定是加分项。比简历上写的天花乱坠都强! - -还有的同学项目经历特别多,写了5,6个项目,每个项目都是概述了一下自己做了XXX。 - -其实面试官,基本就会和你深入聊 2个的项目左右,列举这么多项目没有用的,关键这些项目一看也是技术含量不大。 - -**所以不用单纯堆项目个数。项目经历 两个足够,把两个项目搞深搞透** - - -# 校园经历 - -一些录友会把自己学校工作列出一大堆,例如各种学生会啊,创新部门啊之类的。甚至有的会把自己的减肥经历也列举出来。 - -如果面技术岗位,这一块其实不是面试官关心的,可以在 最后一栏「个人简述」,简单一两句概括一下自己的学生会经历就好,表明自己沟通能力没问题。 - -关于标明自己有毅力,有恒心,不怕吃苦等等,都简单一句概括。 - - -好了,关于简历的问题,我就先分享这些,估计应该击中了不少录友的痛点了。 - diff --git a/problems/知识星球精选/初入大三选择考研VS工作.md b/problems/知识星球精选/初入大三选择考研VS工作.md deleted file mode 100644 index f602e9e9..00000000 --- a/problems/知识星球精选/初入大三选择考研VS工作.md +++ /dev/null @@ -1,49 +0,0 @@ - -

- - - - -# 初入大三,考研VS工作 - -9月份开学季,已过,一些录友也升入大三了,升入大三摆在自己面前最大的问题就是,考研还是找工作? - -在[知识星球](https://programmercarl.com/other/kstar.html)里就有录友问我这样一个问题, 其实每个人情况不一样,做出的选择也不一样,这里给大家分享一下,相信对你也会有启发。 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211002110618.png) - -以下是我的回答: - -首先我是考过研的,比较幸运一次就上岸了,这里说一下我的心得。 - -你才刚刚大三 就已经做了这么充分的准备了,那我倾向于 选择直接工作。 - -因为现在你准备的这些,都是找工作需要的,也都是实用的技术。 - -如果你明年初就开始准备考研了,那么你现在学的这些东西,就是半途而废了,考研一年 能让你的 编程技能水平 回到解放前(考过研的同学应该都懂的)。 - -不能说考研的内容一点用都没有,如果从技术学习的角度来说,其投入产出性价比极其极其极其的低。 - -举一个不太恰当的例子,考研就是大家一起学 “一个不太实用的知识”,看谁学的好。 - -所以考研其实更多的是学历上的提升,如果想通过考研,或者读研学习到什么? **还是不要有这个打算,大概率会让你失望的**。 - -正如你所说的,你有信心成为年级里比较优秀的(就业方面),也正是 准备的早,所以给了自己信心。 - -而且你们学校还有很多学长本科毕业就找到了好的工作,完全可以追随他们的足迹。 - -去考研的话,有信心考上更好的学校,当然可以,关键是 考研也是千军万马过独木桥,特别是计算机考研,特别是985名校,非常的卷。 - -如果没考上研究生,再去找工作就很被动了。 - -这也是为什么,很多一战失利都会选择二战,因为如果失败,损失很大,所以这条路还要继续走下去,一定要上岸。 - -再结合自己的情况,假如能考上,但考上了一所一般学校,其实对自己来说都是损失。 毕业之后 未必 有现在直接找工作找的好,年轻就是优势,特别是做研发,读研出来也是做研发,本科也是做研发,其实没太大区别的。 - -所以 如果本科毕业的学长学姐 就业也不错,可以追随他们的脚步,毕竟你已经开始准备了。 - -**如果有信心要冲 名校计算机研究生,或者说对某一所大学有情节,添补高考遗憾,那么可以冲,考上了是值得的**。 - - -当然也可以多和身边的 师兄 师姐交流,看看他们的说法,综合评估一下。 - diff --git a/problems/知识星球精选/刷题攻略要刷两遍.md b/problems/知识星球精选/刷题攻略要刷两遍.md deleted file mode 100644 index 285a5728..00000000 --- a/problems/知识星球精选/刷题攻略要刷两遍.md +++ /dev/null @@ -1,67 +0,0 @@ -

- - - - -# 代码随想录上的题目最好刷两遍以上 - -今天秋招可能要提前很多,往年9月份开始秋招,今天可能9月份就已经结束了,所以 正在准备秋招的录友,还是要抓紧时间了。。 - -星球里已经有录友的给出了关于秋招提前的信息 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210801104138.png) - -那么在正式秋招之前,大家在准备算法,代码随想录上的题目 应该刷几篇呢? - -**至少刷两遍,只刷一遍是不够的**。 - -只刷一遍基本就会忘,而且关键方法论理解的也不到位,对递归三部曲,回溯三部曲,动规五部曲,只掌握了简单招式,而没有理解真正精髓。 - -拿到最简单的反转链表来说,只做一遍,下次面试出现基本还是做不出来。 - -这也是星球里 录友们的 多么痛的领悟! - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210731183247.png) - -**等大家刷第二遍的时候,才能找到触类旁通的感觉!** - -第三遍基本就得心应手了。 - -在[「代码随想录」知识星球](https://programmercarl.com/other/kstar.html)中,我都是强调大家要至少刷两遍,有时间的话刷三遍, - -可以看看星球里录友们的打卡: - -![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210701122522.png) - -![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210701122422.png) - -![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210701122313.png) - -有的录友已经开始三刷: - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210727234031.png) - - -我为什么鼓励大家有时间的话,多刷几遍呢,首先这里的题目都是经典题目,而且在面试汇总也是频频出现, - -下面也是星球里的录友总结的面经: - -![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210701121136.png) - -![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210723125816.png) - - -## 那么已有的题目刷完了,可以刷些什么呢? - -我在Github上也做了一些题目的补充,在[上榜之后,都有哪些变化?](https://mp.weixin.qq.com/s/VJBV0qSBthjnbbmW-lctLA)说到了。 - -对于面试来说除了「代码随想录」上的题目,再了解一下:排序系列,简单图论(深搜,广搜,最小生成树,最短路径等),高级数据结构:并查集,字典树(了解一下),之后就差不多了。随便在leetcode找一些题目保持手感,题量至少300+,会稳一点。 - -关于深搜和广搜,其实深度优先搜索,我在二叉树的专题中讲解递归遍历,和回溯算法中 都讲了。 - -广度优先搜索,在二叉树树的层序遍历也讲了。 - -而图论中主要是在邻接表上进行的深搜和广搜。 - -面试中还是很少会考察图论,因为图论的代码量往往比较大,不适合在面试中考察,**面试中出现题目概率最大的是二叉树,回溯算法和动态规划!** - diff --git a/problems/知识星球精选/博士转行计算机.md b/problems/知识星球精选/博士转行计算机.md deleted file mode 100644 index 4da79e97..00000000 --- a/problems/知识星球精选/博士转行计算机.md +++ /dev/null @@ -1,53 +0,0 @@ -

- - - - -# 本硕非计算机博士,如果找计算机相关工作 - -在[知识星球](https://programmercarl.com/other/kstar.html)里,有一位博士录友,本硕都不是计算机,博士转的计算机,问了这样一个问题 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210903213924.png) - -一下是我的回答,在这里分享给大家。 - -我的一些研究生同学,都在读博,有的毕业有的还没毕业,平时和他们聊,对博士就业也是有一定的了解,这里说一说我的建议。 - -对于博士,强烈建议能去高校就去高校,这样最大程度发挥出了博士的好处,赚国家科研经费的钱还是香的。 - -虽然现在对青年研究者并不友好,基本经济大头都被实验室boss拿走了。 - -但高校壁垒高,外界再优秀的人才,也进不去和你竞争,所以可以小范围的卷。出来的话,就是和整个社会AI领域甚至和研发的同学一起卷。 - -**在企业 是谁有能力谁就上, 在高校,至少你得有博士学位才能上! 这就是很高的门槛了**。 - - -而且能给博士提供岗位的企业少之又少,所以博士的就业面反而窄了。 - -可能有同学想,薪酬要的低一点还不行么,其实博士毕业对薪资还是有要求的,如果薪资和本科,硕士应届生一样的话,自己也接受不了。 - -所以高校能给博士的机会更多一些,不过现在高校也是 青年科研人员都是 五年合同制,如果没有产出,也要走人了,压力也很大。 - -及时这样,还是建议能去高校去高校,当然这需要有心善、能力强、有人脉的博导,那是最好的了,(**注意这里选择博导,心善是最重要的一个选项**) - -实在去不了高校,接下来我们在看企业。 - -博士找工作不建议走正式招聘流程,例如走官网投递之类的,面试都没戏。 - -**AI岗现在对coding能力,工程能力要求都很高,企业现在特别喜欢有科研能力和工程能力的博士**,但这种人才还是稀缺的,大多数博士可能不会做那么多的工程项目,更别说还是本硕是非计算机专业的博士。 - -所以博士找工作要靠门派,最好你的导师,实验室大boss 有哪些徒弟在外面企业,BAT华为之类的干的很好,能联系上,就是同一门派的师兄弟。 - -联系上,做一个内推,他们看一下你的博士论文和研究成果,如果行的话,面试基本就是走个流程,这样就很舒服了。 - -如果上来一波算法题,然后 操作系统,网络 数据库,这样考察下来,基本计算机专业的博士也招架不住,毕竟大多数博士是科研型的,一般来说工程能力比较弱,计算机基础哪些基本也没时间看。 - - -再说一说非科班博士如果有机会去面试,**一定要重点突出知识的迁移能力,和对学术的研究能力,这个是硕士本科生所不能具备的**。 - -企业还是比较喜欢有快速学习能力和知识迁移能力的人,因为技术是不断在变化了,只有学习能力足够强再能跟上。 - -所以**不能和本科硕士去硬拼专业技能的储备量**,特别是最新最热的技术(因为本来就是非科班嘛), 要体现出博士对技术对知识的理解,这是你的优势。 - -以上是我的回答,希望多大家有所启发。录友们周末愉快🌹 - diff --git a/problems/知识星球精选/合适自己的就是最好的.md b/problems/知识星球精选/合适自己的就是最好的.md deleted file mode 100644 index dc31f5a7..00000000 --- a/problems/知识星球精选/合适自己的就是最好的.md +++ /dev/null @@ -1,37 +0,0 @@ -

- - - - -# 合适自己的,才是最好的! - -秋招已经进入下半场了,不少同学也拿到了offer,但不是说非要进大厂,每个人情况都不一样,**合适自己的,就是最好的!**。 - -[知识星球](https://programmercarl.com/other/kstar.html)里有一位录友,就终于拿到了合适自己的offer,并不是大厂,是南京的一家公司,**但很合适自己,其实就非常值得开心**。 - - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210910232502.png) - - -其实我算是一路见证了这位录友披荆斩棘,**从一开始基础并不好,还是非科班,到 实验室各种不顺利,再到最后面试次次受打击,最后终于拿到自己满意的offer**。 - -这一路下来确实不容易! - -这位录友是从几年五月份加入星球。 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210910221030.png) - -然后就开始每天坚持打卡。 可以看看她每天的打卡内容。 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210910222325.png) - -后面因为天天面试,不能坚持打卡了,也是和大部分同学一样,焦虑并努力着。 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210910222854.png) - -星球里完整的记录了 这位录友 从五月份以来每天的学习内容和学习状态,能感觉出来 **虽然苦难重重,但依然元气满满!** - -我在发文的时候 看了一遍她这几个月完整的打卡过程,还是深有感触的。 - -[知识星球](https://programmercarl.com/other/kstar.html)里还有很多很多这样的录友在每日奋斗着,**我相信 等大家拿到offer之后,在回头看一下当初星球里曾经每日打卡的点点滴滴,不仅会感动自己 也会感动每一位见证者**。 - diff --git a/problems/知识星球精选/备战2022届秋招.md b/problems/知识星球精选/备战2022届秋招.md deleted file mode 100644 index 55c2a3bf..00000000 --- a/problems/知识星球精选/备战2022届秋招.md +++ /dev/null @@ -1,67 +0,0 @@ -

- - - - -# 要开始准备2022届的秋招了 - -在[知识星球](https://programmercarl.com/other/kstar.html)里准备秋招的录友还真不少,也会回答过不少关于秋招的问题。 - -![](https://img-blog.csdnimg.cn/20210507195443924.png) - -能感觉出来慌,不止这一位提问题的录友,很多同学都是这样,就是感觉一天天过的很快,也没干什么事情,然后心里就一直恐慌。 - -其实**慌主要是因为没有计划**,每天没有目的,然后一天一天的过,秋招越来越近,自然慌的很。 - -我在这篇里系统性的解答了实习相关的问题,[关于实习,大家可能有点迷茫!](https://mp.weixin.qq.com/s/xcxzi7c78kQGjvZ8hh7taA),也提到了 一般秋招8月份就要正式开始了,那时候各种提前批,面试小道消息,甚至身边一些同学已经拿到了offer,恐怕已经没有时间静下心好好学习了。 - -所以从现在看是满打满算,还有三个月的准备时间,如果利用好还是挺充足的,不要每天在把时间浪费在各种无聊的活动上。 - -这里我来列举一下,此时大家应该明确哪些事情: - -## 确定自己要面试的岗位 - -说道选择哪些岗位,一般的回答都是:选择自己感兴趣的呗,兴趣是最好的老师之类的balabala。 - -但我能亲身体会到,目前咱们的教育环境 也不可能说培养出什么 自己真正的兴趣,在大街上随便问一个人你的兴趣是什么? 基本回答都是:吃喝玩睡呗,还能有啥兴趣。 - -所以务实的建议是:现在去各大公司校招招聘官网 把所有的岗位都看一看,看看都有哪些要求,结合目前自己的经历和已经掌握的内容,看看哪些岗位可能最接近,然后再问问师兄师姐 这个岗位或者公司如何,最后后就把自己的目标岗位定下来了。 - -也有很多录友在星球里问我关于一些公司,岗位前景之类的问题,我都会给出相应的建议,这也是我工作过程中接触过了解过的。后面我也把部分内容整理一下,在公众号分享一下。 - -这样接下来的时间就是全身心去准备这个岗位所需要的技能。 - -**不少同学在秋招的时候,试试算法岗感觉也行,投投前端感觉也行,尝试后端也不是不可以,甚至再面面产品经理**。 - -**这样在秋招的时候就很被动了**,哪个岗位都没准备好,哪个岗位还都想试试,大概率是最后都没面上的。 - -所以现在就要把自己的目标岗位锁定了。 不同岗位之间 要求还是不一样的。 大家去看看招聘官网的要求就可以了。 - -## 制定学习计划 - -知道自己的目标岗位了,也知道岗位的要求了,剩下的就是制定详细的计划。 - -* 编程语言 -* 计算机基础(操作系统,网络,数据库、设计模式) -* linux相关(客户端岗位应该不需要) -* 项目 -* 准备自己的博客,github - -这几块按照岗位要求,8月份应该学会哪些内容,需要看哪些书等等。 - -然后以八月份以deadline开始倒推,每个月应该学哪些,每周应该学哪些,每天应该看那些。 - -把这些都明确了,心里就不慌了,也不会每天浪费大量宝贵的时间。 - -星球里的录友每天都在坚持打卡,总结自己今天学习的内容,这样就很好,把自己每天学习进度量化。 - -这样每天过的就很扎实。而且每天的打卡星球里录友和我都可以看到,我也会及时评论评论,大家也相互监督。 - -给大家看一位录友在星球里的总结: - -![](https://img-blog.csdnimg.cn/20210507204017952.png) - -大家平时的话,也要养成这种总结的习惯,只有及时总结把自己学过的内容积累下来,才能把时间沉淀下来,要不然就是一边学一边忘的节奏了。 - -**其实这种习惯,无论是秋招,还是准备跳槽,还是平时工作积累,都非常总要!** - diff --git a/problems/知识星球精选/大厂新人培养体系.md b/problems/知识星球精选/大厂新人培养体系.md deleted file mode 100644 index 0e905e42..00000000 --- a/problems/知识星球精选/大厂新人培养体系.md +++ /dev/null @@ -1,81 +0,0 @@ -

- - - - -# 大厂的新人培养体系是什么样的 - -之前我一直在[知识星球](https://programmercarl.com/other/kstar.html)和大家讲,能进大厂一定要进大厂,大厂有比较好的培养体系。 - -也有录友在星球里问我,究竟培养体系应该是什么样的呢? 大厂都会这么培养新人么? - -![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210717173307.png) - -其实大厂部门也是非常多,不同的领导对待新人的态度也是不一样的。 - -就拿腾讯来说,腾讯里面 上千个部门,基本就是上千个小公司,只不过外面披一个腾讯的壳子,每个小公司的leader风格截然不同。 - -赶上什么样的领导了,这就看命运了。 - -**只能说进大厂,大概率会有一个比较好的培养体系**。 - -那么好的培养体系是什么呢? - -要从两个方面来说: - -* 给你详细的学习路线(自我技术提升) -* 给你有产出的活(用来晋升) - -## 详细的学习路线 - -关于详细的学习路线,一般大厂入职之后配有导师的,导师给你安排的每一个功能,应该带你熟悉整个研发的流程。 - -一个功能的开发,需要经历如下几步: - -1. 看需求文档,确定需求 -2. 这个需求包含了哪些功能 -3. 有哪些难点 -4. 后台架构是什么样的(要有架构图) -5. 定协议(前后台一起商量),服务与服务之间的,后台与客户端之间的 -6. 设计数据结构+算法=程序 -7. 预估一下容量(各种资源例如带宽,存储,CPU等等) -8. 考虑一下部署(安全性,容灾,可伸缩性。。。。) -9. 设计评审 -(上面过程都是在分析) -10. 编码 -11. 自测 -12. 联调 -13. 交给测试 -14. 代码review -15. 合入 -16. 发布 - -可以看出来,写代码仅仅是 其中的一小步。导师应该带你走一遍完整的开发流程,然后告诉一些注意事项,**这样为自己程序员生涯打好基础**。 - -可能有的同学会感觉:我就开发一个小功能,哪用得着这么多步骤,一把梭哈,直接代码写完。 - -哈哈,这么想的同学一般是没有参与过大型且流程规范的项目开发。互联网千万级用户的项目,几十上百人一起开发是需要规范的,**所以上面我说的每一步都很重要!** - -## 有产出的活 - -初入职场的同学,可能都非常在意能不能学到东西,也就是自我技术提升,往往忽视了你干的活,是否有产出,能不能用来晋升。 - -这里就是很多所谓的“套路”,老司机一般挑的活符合如下几点: - -* 非常规整(周边没有烂糟的额外工作,例如还要开发各种小工具之类的) -* 独立模块(不需要和其他人扯皮,省事) -* 对项目组很重要(既有技术难点,又没有大量的业务增删改查) -* 风险系数比较低(上线出问题,锅甩不到他这里) - -这种活就是好活,用来晋升的利器,而且干着也舒服。 - -但一个项目,一定会有大量需要打杂的活,写各种脚本,各种处理数据,然后看各种问题,整理文章,汇报,开发边缘工具等等。 - -新人一般进来都是先打杂的,**但如果领导确实是细心培养你,还是额外给你一个小模块,让你做好,这个小模块就是让你用来晋升的或者转正的**。 - -这个建议不仅适用于实习生,对于初入职场的同学也很用帮助,这个部门是不是有在培养你,老司机一眼就能看出来,只不过新人可能自己很难发现。 - -所以需要过来人点拨一下,大家就知道自己现在的处境了。 - -希望对大家求职和工作有所帮助! - diff --git a/problems/知识星球精选/天下乌鸦一般黑.md b/problems/知识星球精选/天下乌鸦一般黑.md deleted file mode 100644 index ccd1c326..00000000 --- a/problems/知识星球精选/天下乌鸦一般黑.md +++ /dev/null @@ -1,71 +0,0 @@ - -

- - - - -# 天下乌鸦一般黑,哪家没有PUA? - -相信大家应该经常在 各大论坛啊之类的 看到对各个互联网公司的评价,有风评好的,也有风评不好的。 - -在[知识星球](https://programmercarl.com/other/kstar.html)里有录友问我这样一个问题: - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211004095707.png) - -这位录友,拿了阿里云,腾讯,百度,shopee的意向书,可以确是收割机了,但如果还没有进入职场,还容易被网上这些风评误导。 - -卡哥来客观的分析一下,如何看到这些网上对公司的评论。 - -脉脉,知乎上喷阿里,百度的 都比较多。喷腾讯的确实少一些。 - -**只能说腾讯的舆论控制相对比较好**,在加上职能体系的人文关怀比较到位(公仔,各种活动,逢年过节小礼品之类的)。 - -但**天下乌鸦一般黑**,腾讯的职场PUA,一点都不比阿里的少,各种套路 ,阿里有的,腾讯都有,还有什么各种花边吃瓜新闻,在腾讯内网特别多。 - -但这些都在公司内网传播,很少传出去。 这就是腾讯厉害所在了。 - -其实我们在选择公司的时候,**主要是看岗位,看业务,看发展**,至于 有没有PUA之类的,只能说**有人的地方就有江湖**,腾讯人 就比 阿里人 就更正直么? - -相信大家都参加过面试。招聘的时候,几个小时的面试能看出人品么?对吧。 - -各种新人背锅,末尾淘汰,PUA,阿里有的,腾讯都有。 所以大家求职的时候不用在乎这些风评。 - -至于这种锅和套路 能不能落到自己的头上,就要看碰到了什么样的直属领导了。 - -例如两位同学去了同一家公司,同一个事业群,同一个部门,同一个项目组,只是在两个不同的领导下干活,其区别都可以一个天上,一个地上。 - -有的录友 可能对职场套路不太了解,或者 初入职场比较顺利,没有感受过什么套路。 - -这里卡哥给大家随便说一个,例如,一个项目组,有前端组和后端组,分别是两个老大,有一个需求,要开发一个功能,这个功能本来前端就可以独立完成的,但上线可能会有风险,保护自己手下的前端领导,就会让前端同学和后端的同学一起实现这个功能,也就是前端实现一部分,后端也要做一部分数据处理,前端展示就可以了。 - -为什么这么安排呢? - -因为一旦上线出问题了,就是前端和后端一起背锅,这样前端同学压力就小很多了。 - -而整个需求安排,前端同学其实并不知道 自己的风险,其实是领导保护了他。 - -那么 不保守下手的领导,当然就啥也不说了,让你一个人把这个功能做了,上线没出问题 那还算万事大吉,一旦出问题,那年底考核是不是就要背一个指标了。 - -所以不要感觉程序员的工作环境很单纯,其实套路多得很,还是那句话:**有人的地方就有江湖**,不区分公司的。 - -只能说 业务发展越好的部门,套路相对来说少一点,毕竟高速发展可以掩盖很多问题。 - -**所以遇到什么样的直属领导非常非常的重要**,但这又是我们决定不了的。 所以这都看缘分(运气)了。 - -有的同学毕业在大厂顺风顺水,除了自己努力外(而大家谁又不努力呢?),更重要的是遇到了好领导。 - -但有的同学同样进大厂,发展就很差,而且没人给他指引一些部门潜在的规则,那就难免会撞坑。 - -未必是他不够努力,不够聪明,不会沟通,可能恰巧 部门效益不好,部门考核就差,领导一般不会让老人背锅,毕竟系统的bug都是老人写的,老人都走了,谁来修bug呢(人间真实)。 - -那领导就拿他这个新人开刀了呗。 - -所以,**同样是进大厂,发展好的同学 不用过于优越感,感觉是自己能力多强,其实大概率是赶上了 好部门好领导,发展不好的同学也不要 自责自己能力不行,甚至开始自卑,大概率是运气不太好而已**。 - -那么是 发展好坏全看运气了么,当然不是! - -重要是 遇到挫折(背锅,绩效不好,甚至被开除),不要自卑,不要放弃,相信自己,只要把时间拉长,5-10年的时间,**真正努力的人,发展都不错!** - -卡哥希望录友们都有好的发展,加油💪 - - diff --git a/problems/知识星球精选/如何权衡实习与秋招复习.md b/problems/知识星球精选/如何权衡实习与秋招复习.md deleted file mode 100644 index 07e2bba6..00000000 --- a/problems/知识星球精选/如何权衡实习与秋招复习.md +++ /dev/null @@ -1,47 +0,0 @@ -

- - - - -# 已经在实习的录友如何准备秋招? - -最近在[知识星球](https://programmercarl.com/other/kstar.html)一位录友问了实习生如何权衡工作和准备秋招的问题。 - - -![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210703230618.png) - -其实这个问题挺有代表性,我之前一直讲的都是没有去实习的录友应该怎么怎么办,其实已经在大厂实习的录友也有很多烦恼。 - -这里我说一说已经有大厂实习经历,准备秋招的重点。 - -一般来说有大厂的实习经历,**面试官的兴趣都在大厂实习的项目经验上**。 - -所以关于权衡实习和准备基础这两个方面,**可以把主要精力放在项目包装上,其次是看基础**。 - -要在包装实习项目上多花点心思,实习生做的项目偏上业务很正常,不可能让实习生搞太复杂的,一旦出了问题还得导师背锅。 - -自己干的活,或者项目很简单 不要紧,可以好好包装一下,如果没有难点,**可以结合业务自己“造”难点**,大厂内部研发文档都特别多而且特别全。 - -例如整个项目的立项,各个模块的开发,以及研发中遇到的困难,技术选型,上线事故,等等这些都是有完整的文档记录的。(当然大厂也有一些部门研发流程很原始,没有文档,全靠口述) - -从这些文档中也可以找出 难点糅合到自己的项目中。 - -假如线上出了事故,虽然自己不用去排查但可以跟着同事们一起看问题,一起分析,甚至帮他捞捞日志,打打下手。 - -这次事故的表现,起因,定位等等,排查问题的同事都会记录的清清楚楚,放在项目文档下。 - -可以把这些文档都多看看,然后就可以转变成自己排查线上事故的经历了。 - -**这种经历在面试官来看就是很大的加分项了**。 - -所以在大厂实习,想包装自己的项目方法有很多,只不过一些同学初入职场,对自己有帮助的资料或者内容不太敏感,不善于利用已有的资源。 - -**需要过来人点一下,基本就上道了,哈哈哈**。 - -当然不是说只要在大厂实习,基础完全就不用看了,抽空也要看,只不过 项目经验(项目的包装)更重要! - -关于提前批,一般来说本厂实习生是不能参加提前批的。 - -你可以参加 其他大厂的提前批,只不过参加提前批是有代价的,面试不通过都是有记录的,得看自己项目准备的如何,能不能拿出手,而且一边实习一边面试可能也不太方便,如果想试一试,就找自己不想去的企业的提前批试试水! - - diff --git a/problems/知识星球精选/客三消.md b/problems/知识星球精选/客三消.md deleted file mode 100644 index 6b81ab2c..00000000 --- a/problems/知识星球精选/客三消.md +++ /dev/null @@ -1,95 +0,0 @@ -

- - - - -# 客三消! - -给大家科普一下:什么是客三消。 - -翻译过来就是客户端三年消失。 - -**听起来是不是有点吓人**!这种说法略夸张,但只要能传开,就说明客户端一定有一些困局,并不是空穴来风。 - -昨天卡哥在朋友圈里分享了一个段子的截图 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/IMG_3986.jpg) - -然后朋友圈就炸了,上百条的留言,问我这是为啥。 - -其实这个问题在[知识星球](https://programmercarl.com/other/kstar.html)里也有录友问过我。 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210905091037.png) - -当时已经详细的回答了一波,估计很多录友都有这方面的困惑,所以在公众号上再来给大家讲一讲。 - -**关于星球提问中SRE和后端,在这里就不介绍了,卡哥重点说一说,客户端**。 - -客户端目前比较突出的问题,主要是 这四点: - -1. 客户端岗位需求相对较小,而且有越来越小的趋势 - -2. 技术做深相对较难 - -3. 客户端晋升相对困难 - -4. 中年危机 (其实程序员有,不过客户端可能更明显一些) - - -## 岗位需求相对较小 - -客户端需求的减少,主要是体现在中小厂,或者说创业公司,因为大家都养不起原生客户端,基本都会采用跨端的技术方案,也就是大前端(即一套代码可以编译出各个端的版本,包括安卓,IOS等各种终端)。 - -这样就节省了很大的人力,不过目前在功能上一定没有 原生客户端体验好。 - -**但大前端取代客户端是技术趋势!** - -如果选择客户端,那么就多少要掌握一些跨端技术方案。 - -互联网软件的思维,就是轻前端,重后端,为什么PC软件搬到了浏览器上,移动APP搬到小程序上,都是这个道理,一般重头戏在后端。 - -所以后端的需求才会比较大。 - -## 技术做深相对较难 - -这里就不止客户端,其实前端都有这个问题。 - -关于前端和客户端的区别,其实没有那么严格的定义,大家可以理解 前端包含了客户端。一切可视化皆为前端。 - -前端框架、渲染引擎 变化相对快,可能你刚熟悉一个框架,然后就换了,最关键是可能还拿不准哪一种框架日后会成为主流,一不小心就跑偏了。 - -而后端框架变化相对就慢得多,而且 更容易(或者说更有机会)把技术做深,因为 高并发,高可用,低延迟 这些基本都是后端的工作。 - -正是前端 技术栈更新太快,所以要持续高强度学习 (这种学习可能不是往深去学习,而是 适应一个又一个框架的学习)。 - -而且前端 很容易陷入需求的反复变化之中,因为一个功能或者界面的修改,都是前端同学的工作量。 - -后端可能 什么都不用改,接口都是一样的,然后就可以空出时间研究技术。 - -## 晋升 - -目前在大厂,客户端职业天花板相对较低,一般情况下,可能到组长就到头了。 - -搞技术一路升上去,甚至到CTO的,基本都是后端,这也是因为前面讲过的:大部分的互联网产品,重头戏在后端,所有后端更有机会把技术做深,更直白说,后端更有机会在晋升做ppt的时候 “吹牛逼”。 - - -## 中年危机 - -这个就更范范一些了,程序员都有这个危机,不过客户端可能更突出一些。 - -原生客户端的岗位需求确实会越来越少,如果继续干下去,没有晋升到管理层,然后退居二线公司,发现二线公司都没有原生客户端的岗位,那么就非常被动了。 - -所以可以往大前端的方向去转。 - -大前端现在也有很多技术方案,ReactNative和weex(阿里,脸书的方案),Flutter(Google的方案),微信小程序(腾讯的方案) - -不过最终哪一个方案一统天下,这还是未知数,所以就需要持续学习咯。 - -# 总结 - -以上就是我在[知识星球](https://programmercarl.com/other/kstar.html)里的详细回答。 - -注意我这里说的一般情况,当然各个岗位都有佼佼者,或者说大牛,客户端也有大牛,也很香,不过这是极少数,就不在讨论范围内了。 - -希望对大家理解目前客户端的趋势有所帮助。 - diff --git a/problems/知识星球精选/技术不好如何选择技术方向.md b/problems/知识星球精选/技术不好如何选择技术方向.md deleted file mode 100644 index 4ad4659b..00000000 --- a/problems/知识星球精选/技术不好如何选择技术方向.md +++ /dev/null @@ -1,32 +0,0 @@ -

- - - - -# 技术不太好,也不知道对技术有没有兴趣,我该怎么选? - -最近在[知识星球](https://programmercarl.com/other/kstar.html)里解答了不少录友们的疑惑,其实发现一个挺普遍的问题: - -* 我技术很一般 -* 对技术也没有什么追求 -* 要是对什么岗位感兴趣我也不知道 -* 以后自己喜欢干什么也不太清楚 - -**相信说到了不少录友心里去了, 其实目前应试教育下 确实很难找到自己感兴趣的事情**。 - -但我想说的是,并不是技术不好就什么都做不了,依然有很多选择,只不过录友们没有接触过,所以就不知道自己接下来要往哪个方向走。 - -这里我给出一些路线,大家可以参考: - -方向一:走纯研发路线,去大厂,如果真的对技术提不上兴趣可能会走的很辛苦。 - -方向二:如果技术还凑合,不做纯研发,退一步也可以考虑去大厂做测试相关的工作,对技术要求没有那么高,但也需要技术能力,而且技术能力越强越吃香。 - -方向三:去银行,证券,国企类的企业去做研发岗位,这种国有企业的技术面试相对简单不少,比较轻松,还很稳定,收入虽说不高,但生活足够滋润。 - -方向四:做toC(面向普通用户)的产品经理,toC产品经理这个岗位就特别卷,因为这个岗位门槛太低了,任何专业的同学都可以去做产品经理。 这样自己所学的技术就基本没有用了,也凸显不出技术上的优势,但如果自己真的对APP之类的各种应用得心应手,优点缺点,用户爽点、日活、次留等等手到擒来,倒可以试一试。 - -方向五:做toB的产品经理,包括云计算,大数据这些产品都是需要产品经理的,例如百度云,腾讯云,阿里云等等,这种产品本身就是技术产品,所以需要懂技术的产品经理来做设计,即需要产品的抓住需求的能力,也需要懂点技术,既可以发挥自己的技术能力,还可以做产品规划,基本也不用写代码。 - -对技术要求不高的岗位也挺多的,发展也很好,只要大家多去了解,总会找打符合自己的岗位。 - diff --git a/problems/知识星球精选/提前批已经开始了.md b/problems/知识星球精选/提前批已经开始了.md deleted file mode 100644 index 3e255746..00000000 --- a/problems/知识星球精选/提前批已经开始了.md +++ /dev/null @@ -1,48 +0,0 @@ -

- - - - -# 不知不觉华为提前提已经开始了 - -最近华为提前批已经开始了,不少同学已经陆续参加了提前批的面试。 - -在[知识星球](https://programmercarl.com/other/kstar.html)上就有录友问我这么个问题: - -![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210711002802.png) - -华为是比较看重学历的,如果学校比较好(985以上),华为的面试会随意一些,几乎就是走一个流程。 - -我记得当初校招的时候,华为来我们学校就是 几个大巴把整个计算机学院的同学拉到酒店,批量面试,面试过程差不多就是走个形式,大家基本都拿到offer了。 - -不是说 非985/211的同学 技术就不好,而是当企业每年要招上万人的时候,通过学历还筛选相对来说是 效率较高且成本最低的一种方式。 - -不过现在竞争越来越激烈了,华为也很少这种粗暴方式来召人。再说华为给出的薪酬相对互联网大厂也 很有竞争力,发展前景也很不错。 - -那么在说一说面试的内容。 - -可能有的同学感觉,我为了面试,准备了这么多,结果面试都没问,就问问项目问问编程语言就完事了。 - -这其实很正常! - -不同的公司,同一个公司不同部门,同一个部门不同面试官 面试风格都不太一样。 - -可能部门就比较缺人,面试官看一下 简历 学校可以,技术看上去还凑合,项目也还行,那么面试可能就放水一点,然后就过了。 - -毕竟面试官也很忙,在大厂谁都不想当面试官,都是工作之余加班的工作量,**所以面试官也想快点结束**。 - -还有另一种可能,就是部门已经招满了,但依然安排了面试,那么面试官就随便问问,然后也不会招人了。 - -还有一种,就是有的面试官就习惯考察算法题,问完算法了,其他的他也就不会问了。 - -因为操作系统,网络,数据库这些面试官在面试之前也要突击准备的,工作那么多年,都忘的差不多了,**所以要复习一波,这也是工作(都是加班啊!)**。 - -甚至可能面试官前天刚要和女朋友过生日,然后就没准备计算机基础方面的内容,索性面试的时候也就不问了..... - -这都是有可能的,很多同学可能没做过面试官,所以对一些面试过程就容易想不通,其实面试官也是普普通通的打工仔,他也不想加班,也想只要人品端正,积极肯干,随便召个技术差不多的就算了,哈哈哈。 - -所以说,面试有的时候也很看缘分的,大家辛辛苦苦造火箭,结果面试都没问是很正常的。 - -大家也放平心态,把该做的做好,剩下的交个天意了。 - - diff --git a/problems/知识星球精选/秋招下半场依然没offer.md b/problems/知识星球精选/秋招下半场依然没offer.md deleted file mode 100644 index 5862dd32..00000000 --- a/problems/知识星球精选/秋招下半场依然没offer.md +++ /dev/null @@ -1,99 +0,0 @@ -

- - - - -# 秋招下半场依然没offer,怎么办? - -[知识星球](https://programmercarl.com/other/kstar.html)里一些录友拿到了满意的offer,也有一些录友,依然没有offer,每天的状态已经不能用焦虑来形容了。 - -在星球里就有录友向我提问了这样一个问题: - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210921103222.png) - -估计还有公众号上还有很多录友也是这种情况,马上面试,但总感觉哪里都还没准备好,然后还必须要面试,每次面试结果还不理想。 - -能感受到此时大家非常迫切要知道还有没有什么切实可行的方案 ,只要执行 ,就能拿到offer。 - -恨不得提前知道面试官的问题,然后把问题都背下来得了。。。。 - -其实我是非常理解大家的心情的,这个时候怪自己准备的太晚也没有用。 - -说实话,已经是秋招下半场(接近末尾了),**已经没有针对面试的复习方案了。什么学习路线,突击计划 在这个时候 都没啥作用了**。 - -现在什么最重要呢? - -是**心态**。 - -心态要稳住,**放低预期,但别放低努力的程度**。 - -估计参加过面试的同学,都会有这种感觉,面试前一天复习,突击的内容,**第二天面试都不会考!是的,一道都不会考!** - -那么为什么还学呢? - -就是这股劲不能泄,只要憋住劲,每天面试,复盘,学习,面试再复盘,再学习,最终大家其实都能拿到offer的,只不过是offer的满意程度罢了。 - -**如果泄了劲,那就真没戏了**。 - -**可能自暴自弃两天,然后就发现自己啥也学不进去了**。 - -所以这个时候了,算法题还要一直刷,八股文也要背起来。 - -讲真,现在刷的题,看的八股文,面试可能也不一定会考,但为什么还要看呢,**就是稳定心态**。 - -**剩下的就看缘分了!** - -面试挺看缘分的, 可能一个面试官对你的评价就是基础不牢,下一家公司面试官对你的评价就是 基础不错,但项目经验不足。 - -所以此时你自己都蒙了,究竟自己是 基础不牢,还是项目经验不足呢? - -其实面试的本质,面试官主观性还是比较强的,可能就是问的几个问题 你都背过,而且背的很深入,那评价就是基础牢了呗。 - - -## 在学点技术,冲春招? - -[知识星球](https://programmercarl.com/other/kstar.html)里还有一位录友,也是类似的情况,秋招感觉很艰难,要不要在学一学微服务分布式之类的,再冲春招。 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210921103343.png) - -其实这个时候,大家也不要再心思学点什么新技术,增加自己的筹码了。 - -还是那句话,**现在学啥,面试也未必会考!** - -就算 现在不参加秋招了,去学 微服务了,分布式。面试的时候 ,面试官未必会考不说,而且 你也未必学的透彻。 - -再说,春招的岗位 很少,而且优质岗位更少。 - -所以大家这个时候,就不要等了。 - -**直接海投,面试,复盘总结,再面试**。 - - -## 给参加明年秋招录友的劝告 - -其实我在[知识星球](https://programmercarl.com/other/kstar.html)里,**看到了太多太多 参加今年秋招的录友 埋怨自己 准备的太晚了,没想到要看的东西这么多,没想到竞争这么激烈**。 - -所以明年参加秋招的录友,要提前就开始准备,明确自己的岗位,知道岗位的要求,制定自己的计划,然后按计划执行。 - -**其实多早开始准备,都不算早!** - -很多在[知识星球](https://programmercarl.com/other/kstar.html)里的准大三,研一的录友,都能在星球里感受到 秋招的竞争与激烈。 - -所以他们也就早早的开始准备了。 - -来看看星球里 这位录友的提问,**他也才刚刚准大三,就已经为明年的秋招开始精心准备了**。 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210920222600.png) - -估计大多数准大三或者准研一的同学都还没有这种意识。 - -**但在[知识星球](https://programmercarl.com/other/kstar.html)里,通过每天录友们的打卡,每天都能感受到这种紧迫感**。 - -正如一位星球里的录友这么说: - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210920223847.png) - -很多录友加入星球之后,**刷贴吧刷剧已经不香了,只有刷星球!** - -感觉每天自己被push上去,其实有时候 **大家需要的就是一个氛围,自己一个人很难有提前准备的意识,也很难坚持下来**。 - diff --git a/problems/知识星球精选/秋招开奖.md b/problems/知识星球精选/秋招开奖.md deleted file mode 100644 index 82686785..00000000 --- a/problems/知识星球精选/秋招开奖.md +++ /dev/null @@ -1,65 +0,0 @@ - -

- - - - -# 开奖 - -最近秋招的录友已经陆续开奖了,同时开奖多少,也是offer选择的一个重要因素,毕竟谁能和钱过意不去呢。 - -[知识星球](https://programmercarl.com/other/kstar.html)里这位录友拿到的百度offer薪资确实很高 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211023102430.png) - -以下是我的回答: - --------------- - -百度给你的这个薪资很不错了,百度一向是大厂里最扣的那个,能给这个价位,说明 面试官对你很满意。 - -语言方面你不用过于纠结,其实学什么语言最终都是为了赚钱是吧,钱给到位了,写啥不都一样么。 - -而且如果后面php 要转go的话,你就还很多锻炼的机会,对你晋升十分有好处,php转go,就是把已有的后端代码全部重写,相当于是重构,就是很多工作可以做。 - -**程序员最喜欢的就是重构**,重构既能提升技术,又能向上邀功(**可以理解就是容易晋升**)。 - -如果是稳定的业务,进去大概率是打杂的,因为没有那么多代码可写,进去就改改bug,写写脚本分析分析日志,之类的,总之不会接触到核心代码,没有机会,也没有必要。 - -但如果稳定的业务 代码要重构,就有机会可以读一读核心代码,分析哪里设计的不好,重写一遍,那就可以大展宏图。 - -这就是为什么程序员都喜欢重构。 - -字节的话 后端-系统架构,这个岗位是可以的,但具体什么部门,具体做什么就不太清楚了,至于你说的边缘部门,如果这个部门就叫做系统架构部的话,不可能是边缘部门。系统架构部门还是挺重要的。 - -但如果 字节和百度选的话,我还是倾向于百度。 百度对新人培养还很到位的,比字节强多了。 - -滴滴就不考虑了, 华为 2012实验室中央软件院,其实是不错的,适合好好搞技术,但关于 多媒体开发 这块 要看具体工作了。 -2012 一般薪资开的不高,毕竟不是华为的业务部门。 - -如果百度过几天逼签的话,就签了吧,挺香的,总包都40w+了,百度一向是很抠的,**这个价位,百度是下血本了**。 - -如果还能拖,就等 字节 和 华为开奖,如果能开到 50w+,那就考虑考虑。 - -如果薪资差不多,就百度吧。 - - -------------- - -这位录友最后也决定签百度了。 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211021234705.png) - -大家也注意到,这位录友是把《代码随想录》刷了两篇,这里我也是推荐大家至少要把 《代码随想录》上的题目刷两遍,才能真正的掌握我讲解的内容,第一遍大家可能就是力扣提交通过了,然后这道题目就过了,没有深入去思考,也没有深入去看我的题解。 - -但第二遍的时候,就可以深入思考 上一道题目与本题之间的联系,动态规划或者二叉树的题目套路 等等了。 - - -还有这位录友在星球里提到,用了我推荐的项目,其实这就是这个:[基于跳表的轻量级KV存储引擎](https://mp.weixin.qq.com/s/i3vJd0nPqQFyLRH9Px84YA) - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211023103749.png) - -这个项目是我18年的时候,业余时间写的,大家如果按照我的代码来,从代码质量到结构设计,绝对是可以拿得出手的。 - -但我没有写这个项目的详细教程,很多基础不太好的录友可能看着有点费劲,后面我会在B站上出一期详细的讲解视频,公众号也会同步文字版本。 - diff --git a/problems/知识星球精选/秋招总结1.md b/problems/知识星球精选/秋招总结1.md deleted file mode 100644 index 2aec24dc..00000000 --- a/problems/知识星球精选/秋招总结1.md +++ /dev/null @@ -1,194 +0,0 @@ -

- - - - -# 无竞赛,无实习,如何秋招? - -今年秋招已经结束了,今天给大家介绍一位知识星球里的录友,我也是见证了他一步一步准备,从绝望到看到希望再绝望到最后拿到offer的全部过程。 - -我记得给他改简历的时候,就说过他冲客户端的话,可能更稳一些。 - -时间总是过得很快,但曾经焦虑的小伙,现在也拿到几个offer了,不一定人人都要冲大厂,卷算法,卷后端,合适自己就好,要不然会把自己搞的很累。 - -以下是他的秋招总结,**写的很用心,说了很多面试中使用的方法,发在[知识星球](https://programmercarl.com/other/kstar.html)里,立刻就引来星球小伙伴们的围观**,算是给星球里明年要秋招的录友做了一个参考。 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211109231150.png) - -我也征求了他本人的同意,将其分享在公众号上,希望对大家有所启发。 - -以下原文: - - -## 个人背景 - -* 学校:末流985 -* 学历:本科 -* 所学专业:网络空间安全 -* 意向岗位:后端开发 -* 校内学习情况:**无竞赛,无实习经历,自己平时也没有捣鼓过任何项目,只是跟着学校的课程学习**😅。 - -## 秋招时间线 - -(**加粗内容为时间节点**,中间还穿插着各种笔试,这里就不列举了) - -* 二月初-二月中旬:开始刷leetcode -* 三月初-四月初:背八股文,刷题,同时投递实习岗,但由于个人实力不足以及投递时间太晚,一面均未通过 -* 四月-七月:完成学校内的课程,准备专业课考试,同时背八股文,不断地重复刷算法题 -* **七月二十六日**:收到字节跳动**客户端软件安全工程师**岗位的面试邀请 -* 八月初:面试**腾讯**后台开发岗,一面挂 -* **八月十五日**:通过字节的三轮专业面试和一轮hr面拿到**意向书** -* 八月下旬:连续面试美团,蚂蚁;美团一面挂,蚂蚁一面通过 -* **九月三日**:蚂蚁二面通过 -* **九月十三日**:成为字节跳动实习生,提前感受工作内容 -* 九月下旬:**通过五轮面试**:蚂蚁三面和hr面;华为两轮技术面和主管面 -* **十月二十九日**:收到字节正式offer -* **十一月五日**:收到华为意向书 - -小结: - -- 面试的企业:华为,字节,蚂蚁,腾讯,美团 -- 通过的企业:华为,字节(蚂蚁泡池子) -- 字节客户端安全-深圳 -- 华为软开-深圳(东莞):14a -- offer选择:大概率华为,中概率字节,小概率春招再战 - - - -## 技能准备 - -### 算法和数据结构 - -掌握程度: - -- 代码随想录 上的题目:programmercarl.com, 除了单调栈以外的所有题目都做过,且大部分题目**3-7**刷。 -- leetcode总共题数:219题。 -- (https://www.nowcoder.com/ta/huawei )做了68道。 -- 二叉树,红黑树,B+树,数组,链表,堆栈等基础知识均掌握。 - -取得的效果: -- 95%的面试题都能做出来,能讲出时间,空间复杂度和实现思路,但没见过的题目不一定能想出最优解。 -- 华为笔试:200分 (100分通过) ,蚂蚁笔试通过率:70%,网易笔试通过率:80%。 - -### 学习建议 - -按照卡哥**出题的顺序**刷,且要**重复刷**,**不能只是背代码**。还记得春招的时候,面试官问我**两数之和**,我能把代码写出来,但当问到实现思路,为什么这么实现,我答不上来;相类似的还有**二叉树迭代法的统一写法**,当面试官问我为什么这么写的时候,我说不知道:sob: - -把卡哥的题刷得差不多的时候,建议再刷两个专题: - -* 二分法 :https://leetcode-cn.com/problems/search-insert-position/solution/te-bie-hao-yong-de-er-fen-cha-fa-fa-mo-ban-python-/) -* 滑动窗口:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/hua-dong-chuang-kou-by-powcai 。 - - -笔试题刷题要点: - -- **多刷**,**多刷**,**多刷**,**熟悉ACM格式** -- 面试题刷题要点: - - **时间,空间复杂度** - - **优化方案** - - **解题思路** - -以下是本人对各个知识块的掌握情况: - -### 计算机网络 - -掌握程度:应用层到数据链路层常考题都背得很熟悉,但细节没记到位,美团曾经问过我**tcp报文的可选字段**,没答上来。 - -### 操作系统 - -掌握程度:熟悉常见面试题,但当问到特别具体的问题时难以回答,比如:给一个具体的虚拟地址,请求出它映射到的物理地址。 - -### 数据库 - -掌握程度:这部分掌握得最少,仅限于面经里MySQL的面试题:cold_sweat:。 - -### C++ - -掌握程度:基础面试题,stl,面向对象等面试题滚瓜烂熟,但面试的时候语言考察得很少,我遇到过的只有:**malloc**底层实现,**stl**相关底层原理。 - -### 项目 - -提前准备好以下问题的答案: -- 为什么要做这个项目? -- 是**为了解决什么问题**? -- 项目的性质是什么? -- 多少个人完成? -- 你负责了什么工作? -- 有什么亮点?难点? -- 运用了哪些技术? -- 有什么收获? - -## 经验技巧 - -### 模拟问答 - -把**一切**在面试中可能被问到问题的**答案背下来**,假设你的对面有一个面试官,把问题的答案说给他听,这样有几个好处: - -1. **锻炼表达能力**。有过面试经验的同学应该可以感受到,明明自己对一些问题很了解,但面试时讲得磕磕巴巴,逻辑不清晰。 - -提前模拟面试场景,可以帮助你提前发现**语言表述上的问题**,以达到在面试过程中**清晰表述内容**的效果。 - -2. **查漏补缺**。在回答问题时,自己很有可能产生一些**疑问**,而这些疑问也是面试官**特别喜欢**考察的地方。 - -举例: - -- 面试官问:进程和线程的区别? -- 回答: -- 进程切换比线程切换开销小 -- ....... -- 面试官追问:进程切换开销**小在哪**?你能详细描述出进程切换的具体过程吗? - -如果你能在面试前自己发现这个问题,查漏补缺,面试的时候也会更游刃有余。 - -### 转移话题 - -转移话题,即改变话题方向。 - -举例: - -面试官问:为什么使用DH对称加密算法而不使用其他其他对称加密算法? - -两种回答: - -* 这个我没想过:sob: -* 我在完善项目时**不侧重于**将其与其他算法比较,而是把**精力更多地放在**DH算法的改进和优化上。 - -针对第二个回答,面试官会追问,那有哪些优化呢?而这个恰恰是我背得滚瓜烂熟的地方😍。 - -### 关于实习 - -实习重要吗?很重要,我去提前实习后,更清楚了企业看中实习经历的原因:**节省培养成本**,更快上手业务。 - -没有实习经历可以吗?可以,如果时间紧迫,秋招/春招前没有实习机会,那就花时间**把实习期需要学习的事情去做一做**,例如:学习GIT,搭建博客,学习开源项目,学习linux等(当然这些我实习前都没做,是实习的时候才知道的:joy:),这些放在简历上也是加分项。 - - -## 与代码随想录的故事 - -### **算法** - -今年二月初,刷题的时,看到carl哥的题解,觉得讲得很不错,关注了微信公众号:代码随想录。于是我就按照刷题攻略的顺序进行刷题,题解讲得很详细。在秋招前我几乎把当时所有题都刷完,而且刷了好几遍。面试时的出题命中率**真的很高(字节,蚂蚁的出的所有算法题都被包含在内)**,即使不是原题,实现的算法也是类似的。 - - - -### **公众号文章** - -公众号里的文章我也非常喜欢,比如各城市互联网公司的总结,之前一直没太注意这个事情,觉得头部不就是那几个大厂吗?冲就完了。秋招过后觉得这篇文章还是挺有用的,因为眼光**不能只局限于互联网大厂**,并不是任何时候都应该向大厂冲,适合自己才是最重要的。 - - - -### **知识星球** - -后来卡哥开了知识星球,我马上就申请进来了,这段时间一直在打卡,督促自己学习。星球上主要分为两大块内容:打卡系列和问答系列。 - -- 打卡系列,记录着各位同学的每日学习情况,其中有不少文章都总结得用心。 - -- **问答系列(对我帮助很大)**,主要包括**offer选择**,**学习路线**,**学习建议**;每天都会有同学提出自己的问题(当然我也问了不少),carl哥的回答很真诚,**也很有参考价值。** - - - -## 小结 - -秋招已告一段落, 这段时间真的经历了很多事情,虽然现在对结果没有很满意,但也积累了一些经验,走一步看一步吧。 - -大家可以结合着我的经历思考这么一个问题:**知识掌握到什么程度可以拿到一个什么水平的offer**?最后,祝大家都能拿到自己满意的offer~ - diff --git a/problems/知识星球精选/秋招总结2.md b/problems/知识星球精选/秋招总结2.md deleted file mode 100644 index 897a7ec3..00000000 --- a/problems/知识星球精选/秋招总结2.md +++ /dev/null @@ -1,48 +0,0 @@ -

- - - -# 倒霉透顶,触底反弹! - -星球里不少录友秋招已经陆续结束了,很多录友都在[知识星球](https://programmercarl.com/other/kstar.html)里写下了自己的秋招总结,但今天这位录友很特殊,甚至我给她修改简历的时候我都“有点愁”。 - -他的秋招过程也是极其坎坷,**逼签、被养鱼最后收到感谢信、校招流程收到实习offer,还有数不清的简历挂……**,可能是太倒霉了,最后触底反弹,接到了百度的offer,虽然是白菜价,但真的很不错了。 - -这篇总结并没有说学习路线,而是说一说她自己的感想,算是另一个维度,感觉会对大家很有帮助,所以我也分享出来。 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211114111745.png) - -以下星球原文: - -------------- - -秋招终于结束了,收到了百度C++开发、小米C++音视频开发、深信服C++开发、知乎go后端、神策java后端的offer,不是啥大佬,全是烂白菜,但是作为一个双非本的孩子,我觉得已经很幸运了,最终无脑选择了百度,春招还会再冲一波。 - -**星球里的学习气氛很好,向卡尔哥问过好几个问题,每个都挺长,卡尔哥也给我耐心解答过,还帮我改过简历,感谢和大家相遇!** 关于学习路线大佬们说的很详细了,我觉得参考他们的已经足够有价值。**那我就为星球里还在奋斗的兄弟姐妹、以及学弟学妹们写一下我的一些其他的感想**。 - -1、**准备一定要趁早**。我是今年1月份准备的实习,那个时候我连C++智能指针都不知道,就一直陆续学着,6月份上岸滴滴实习,8月下旬跑路,可以说9月份才开始大规模投递。我是很菜的人,还不算勤奋,秋招不至于空手而归就是找实习的时候还有些积淀。 所以最大的感想就是,一定要越早越好,我认为理想的时间节点:3月份去实习,7月份投提前批,所以什么时候去准备可以根据这个时间去准备,当然越早越好。越早企业越缺人,越好进。 - -2、**多面试,哪怕实习不了也要多面试;多投简历,投了就有机会**。我没啥自主学习的意识,只有在要面试的前一个礼拜才会多少看点,还记得当时收到第二天就要腾讯面试的消息,前一天晚上我几乎通宵了,虽然最后还是挂了。但是我当时真的是要面试的恐惧支配着我学习 。 - -3、**八股文、看书和刷题**。实习面试的话看八股文还是能应付过去的,但是我看了大多数八股文感觉千篇一律,想真正化为自己的东西还是要看书,我一般喜欢看书,然后把书上的东西化为自己的理解记在笔记上。 刷题也是,我一般喜欢根据自己的理解把题归类,自己写题解。 - -4、**实习。我觉得实习比较好的时间节点是3月份(或者更早)**,暑假去实习如果不能保证转正,感觉还是有点耽误提前批,提前批是最最最好进大厂的一次。像我的话,白天工作一天到晚上九十点,回家就只想躺着,再遇上比较push的工作环境,做到实习和复习兼顾是有点难的。我觉得核心竞争力应该是基础知识的掌握程度,身边确实没有实习、但是基础和项目足够牛批的人也能进大厂,所以还需要做一个平衡吧。当然也不是劝退,实在平衡不了的话就要要根据自身情况吧。 - -但是实习确实让我简历好过了一些,这个就是实习最大的好处之一,但是我感觉像美团腾讯百度的话,如果笔试面试还可以的话,应该不太卡简历的。字节后端确实有点卡实习,还有一些没那么大但是也很强的厂是卡学历或者实习的。 - -5、还有秋招不要all in,不要all in ,不要all in!!! - -以上就是我的一些感想,可能仁者见仁智者见智,希望大家多多指正。 - -我的秋招真的不是很顺利。逼签、被养鱼最后收到感谢信、校招流程收到实习offer,还有数不清的简历挂……,但是最后也有好的结果了,其实想的比较开,大不了就春招再进大厂呗。本来都要打算春招了,书都买了几本,但是没想到能收到百度意向,已经开始流程推进啦。 - -可能这就是倒霉透顶了就触底反弹吧。**一直觉得自己倒霉透了,奇葩的时间都被我遇上了,但是最后还是被好运眷顾了一下**。我的学校还是双非本,很一般的学校,所以任何时候都有机会,拿到offer不光是实力因素,运气成分也很大,大家一定要多投多面,万一哪次就上岸大厂了。 - -**还是想参与一下春招,但是现在发现躺着太舒服啦**。还是得卷起来,争取以后能每天在星球里打卡哈哈 - -祝愿各位都有理想的offer!所愿皆所得! - -------------- - -以上就是星球里的原文,所以这位录友现在又可以愉快的在星球里,每日打卡了 哈哈哈。 - diff --git a/problems/知识星球精选/秋招总结3.md b/problems/知识星球精选/秋招总结3.md deleted file mode 100644 index 05a677ed..00000000 --- a/problems/知识星球精选/秋招总结3.md +++ /dev/null @@ -1,83 +0,0 @@ -

- - - -# 秋招面试,心态很重要! - -其实无论社招,还是校招,心态都很重要,例如,别人那个一堆offer,自己陷入深深的焦虑。 面试分明感觉自己表现的不错,结果就是挂了。面试中遇到了面试官的否定,然后就开始自我怀疑,等等等。 - -如果你也遇到这些问题,可以认真读完[知识星球](https://programmercarl.com/other/kstar.html)里一位录友的总结,他是非科班,机械转码,今年5月份加入的星球,坚持打卡几个月,如果也获得自己心仪的offer,他的心路历程对大家会很有启发。 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211121093438.png) - -以下原文: - ----------------------- - -写在最前:作为最一般的秋招选手,希望能对和我有相似经历的录友提供一些帮助。 - -1、个人情况:本硕211机械转码,无竞赛,无实习。转码原因:机械的工资真的不高,也不是很喜欢天天画图的生活;导师教本科C/C++语言,研一当助教重新学了一下C++。 - -2、加入星球: - -3月份开学决定转码,3月到5月看C++primer和刷题,之前也是按题目顺序刷,效果一般。我是在LeetCode刷题的时候看到Carl哥的题解,然后关注随想录的GitHub,刷完链表在5.27决定加入的星球(那时还没有优惠,哈哈)现在也快半年了,那段时间是我最慌的时候,毕业课题没做完,秋招准备的也不行。刚看完C++ Primer,刷了几十题的状态。就是在星球打卡的这段时间学习比较认真,让我走过了比较难的一段路,感谢Carl哥的指导和各位录友的输出。(用Forest防止玩手机并记录了一下,6~9月平均学习15000分钟) - -3、秋招历程: - -6月到7月,C++基础就每天看一条《effective C++》,操作系统和计算机网络看书来不及就准备找网上大佬的精华过一遍然后直接面经。我找的是小林大佬的图解网络+图解操作系统,阿秀大佬的面经。(每日一问的主要来源)。 - -刷题大概每日一题+3道随想录+2剑指offer,7月完成一刷,8月底完成二刷。一刷的时候白天在LeetCode提交之后,晚上会在本子上手写总结一遍,理一理思路。二刷的时候就在Typora上快速记录了一下,节约时间。开始面试的时候题量:二刷完随想录+剑指offer,一共350题左右。在刷完以后可以上CodeTop刷各公司部门岗位的高频题。 - -7月份有的公司就陆陆续续开始提前批了,虽然知道提前批不需要笔试多一次机会,但是因为自己简历项目一块还比较单薄,一直没有进行投递。7月底买了《高性能服务器编程》一周多看完,然后做了一个基础的Web服务器,有不懂的就上网搜类似的解析。自己画了一下流程图之类的梳理了一下大概思路。第二个项目就是Carl哥的跳表项目,不是很长,主要是理解跳表这个数据结构,自己画一画就清楚了。 - -8月底开始投简历,对自己定位比较明确,主要以中厂为主,大厂随缘。8月底开始基本每天都有笔试,9月开始面试,一直到10月下旬结束秋招。面试的时候主要是录音,结束后进行面试总结,包括面试问题,手撕代码,面试表现(回答问题思路是否严谨,吐词是否清晰)。 - -其余关于实习,竞赛,面试的经验可以参考星球里其他大佬,哈哈哈。我感触比较深的是心态问题,这里写一写我自己遇到的心态问题和感想。 - - -4、心态很重要: - -心态问题1:同学或室友提前批就拿到了30大几w甚至更高的的offer,自己才开始笔试,说不羡慕是不可能的,有几天晚上都有一点焦虑没有睡好。这可能是因为自己并没有全力以赴,害怕因为自己的不努力而失去机会,后来每天都在按计划学习,每天都比较充实,抱着努力不后悔的心态。当你一心学习的时候就不太会一直考虑让自己焦虑的问题,总之一句话,冲就完事了。 - -心态问题2:总感觉自己没有准备好而不敢投简历。项目没准备或者面经记得不熟。其实投了简历以后还会有一段时间,包括HR筛简历,测评笔试才到面试,所以能投尽早投,在面试之前有压力的时候复习效率比较高的。 - -心态问题3:面试时的心态:心里默念一定要思考一下,然后慢慢说。我有一次面试,前面几个问题不是很顺利,然后问了我一个我会的,我就把我想到的一股脑说出来,我想着终于遇到一个我会的了,自我感觉良好,结果面试结束复盘的时候才发现,那个问题说的不是很全面而且说的比较快,面试官感觉可能很一般。 - -心态问题4:有时可能会紧张的不行,导致本来自己知道或者有思路而因为紧张语无伦次没有表达出来,从而影响面试表现(可以事先准备好自我介绍,流畅的自我介绍在一定程度上可以建立信心,减缓紧张。参加一些模拟面试,找同学模拟或者在网上模拟,还可以录一下视频,看一下自己的表现怎样,有什么地方需要注意;找一些中小厂练手实战也不错) - -心态问题5:面试后的心态,可能有时候觉得自己表现还不错但是面试挂了而愤愤不平,或者和同学一起面一家公司,同学过了,自己挂了。这个时候需要把心态放平,及时总结自己的面试表现,可能没有你想象的那么好。而且面试主观因素挺多的,结果和面试官有很大关系,所以做好自己,尽人事听天命。 - -心态问题6:面试过程中可能会遇到比较不好的面试官,导致面试体验比较差而影响自己的心态,这个时候也是需要及时发泄,不要自我否定或赌气,想着后面还有更多的机会,把更多精力投入到下一次面试或笔试中。我遇到的面试官都比较nice的,希望大家也一样! - -5、写在最后: - -最后对主要面试结果做一个总结:腾讯(笔试挂),百度(二面挂),最后拿到的:华为通用软开,深信服C++开发,科大讯飞C++,中电28所,30所。最后选择离家近的成都华为,总的来说虽然没去成大厂,但是自己已经很满意了。 - -最后的最后:说的有点多,比较啰嗦,感谢大家能看完。希望大家一定不要放弃,相信自己,能拿到自己想要的offer!! - ---------------- - -可以看一下这篇总结在星球下的评论: - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211121094859.png) - -**他在星球里知名度还是很高的,为啥知名度这么高呢?** - -因为他坚持几个月的打卡,而且打卡质量非常高,所以星球里的录友们都认识他。 - -来看看他的打卡内容: - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211121095337.png) - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211121095415.png) - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211121095712.png) - -我只是随便选了几条,他有将近200条的打卡记录,如果大家也在准备明年秋招,可以进星球里看看他的每日的打卡记录,相信会对规划自己的学习计划,任务安排 都很有帮助。 - -而且星球里的学习氛围会让你惊讶,原来有这么多大佬,还这么努力。 - -![星球氛围好](https://code-thinking-1253855093.file.myqcloud.com/pics/20211018000722.png) - -![看星球里的内容收获满满](https://code-thinking-1253855093.file.myqcloud.com/pics/20211025182654.png) - diff --git a/problems/知识星球精选/秋招的上半场.md b/problems/知识星球精选/秋招的上半场.md deleted file mode 100644 index 6c817577..00000000 --- a/problems/知识星球精选/秋招的上半场.md +++ /dev/null @@ -1,55 +0,0 @@ -

- - - - -# 秋招上半场的总结 - -八月份已经接近尾声,不少录友已经在[知识星球](https://programmercarl.com/other/kstar.html) 已经总结了秋招的上半场。 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210829214839.png) - -可以看出 这位录友也是身经百战,目前也拿到了几个offer。 - -星球里还有不少录友已经拿到了字节,阿里,百度提前批的offer。 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210829231035.png) - -不过绝大部分录友还在经受着考验,处于焦虑的状态,秋招上半场也是几多欢喜几多愁。 - -找工作其实是一个很虐心的过程,没有offer、没准备好、面试没发挥好、差一点就能把这题过了 等等,每一个场景都给大家增添一份焦虑。 - -星球里有一些录友就找到了一个方向,或者一个准备同一家公司的伙伴,就会好一些。 - -![找到了同伴交流](https://code-thinking-1253855093.file.myqcloud.com/pics/20210820093109.png) - -**有时候,有压力,自己憋着,没人交流,只会压力越来越大**。 - -对于还没有offer的录友,我对大家的建议也是,**心态要稳住,要适当放低预期,不是所有人都要大厂,但不能放低自己对学习的要求!** - -有些同学,经过几次面试的打击之后,直接就自暴自弃,狂玩几天想释放压力,这么做的结果,只会压力越来越大。 - -所以,**秋招进行时,大家不要过于放松,无论什么情况,只要没有拿到心仪offer,就不能放松,一旦放松之后,换来的就是更看不到希望**。 - -有的同学可能学校不好,有的同学是转行计算机,一路下来确实艰难。 - -我在星球里,看到的不仅是大家准备秋招过程的每日学习总结、打卡,也看到了一些录友的不容易。 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210829221259.png) - -说实话,看着评论区,还是很感动的,估计这位 打卡的录友,也得到了很大的鼓励。 - -这可能是 成千上万 目前正在冲刺秋招应届生 的一个缩影。 - -面试不仅仅是只看技术,也挺看缘分的,有的同学可能感觉莫名其妙的就挂了,有的同学可能感觉莫名其妙的就拿到了offer。 - -我就简单列举几个原因。 - -* 可能部门缺人,或满了 -* 可能是当天面试的同学都不太行,就矬子里拔大个 -* 可能之前有几个优秀的毕业生,但按照之前的标准都没过,然后面试官发现这么下去招不到人了,一下子就把标准降低了,然后轮到了你,你感觉你发挥的并不好,但也给你offer了。 - -所以面试也有很多很多其他因素,也很看缘分。 - -大家放平心态就好。 - diff --git a/problems/知识星球精选/秋招进行中的迷茫与焦虑.md b/problems/知识星球精选/秋招进行中的迷茫与焦虑.md deleted file mode 100644 index 24e7760c..00000000 --- a/problems/知识星球精选/秋招进行中的迷茫与焦虑.md +++ /dev/null @@ -1,55 +0,0 @@ -

- - - - -# 秋招进行时,其实大家都很焦虑 - -大家应该都发现了,提前批和秋招都越来越提前的,大部分的录友此时的心态还是挺焦虑的。 - -特别是大三的同学吧,同时面临这找工作和考研两个方向的诱惑。 - -一位录友就在[知识星球](https://programmercarl.com/other/kstar.html)问了我这个问题: - -![](https://code-thinking-1253855093.cos.ap-guangzhou.myqcloud.com/pics/20210724183240.png) - -其实 互联网35岁中年危机,应该吓退了不少小鲜肉,互联网35岁中年危机是真的,网上哪些关于裁员的消息 大多数也都是真的。 - -但我想说:特别是正在找工作的同学,大家应该都是 95后,00后,可以先不用想那么长远,能把未来五年规划好,就不错不错的了,现在行业的变化,都是两三年一变天,等大家35岁的时候,都不一定啥样了。 - -而且卡哥还替大家先趟趟路,哈哈哈 - -现在的大三,最忙的就是两伙人,**考研的和找工作的,这两条路都挺难的**。 - -另外还有不少录友应该在考研与找工作之间摇摆。可能有的学校大多数都在找工作,有的学校大多数都在考研,不过应该考研占绝大多数。 - -关于考研我的观点是,如果 本科毕业能拿到大厂或者中厂offer,可以不考研,看看自己比较优秀的学长学姐,毕业都去哪了,是否去了大厂,如果比较优秀的学长学姐 就业也一般,我还是推荐读研的,因为顺便也提升一下学历。 - -但有的同学是从大一入学就规划了自己 以后直接工作的,这种无论学校如何,我都是比较支持的! - -**因为从大一就明确自己的方向,按找工作的要求来学习,一般来说 最后找工作都不会差**。 - -最危险的是,大一大二没计划,到了大三开始摇摆,考研还是找工作。这种是最危险的,如果在纠结一阵纠结到 现在的话,那基本哪条路都走不好了。 - -对于现在找工作的录友,可能发现身边的同学都在考研,而且在准备找工作中,可能还没有明确的学习计划,东打一发西扯一下,就会很焦虑,主要也是身边一起工作的同学可能不多,交流的少。 - -找工作是一个累心的过程,非常累,恨不得哪家公司赶紧给我个offer,让我干啥都行,甚至怀疑自己是不是要再去考研。 - -**其实这时候,不是自己方法不对,也不是自己选择的路错了,而是需要一个过来人,给你打打气**。 - -静下心来,把最近开始面试的公司排一下,把自己还要学习的内容做好计划,都列出来,按着一步一步去执行,心里会踏实的多。 - -再说考研,考研也一点都不轻松,进大厂卷,**现在计算机考研比进大厂还卷(特别是名校计算机)**,如果考研没考上,找工作还挺难的,毕竟考研那套知识,对于找工作来说几乎没啥用。 - -所以不论是找工作,还是考研,大家都是一样的焦虑,每条路都不好走,但自己一旦选择了,就坚持下来,走好自己的路。 - -话再说回来,**现在不论身在什么阶段,都离不开“卷”,就算最后进了大厂工作,依然也是卷**。 - -大家都感觉自己准备面试好辛苦,好心累。其实给你面试的面试官,可能自己手上的模块线上又出问题了,还要担心年底是不是要背锅了,是不是年终没了,晋升不了了,是不是要准备跳槽了,甚至应届生的工资比自己的还高 等等。 - -**所以面试官也许比你还心累!** - -是不是想到这里,心里就舒服点了,哈哈哈哈,其实是有时候自己很迷茫但没有人沟通,就会陷入一个死循环,只要和过来人聊一聊,没啥大不了的。 - -大家其实这这样。 - diff --git a/problems/知识星球精选/英语到底重不重要.md b/problems/知识星球精选/英语到底重不重要.md deleted file mode 100644 index 5ee7fc2d..00000000 --- a/problems/知识星球精选/英语到底重不重要.md +++ /dev/null @@ -1,58 +0,0 @@ -

- - - - -# 对程序员来说,英语到底重不重要 - -在[知识星球](https://programmercarl.com/other/kstar.html)有一位录友问了我这么一个问题。 - -![](https://gitee.com/programmercarl/pics/raw/master/pic1/20210605193955.png) - -这个问题我曾经在上学的时候也思考过。 - -这次正好来好好说一说。 - -当时我搞ACM的时候都是英文题目的,哪会有中文题目,现在力扣全面汉化也是最近几年的事情。 - -如今又工作了这么多年后重新看待这个问题,又有更全面的看法了。 - -其实我想说,**对英语对程序员即重要,也不重要!** 这是要看环境,看背景的。 - -如果你现在在准备秋招,或者是跳槽,目标是冲刺国内大厂,那么暂时不用花费精力学英语,就算四级都没过,大厂面试官也不会问你过没过四六级的。 - -貌似华为对英语四六级是有要求的,如果面试BAT,英语不是关键性问题。 - -但工作之后,英语其实就很重要了,也要注意程序员英语和普通英语是不一样的。 - -一手的技术资料,和优秀的问答 基本都是英文的,国内的资料都是别人嚼过的,质量参差不齐。 - -而且国内的问答社区其实环境并不好(懂的人都懂),真正解决问题,还得靠Stack Overflow。 - -**所以技术文档(英文),Stack Overflow , Quora才是程序员的利器**。 - -工作以后如果你把程序员英语(注意不是普通英语)练好,其实对技能和视野的提升是很有帮助的。 - -这里为什么强调是程序员英语呢, 因为有太多专业词是CS特有的,而不是日常英语。 - -**继承,多态,变量,英文怎么说? 估计可以难住不少人了**。 - -所以当我们查问题的时候,第一反应 一定是用 中文关键词去搜索,因为我们不知道对应的英文关键词(也懒的去查一下)。 - -所以英语好,这是一种技术壁垒,可以任意遨游在中文和英文的世界里,有两极的思考! - -**那么对程序员来说,英语口语重要么?** - -如果你直接想去外企的话,练一练吧,也是挺重要的,如果在国内的话,用处不太大。 - -那一定有人说了:练好口语 一定是有利的。 - -这个我也 赞同,练啥其实都有有利的,但我们要看**投入产出比** - -我在学校的时候英语口语还是挺不错的,当时学校的留学生我基本都认识,和他们扯扯皮没问题,可工作这些年之后,全!都!还!回!去!了! - -所以如果练习口语,一定要有目标,要么就是雅思托付考试要出国,要么就一定要去外企找机会transfer美帝,这样有一个环境可以一直保持下去。 - -否则,花费大量时间练习,其实仅仅是感动自己,过不了多久,就都还回去。(例如说我,哈哈哈哈) - - diff --git a/problems/知识星球精选/要不要考研.md b/problems/知识星球精选/要不要考研.md deleted file mode 100644 index 180e5d13..00000000 --- a/problems/知识星球精选/要不要考研.md +++ /dev/null @@ -1,45 +0,0 @@ -

- - - - -# 到底要不要读研 - -在[知识星球](https://programmercarl.com/other/kstar.html)里讨论了一下关于要不要读研的问题。 - -![](https://gitee.com/programmercarl/pics/raw/master/pic1/20210613230829.png) - -其实不少同学纠结于计算机专业要不要考研。 - -我的观点是 **如果认为自己本科毕业 可以拿到大厂的研发岗offer,那么就不用读研**(除非保研到一个特别好的学校了)。 - -那么怎么能发现自己本科毕业能不能拿到大厂offer呢。 - -看看自己学生学哥学姐,大部分人的就业去向,如果很多都可以进入大厂,那么就可以追寻他们的足迹。 - -如果自己学校本科毕业,就业比较一般,那么就去读研吧。 - -当然这里还有一个情况,就是算法岗,算法岗一般要求研究生学历以上。但算法岗现在很卷,985高校研究生,找算法岗的工作都很难,既要顶会,也要coding的能力。 - -目前的现况是很多搞AI的985研究生都在转研发岗,**但如果你依然立志从事人工智能(说明是真的热爱),那么就去读研吧**。 - -研究生毕业去做研发岗和本科毕业做的研发,其工作其实没区别。那么为什么读研呢。 - -现在环境就比较卷,两个候选人,实力差不多,一个本科,一个研究生,价钱也差不多,那么大厂就要个研究生呗,在招生简章里看着也好看,说明公司都是高学历人才。 - -当然一般来说 研究生毕竟又多读了 两三年,普遍会比本科强一些。 - -**PS:大厂研发岗校招本科和研究生薪资几乎没啥差别**。 - - -那么话在说回来,**如果打算考研,那么就争取更好学校的研究生,提升一下学历,把考研所付出的努力最大化**。 - -最后关于本科生要不要读研: - -* 本科如果有实力去大厂做研发,那么就去! - -* 如果本科去不了大厂,可以考虑考研,考研是一次提升学历的机会,一旦选择考研这条路,就给自己点压力! - -* 如果知道AI岗位目前就业情况,依然要立志从事AI,那么就去读研 - - diff --git a/problems/知识星球精选/逼签.md b/problems/知识星球精选/逼签.md deleted file mode 100644 index f75e3642..00000000 --- a/problems/知识星球精选/逼签.md +++ /dev/null @@ -1,51 +0,0 @@ - -# 遭遇逼签,怎么办? - -最近各大公司陆续开奖了,也有不少公司开始逼签了。 - -为什么会有逼签呢,无疑就是 这家公司你不太想去,但还想要一个保底(备胎),同时这家公司也知道自己竞争力可能不是很大,也不想当大家的备胎,所以就要三天内必须签三方。 - -如果是心仪的公司要求三天内签三方,我相信大家就没有被逼签的感觉了,哈哈哈 - -[知识星球](https://programmercarl.com/other/kstar.html)里很多录友都问我,XX公司又要逼签了,怎么办。 我在公众号也分享一下,希望对大家有所帮助。 - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211017093816.png) - -以下是我的回答: - -TPLINK 的嵌入式,确实有点偏,但钱给的还真多 (估计是发现不好找人了)。 - -从发展来看,当然百度 虾皮 是首选,百度一般薪资不高,但我估计 虾皮薪资应该可以。 - -虾皮如果 10月底 才下offer的那,一般有更好的offer的同学 指定早就签了,我估计虾皮是能接受 毁约三方 也就是等你毁约三方,再签虾皮的 (注意,这是我猜的),要不 10月底 在下offer,优秀的毕业生遭抢没了。 所以如果能联系上HR的话,可以问一问,是否一定要三方。 - -你去签 TPLINK 三方的时候 也问问,毁约的流程,TPLINK 什么时候会退给你三方,如果是 TPLINK HR很坚决 不接受毁约的话,就等百度 和虾皮吧,到时候谈薪资的时候 拿tplink这个作为依据,高点要薪资。 - -如果 TPLINK HR 能接受毁约,给出 毁约 流程的话,那就签了。 (但这里不能排除 HR 口是心非,说是能毁约,最后不给你退三方的情况,所以多问问 有没有师兄毁约 TPLINK成功的) - -我当初校招的时候签的就是华为,也给三方了,毁约去的腾讯。我腾讯都入职了,华为才把三方退回来,我在补上三方,所以腾讯是不要求三方的,只要人去了就行。这个也看公司的。 - -------------- - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211017094407.png) - -以下是我的回答: - -7月开始自学c++,秋招就能拿到这些offer已经很棒了👍 - -先看逼签的这两家,其实我都不太了解,我的朋友们主要都在互联网圈,所以 没有认识的朋友在这两家公司。 - -不过 thoughtworks 网评不太好,说是外包公司, 中孚信息 至少是土生土长的企业,做网络安全,也是上市公司,至少会靠谱一些。 - -华为成都 光产品线的测开,如果你想真的有增进技术的心,测开就稍差了一些。 - -相对来说 小米南京的offer 还不错,但还在池子里。 - -如果逼签的话,优先考虑中孚吧。 - -关于 好好沉淀准备春招 当然是可以的,但不是每个同学都是劲再去冲春招了,找工作都是一鼓作气,如果你还能高强度的准备面试冲刺春招,当然是好的。 - -关键是 还有外部因素,毕业的事,以及大家该保研的保研了,找到工作了都吃喝玩乐了,天天聚餐,这个氛围下,你还能不能继续高强度冲刺了, 这才是你要考虑的。 - -加油💪 - diff --git a/problems/知识星球精选/非科班2021秋招总结.md b/problems/知识星球精选/非科班2021秋招总结.md deleted file mode 100644 index b92420ad..00000000 --- a/problems/知识星球精选/非科班2021秋招总结.md +++ /dev/null @@ -1,117 +0,0 @@ - -

- - - - -# 非科班,收获满满! - -九月份悄然已过,秋招已经快接近尾声了,星球里已经纷纷有录友开始写这次的秋招总结。 - -其中一位录友写的很好,所以想分享出来 给公众号上的录友也看一看,相信对大家有所启发,特别是明年要找工作的录友,值得好好看一看。 - -这篇总结首发在代码随想录[知识星球](https://programmercarl.com/other/kstar.html)上,立刻就获得了60个赞,很多评论,我这里放出一个截图: - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20210929220903.png) - -以下是星球上该录友的总结: - --------------------- - -211本硕非科班菜鸡转码不到一年,从最开始的迷茫到后面认识到差距的焦虑再到后面逐渐恢复坦然的心态,一路起起伏伏,但也算连滚带爬的趟了过来,**感激一路上耐心为我答疑解惑的各路大佬,尤其是咱们卡哥哈哈**。 - -秋招收获如下(按收到意向顺序): - -* 诺瓦星云 西安 软件开发工程师 提前批意向书 -* 字节跳动 抖音客户端开发工程师 提前批意向书 -* 滴滴 网约车部门后端开发工程师C++/Go 提前批意向书 -* 腾讯 IEG光子工作室技术中心测试开发 正式批意向书 -* 美团 基础研发平台后端开发工程师JAVA 正式批意向书 -* 阿里 阿里云计算平台后端开发工程师C++ 正式批意向书 - -被终结的岗位: -* 蔚来 提前批后端三面挂 -* 百度/京东 后端提前批无音讯,正式批笔试我就都拒了 -* 网易 正式批一面过,但感觉不喜欢,二面就放弃了 -* 虾皮 提前批二面挂(北京hc太少,卷不动,秋招甚至直接不放岗) -* 蓝湖 提前批二面挂(面完字节三面之后半个小时紧接着蓝湖二面,字节面了两个小时,人都麻了,强烈建议大家面试不要排太挤!!) -* 招银网络 正式批一面过,二面放弃 -* 商汤、oppo、知乎 提前批简历挂,后面懒得投了 - -# 秋招历程 - -## 开始准备 - -最开始的准备是从**去年十月份左右开始**,那个时候刚开始意识到自己将来找工作的问题,就选择了一门自己相对来说有一些基础的C++开始入手学习,看到网上的很多经验都说语言不是最大的问题,能学好一门后面转型都很快,所以并没有在这个问题上有什么纠结,大家看我拿到的岗位也可以发现事实确实如此。 - -**从十月份开始看C++ Primer这本书**,断断续续花了三个多月,确实拉胯。 - -当时主要是事情太多,而且我在熟悉完主要的语法和特性之后,大概一个月的时间吧,就开始上手刷leetcode了,入门真的很痛苦,递归啥的看一遍忘一遍,一天吭哧吭哧弄下来也就两三道题,还基本都不是自己写出来的,因为我光理解别人的方法就需要很长时间。 - -**后面刷题解刷到了卡哥,着实幸运,跟着卡哥的题解我也逐渐有了自己的方法模式和比较规范的代码风格**,所以到后面尽管有时候会发现也会有比卡哥更好的方法,我还是愿意先上手走一遍卡哥的思路,之后再补充别的。 - -**不得不说,题解能跟住一个人确实很有必要**,有的题卡哥没有出题解,我也是先找到之前卡哥类似的题目找思路,再自己写出来。整个刷题的流程持续到过年,我就开始刷剑指offer了,基本简单题都可以撕,中等困难的还是只能看题解。 - -我个人的经验是不愿意在思考题解上浪费太多时间,**如果打眼一看就知道自己不太可能做出来,我会选择直接看题解**,省下的时间哪怕自己多敲两遍也比对着屏幕发呆效率高,毕竟面试考察的不是你创造算法的能力,会用就行了,当然这只是个人见解,大佬息怒。 - -刷完剑指offer大概花了半个月的时间,**时间也来到了三月份**,周围的不少人已经开始找春招实习,但更多的人还是和我一样,由于各种原因没法去找实习。 - -这个时候各种情绪都会有,焦虑,迷茫,没办法,改变不了现实情况只能尽可能的提升自己。 - -这个时候我的算法已经比较熟练了,基本一天不用太多时间也能过四道题,尽管其中仍有不少是对着题解敲的,但是对别人思路的理解确实已经练得轻车熟路了,我觉得这也是一种进步吧。 - -**四月份开始准备项目**,没错,就是烂大街的webserver,大家都知道这个项目烂大街,但是经过后面的各种面试我也发现,不管你是什么项目,对于面试官来说都很基础。 - -哪怕是大厂实习的人又有几个能接触到核心,当然这也是对大部分人说的,实习大佬勿喷。**所以面试考察的就是你对基础的掌握**,就算你讲了项目各种高大上的方法,虽然可能有加分,但也是在给自己埋坑。 - -比如面试官可能问你有没有看过这个技术具体实现源码等等。 - -**把自己捧的越高,一旦被发现基础有漏洞,摔得也越惨**,面试官对每个人都会有一个心理预期,比如我可能就因为非科班占了一些心理预期比较低的便宜,也就是不容易让对方失望,客户端我0基础,测开0基础,但是都过了,当然像我这样的坏处就是offer大概率只是白菜,所以综合来看有利有弊,大家自己权衡。 - - -**搞这个webserver连带各种计网,操作系统的学习花了两个月的时间**。之后便开始了面向面经自习的流程。 - -这个时候算法题基本不再做新的了,力扣累计刷题已经接近400,我知道里面不少题就算再拿给我,我也不一定会做,所以做新题有什么意义呢,能把之前的高频题,热题刷好就已经超过很多人了。 - -因为之前做题都是自己按标签做,后面看到卡哥出了系列题解,基本都是我之前做过的,所以**花了一周左右就把卡哥的pdf全过了一遍,帮助很大**。 - -## 提前批 - -**后面六七月份的提前批我参与的不是特别积极**,和大多数人一样,我也总想着自己还没准备好,但是总得跨出第一步,所以就先找了一些小厂练手。 - -不过牛客上投的小厂基本都没有音讯,真正想投递还是官网最靠谱。 - -诺瓦是我的第一份offer,所以尽管我大概率去不了,我依然心怀感激,**因为经历过的人都知道第一份offer对于一个迷茫的秋招生来说是多么的宝贵**。 - -后面拿到字节和滴滴我着实没有想到,因为感觉自己的表现还有待提升,但能过肯定是开心的。 - -**提前批没有笔试,所以七月份的提前批窗口确实非常宝贵**。 - -## 正式秋招 - -八月份之后就比较正常了,基本就是笔试,面试等等,**可以分享的一点是腾讯、阿里这种大厂不是特别看重笔试**,因为很多人在笔试之前就走完面试流程了,但是对于有一些劣势的同学还是希望能认真对待笔试,争取让自己多一个闪光点。 - -后期的算法题主要都集中在高频题、热题上面,所以还是应该把剑指刷好,配合别人分享的面经来巩固,**卡哥的算法pdf可以多看多复习**,就算没有考到也会让自己安心一些。 - -同时对于基础知识的整理更多的应该从面经中获取,我个人秋招下来总共看了得有至少500份面经,其实别人的面经和自己面试没啥区别。 - -同时也因为看了太多的面经,我自己的面经就不需要太多的整理了,除了一些没答上来的关键问题,因为基本都被之前的涵盖了,所以与其海投参加一些不靠谱的面试,倒不如整理十份面经来得实在。 - -参加面试主要是锻炼临场的心态,但是大厂和小厂的面试确实是有区别的,所以大厂的面经一定要多看多整理。 - - -## 感想 - -一口气写下来就已经2000字了,最后还是多说两句,分享一点感想吧。 - -**除了超级大佬,基本每一个秋招生都会有过迷茫,焦虑的心路历程**。 - -一方面我们需要认识到自己的局限性,认清现实。 - -另一方面也应该看到自己能改变的现实,许多人的时间真的只是在盲目的焦虑中虚耗,这是一个死循环,浪费的时间越多后面只会越焦虑,唯一的方法就是打起精神行动起来。当然也不用把自己逼的太紧,找到合适的排解方式,比如打会儿球打会儿游戏,让自己运行在一个正确的,符合自己节奏的轨道上不断前进。 - -**面试是玄学,有些人的就是难,有些人的就是简单**,没有人能保证你每次都简单,但也不会每次都难,我们努力提升实力只是为了能创造更多机会,并在机会出现的时候把握住。 - -我觉得一个人最大的幸运就是付出的努力能有收获,所以我希望大家都能幸运地结束秋招,也希望我能继续不忘初心,保持谦逊。秋招只是人生的一段小插曲,未来的路还有很长很长,写下这篇流水账结束我的秋招,也希望能与诸君共勉,加油! - - diff --git a/problems/知识星球精选/非科班的困扰.md b/problems/知识星球精选/非科班的困扰.md deleted file mode 100644 index 470b233b..00000000 --- a/problems/知识星球精选/非科班的困扰.md +++ /dev/null @@ -1,54 +0,0 @@ -

- - - - -# 非科班的困扰! - -在[知识星球](https://programmercarl.com/other/kstar.html) 里很多录友都是非科班转码的,也是要准备求职,或者准备明年秋招,非科班的录友其实对 准备找工作所需要的知识不太清楚,对其难度也不太清楚,所有总感觉准备起来心里没有底。 - -例如星球里有这位录友的提问: - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211024102300.png) - -我在知识星球里,给出了详细的C++后端学习路线,包括计算机基础的学习路线, - -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211024103006.png) -![](https://code-thinking-1253855093.file.myqcloud.com/pics/20211024103108.png) - -当然路线很长,这里我就截图了一部分。 - -但即使这样,其实非科班的录友也不容易量化具体的工作量究竟多大。 - -以下是我对这位录友的回答: - ----------------- - -具体学习时间 一般是不好量化的。 - -一本书,有的同学 一周就看完了,有的同学 两个月看不明白,**基础程度,学习速度,每天的投入时间,以及效率**都是不一样的。 - -**所以要靠自己 规划时间,自己是最了解自己的**。 - -C++primer 不要耗太久,差不多就去看 effective C++。 - -还有计算机求职需要准备的知识不是线性排列的。 - -例如很多非科班的录友可能会这样安排: 几个月搞定编程语言,几个月搞定算法,几个月搞定操作系统! - -**如果这么学的话,那就凉凉了**。 - -求职准备主要围绕这么几块:编程语言 + 算法 + 计算机基础(操作系统,数据库,网络,设计模式)+ 项目 。 - -**这几块都可以一起搞的,一天都要分配点时间,知识错开点来学,效率更高**。 - -每一块知识,每天都要投入一点,例如,例如一天算法几个小时,编程语言几个小时,计算机基础几个小时,项目几个小时,这样分配,当你发现 操作系统比你想象中的难,你就 下周及时调整计划,操作系统每天多分配时间。 - -**正常的学习节奏是这样根据自己的掌握程度动态调整的**。 - -在整体进度上,可以先保证都过一遍,第一遍看的时候,不要死扣细节,会非常耽误时间,先过一遍有整体性的把控 更重要。 - -之后在针对面经或者八股文,去一个难点一个难点的攻克。 - -希望对非科班的录友们有所启发,加油💪 - diff --git a/problems/知识星球精选/面试中发散性问题.md b/problems/知识星球精选/面试中发散性问题.md deleted file mode 100644 index 5cade944..00000000 --- a/problems/知识星球精选/面试中发散性问题.md +++ /dev/null @@ -1,45 +0,0 @@ -

- - - - -# 面试中遇到发散性问题,应该怎么办? - -这周在[知识星球](https://programmercarl.com/other/kstar.html)有一位录友问了我这么一个问题,我感觉挺有代表性的,应该不少录友在面试中不论是社招还是校招都会遇到这一类的问题。 - -问题如下: - -![](https://gitee.com/programmercarl/pics/raw/master/pic1/20210529183636.png) - -首先面试官评价:基本的知识都懂还可以,但是知识碎片化。 - -因为现在基本大家都是背面经,所以对考点知识点掌握的都不错,确实对整体上理解不够。 - -但如果想对整体上理解深入,需要花费很大精力的,而且要把书看的很透彻,那这种候选人基本都是拔尖的。 - -关于操作系统啊,数据库等等,大多数录友应该都是靠面经,其实背面经也是最高效,性价比最高的方式的,如果真的去把书看透,一本《深入理解计算机系统》够看一年了。。。。 - -所以面试官基本不会因为这个问题而把你pass掉,那位提问的录友也是顺利进入了三面。 - -那么面试中遇到这种发散性问题应该怎么办呢? - -其实他问的这种问题,**就没指望你能说出 正确的答案,这是没有标准答案的**,例如淘宝京东的那种登录的场景 没有经历过 是不知道究竟怎么回事的。 - -而问你对操作系统的理解,也是千人千面没有标准的。 - -遇到这种问题,你就结合自己的想法,大胆说,不要说这个我不知道,那个我没遇到过之类的。 - -你说的解决方案,一定是有问题的,面试官在质疑你的时候,**你要表现出很兴奋,积极和面试官讨论:为什么不对**,然后说出你的观点,结合你所知道的理论知识。 - -大胆说,不要怕,一般情况你的理论知识都比面试官强,面试官工作好多年了基础知识早忘了,基本都是面试你前一天突击一个小时(暴漏真相了哈哈哈) - -**忌讳:面试官一质疑你,你就开始怀疑自己,心想那我说的不对吧,然后就不说话了。。。** - -最后这种发散性的问题,也没法去专门准备,因为这种问题主要是**考察候选人对技术的态度和沟通能力!** - -所以大家如果在面试遇到这一类发散性问题,一定要积极沟通,**表现出你对技术的追求和优秀的沟通能力**。 - -**注意 和面试官讨论的时候要面带微笑,不要板着脸,面试官也会喜欢以后和这样的人做同事!** - -好咯,心法已经传授给大家了。 - From c7e34a3f9b82d989b408b4303aee17bd192fb91f Mon Sep 17 00:00:00 2001 From: JackZJ <56966563+laerpeeK@users.noreply.github.com> Date: Thu, 28 Apr 2022 08:28:12 +0800 Subject: [PATCH 315/328] =?UTF-8?q?Update=20=E8=83=8C=E5=8C=85=E7=90=86?= =?UTF-8?q?=E8=AE=BA=E5=9F=BA=E7=A1=8001=E8=83=8C=E5=8C=85JavaScript?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新JavaScript版本二维数组做法,目前文档上的是运行不了的。 --- problems/背包理论基础01背包-1.md | 53 +++++++++++++++++++------------- 1 file changed, 31 insertions(+), 22 deletions(-) diff --git a/problems/背包理论基础01背包-1.md b/problems/背包理论基础01背包-1.md index fe940b4c..a844dcf5 100644 --- a/problems/背包理论基础01背包-1.md +++ b/problems/背包理论基础01背包-1.md @@ -380,31 +380,40 @@ func main() { ### javascript ```js -function testweightbagproblem (wight, value, size) { - const len = wight.length, - dp = array.from({length: len + 1}).map( - () => array(size + 1).fill(0) - ); - - for(let i = 1; i <= len; i++) { - for(let j = 0; j <= size; j++) { - if(wight[i - 1] <= j) { - dp[i][j] = math.max( - dp[i - 1][j], - value[i - 1] + dp[i - 1][j - wight[i - 1]] - ) - } else { - dp[i][j] = dp[i - 1][j]; - } - } - } +/** + * + * @param {Number []} weight + * @param {Number []} value + * @param {Number} size + * @returns + */ -// console.table(dp); - - return dp[len][size]; +function testWeightBagProblem(weight, value, size) { +const len = weight.length, +dp = Array.from({length: len}).map( +() => Array(size + 1)) //JavaScript 数组是引用类型 +for(let i = 0; i < len; i++) { //初始化最左一列,即背包容量为0时的情况 +dp[i][0] = 0; +} +for(let j = 1; j < size+1; j++) { //初始化第0行, 只有一件物品的情况 +if(weight[0] <= j) { +dp[0][j] = value[0]; +} else { +dp[0][j] = 0; +} +} + +for(let i = 1; i < len; i++) { //dp[i][j]由其左上方元素推导得出 +for(let j = 1; j < size+1; j++) { +if(j < weight[i]) dp[i][j] = dp[i - 1][j]; +else dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j - weight[i]] + value[i]); +} } -function testWeightBagProblem2 (wight, value, size) { +return dp[len-1][size] //满足条件的最大值 +} + +function testWeightBagProblem2 (wight, value, size)4 { const len = wight.length, dp = Array(size + 1).fill(0); for(let i = 1; i <= len; i++) { From 0694fac15bf6b7d18a53adc9f6ad0c33b51db016 Mon Sep 17 00:00:00 2001 From: JackZJ <56966563+laerpeeK@users.noreply.github.com> Date: Thu, 28 Apr 2022 08:30:30 +0800 Subject: [PATCH 316/328] =?UTF-8?q?Update=20=E8=83=8C=E5=8C=85=E7=90=86?= =?UTF-8?q?=E8=AE=BA=E5=9F=BA=E7=A1=8001=E8=83=8C=E5=8C=85JavaScript?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新背包理论基础01背包JavaScript代码块 - 二维数组做法1, 目前主线上的是有问题的。 --- problems/背包理论基础01背包-1.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/背包理论基础01背包-1.md b/problems/背包理论基础01背包-1.md index a844dcf5..d6bc5520 100644 --- a/problems/背包理论基础01背包-1.md +++ b/problems/背包理论基础01背包-1.md @@ -413,7 +413,7 @@ else dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j - weight[i]] + value[i]); return dp[len-1][size] //满足条件的最大值 } -function testWeightBagProblem2 (wight, value, size)4 { +function testWeightBagProblem2 (wight, value, size) { const len = wight.length, dp = Array(size + 1).fill(0); for(let i = 1; i <= len; i++) { From 5fd43cfd0a5770e0cb532687766f64306b5bbfed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=91=A3xx?= Date: Thu, 28 Apr 2022 22:20:22 +0800 Subject: [PATCH 317/328] =?UTF-8?q?0300.=E6=9C=80=E9=95=BF=E4=B8=8A?= =?UTF-8?q?=E5=8D=87=E5=AD=90=E5=BA=8F=E5=88=97-go=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E8=A7=84=E5=88=92=E6=B1=82=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0300.最长上升子序列.md | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/problems/0300.最长上升子序列.md b/problems/0300.最长上升子序列.md index dfdd5125..f68edb5a 100644 --- a/problems/0300.最长上升子序列.md +++ b/problems/0300.最长上升子序列.md @@ -168,6 +168,39 @@ func lengthOfLIS(nums []int ) int { } ``` +```go +// 动态规划求解 +func lengthOfLIS(nums []int) int { + // dp数组的定义 dp[i]表示取第i个元素的时候,表示子序列的长度,其中包括 nums[i] 这个元素 + dp := make([]int, len(nums)) + + // 初始化,所有的元素都应该初始化为1 + for i := range dp { + dp[i] = 1 + } + + ans := dp[0] + for i := 1; i < len(nums); i++ { + for j := 0; j < i; j++ { + if nums[i] > nums[j] { + dp[i] = max(dp[i], dp[j] + 1) + } + } + if dp[i] > ans { + ans = dp[i] + } + } + return ans +} + +func max(x, y int) int { + if x > y { + return x + } + return y +} +``` + Javascript ```javascript const lengthOfLIS = (nums) => { From 6f85c2ad3a6daf8e0098b08e61b7fdd68d78c757 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=91=A3xx?= Date: Fri, 29 Apr 2022 00:50:22 +0800 Subject: [PATCH 318/328] =?UTF-8?q?0674.=E6=9C=80=E9=95=BF=E8=BF=9E?= =?UTF-8?q?=E7=BB=AD=E9=80=92=E5=A2=9E=E5=BA=8F=E5=88=97-go=E5=8A=A8?= =?UTF-8?q?=E6=80=81=E8=A7=84=E5=88=92=E6=B1=82=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0674.最长连续递增序列.md | 39 +++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/problems/0674.最长连续递增序列.md b/problems/0674.最长连续递增序列.md index e941d242..56e95d97 100644 --- a/problems/0674.最长连续递增序列.md +++ b/problems/0674.最长连续递增序列.md @@ -236,6 +236,45 @@ class Solution: ``` Go: +> 动态规划: +```go +func findLengthOfLCIS(nums []int) int { + if len(nums) == 0 {return 0} + res, count := 1, 1 + for i := 0; i < len(nums)-1; i++ { + if nums[i+1] > nums[i] { + count++ + }else { + count = 1 + } + if count > res { + res = count + } + } + return res +} +``` + +> 贪心算法: +```go +func findLengthOfLCIS(nums []int) int { + if len(nums) == 0 {return 0} + dp := make([]int, len(nums)) + for i := 0; i < len(dp); i++ { + dp[i] = 1 + } + res := 1 + for i := 0; i < len(nums)-1; i++ { + if nums[i+1] > nums[i] { + dp[i+1] = dp[i] + 1 + } + if dp[i+1] > res { + res = dp[i+1] + } + } + return res +} +``` Javascript: From 31eb619ea18d05e004da853d70b165ba47291c92 Mon Sep 17 00:00:00 2001 From: Anmizi <1845513904@qq.com> Date: Fri, 29 Apr 2022 19:15:41 +0800 Subject: [PATCH 319/328] =?UTF-8?q?=E4=BC=98=E5=8C=96JS=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=20(0039.=E7=BB=84=E5=90=88=E6=80=BB=E5=92=8C?= =?UTF-8?q?.md)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0039.组合总和.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/problems/0039.组合总和.md b/problems/0039.组合总和.md index 98b37b84..e10a827f 100644 --- a/problems/0039.组合总和.md +++ b/problems/0039.组合总和.md @@ -370,18 +370,17 @@ func backtracking(startIndex,sum,target int,candidates,trcak []int,res *[][]int) ```js var combinationSum = function(candidates, target) { const res = [], path = []; - candidates.sort(); // 排序 + candidates.sort((a,b)=>a-b); // 排序 backtracking(0, 0); return res; function backtracking(j, sum) { - if (sum > target) return; if (sum === target) { res.push(Array.from(path)); return; } for(let i = j; i < candidates.length; i++ ) { const n = candidates[i]; - if(n > target - sum) continue; + if(n > target - sum) break; path.push(n); sum += n; backtracking(i, sum); From dac0b4a12e43670eb54eaa6da5fa3f07cb707424 Mon Sep 17 00:00:00 2001 From: GitHubQAQ <31883473+GitHubQAQ@users.noreply.github.com> Date: Fri, 29 Apr 2022 21:03:27 +0800 Subject: [PATCH 320/328] =?UTF-8?q?Update=200106.=E4=BB=8E=E4=B8=AD?= =?UTF-8?q?=E5=BA=8F=E4=B8=8E=E5=90=8E=E5=BA=8F=E9=81=8D=E5=8E=86=E5=BA=8F?= =?UTF-8?q?=E5=88=97=E6=9E=84=E9=80=A0=E4=BA=8C=E5=8F=89=E6=A0=91.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 优化代码高亮 --- problems/0106.从中序与后序遍历序列构造二叉树.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/problems/0106.从中序与后序遍历序列构造二叉树.md b/problems/0106.从中序与后序遍历序列构造二叉树.md index 496de431..4396bc76 100644 --- a/problems/0106.从中序与后序遍历序列构造二叉树.md +++ b/problems/0106.从中序与后序遍历序列构造二叉树.md @@ -103,7 +103,7 @@ TreeNode* traversal (vector& inorder, vector& postorder) { 中序数组相对比较好切,找到切割点(后序数组的最后一个元素)在中序数组的位置,然后切割,如下代码中我坚持左闭右开的原则: -```C++ +```CPP // 找到中序遍历的切割点 int delimiterIndex; for (delimiterIndex = 0; delimiterIndex < inorder.size(); delimiterIndex++) { @@ -130,7 +130,7 @@ vector rightInorder(inorder.begin() + delimiterIndex + 1, inorder.end() ); 代码如下: -``` +```CPP // postorder 舍弃末尾元素,因为这个元素就是中间节点,已经用过了 postorder.resize(postorder.size() - 1); @@ -144,7 +144,7 @@ vector rightPostorder(postorder.begin() + leftInorder.size(), postorder.end 接下来可以递归了,代码如下: -``` +```CPP root->left = traversal(leftInorder, leftPostorder); root->right = traversal(rightInorder, rightPostorder); ``` From 5b3607c6a151b6fd6dd548c1b26f3f1fb8514047 Mon Sep 17 00:00:00 2001 From: Anmizi <1845513904@qq.com> Date: Fri, 29 Apr 2022 23:18:33 +0800 Subject: [PATCH 321/328] =?UTF-8?q?=E4=BF=AE=E6=94=B9=200040.=E7=BB=84?= =?UTF-8?q?=E5=90=88=E6=80=BB=E5=92=8CII.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0040.组合总和II.md | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/problems/0040.组合总和II.md b/problems/0040.组合总和II.md index de13e031..34ac64e6 100644 --- a/problems/0040.组合总和II.md +++ b/problems/0040.组合总和II.md @@ -508,22 +508,27 @@ func backtracking(startIndex,sum,target int,candidates,trcak []int,res *[][]int) */ var combinationSum2 = function(candidates, target) { const res = []; path = [], len = candidates.length; - candidates.sort(); + candidates.sort((a,b)=>a-b); backtracking(0, 0); return res; function backtracking(sum, i) { - if (sum > target) return; if (sum === target) { res.push(Array.from(path)); return; } - let f = -1; for(let j = i; j < len; j++) { const n = candidates[j]; - if(n > target - sum || n === f) continue; + if(j > i && candidates[j] === candidates[j-1]){ + //若当前元素和前一个元素相等 + //则本次循环结束,防止出现重复组合 + continue; + } + //如果当前元素值大于目标值-总和的值 + //由于数组已排序,那么该元素之后的元素必定不满足条件 + //直接终止当前层的递归 + if(n > target - sum) break; path.push(n); sum += n; - f = n; backtracking(sum, j + 1); path.pop(); sum -= n; From ce28066ae92780a3829883b387dc004bc76df57d Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Wed, 4 May 2022 18:06:13 +0800 Subject: [PATCH 322/328] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=B5=84=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1d7f219d..501c5ed4 100644 --- a/README.md +++ b/README.md @@ -543,6 +543,7 @@ **来看看就知道了,你会发现相见恨晚!** - -

+ + +
From aacbbfbd02613a7110e913fa00298ef0734107ac Mon Sep 17 00:00:00 2001 From: programmercarl <826123027@qq.com> Date: Wed, 4 May 2022 18:11:46 +0800 Subject: [PATCH 323/328] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=B5=84=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 501c5ed4..38418322 100644 --- a/README.md +++ b/README.md @@ -531,7 +531,8 @@ 如果是已工作,备注:姓名-城市-岗位-组队刷题。如果学生,备注:姓名-学校-年级-组队刷题。**备注没有自我介绍不通过哦** -
+ +
@@ -545,5 +546,5 @@ -
+
From 00b5e2aa64f49ce9273aca6aa8074d98fe4e489a Mon Sep 17 00:00:00 2001 From: eat to 160 pounds <2915390277@qq.com> Date: Fri, 6 May 2022 15:06:32 +0800 Subject: [PATCH 324/328] =?UTF-8?q?131=E5=88=86=E5=89=B2=E5=AD=97=E7=AC=A6?= =?UTF-8?q?=E4=B8=B2=E6=9B=B4=E6=B8=85=E6=A5=9A=E7=9A=84typescript?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0131.分割回文串.md | 41 +++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/problems/0131.分割回文串.md b/problems/0131.分割回文串.md index 10b747cb..7a702898 100644 --- a/problems/0131.分割回文串.md +++ b/problems/0131.分割回文串.md @@ -454,31 +454,36 @@ var partition = function(s) { ```typescript function partition(s: string): string[][] { - function isPalindromeStr(s: string, left: number, right: number): boolean { - while (left < right) { - if (s[left++] !== s[right--]) { - return false; + const res: string[][] = [] + const path: string[] = [] + const isHuiwen = ( + str: string, + startIndex: number, + endIndex: number + ): boolean => { + for (; startIndex < endIndex; startIndex++, endIndex--) { + if (str[startIndex] !== str[endIndex]) { + return false } } - return true; + return true } - function backTracking(s: string, startIndex: number, route: string[]): void { - let length: number = s.length; - if (length === startIndex) { - resArr.push(route.slice()); - return; + const rec = (str: string, index: number): void => { + if (index >= str.length) { + res.push([...path]) + return } - for (let i = startIndex; i < length; i++) { - if (isPalindromeStr(s, startIndex, i)) { - route.push(s.slice(startIndex, i + 1)); - backTracking(s, i + 1, route); - route.pop(); + for (let i = index; i < str.length; i++) { + if (!isHuiwen(str, index, i)) { + continue } + path.push(str.substring(index, i + 1)) + rec(str, i + 1) + path.pop() } } - const resArr: string[][] = []; - backTracking(s, 0, []); - return resArr; + rec(s, 0) + return res }; ``` From 132e57e2ddd801d7360401e746d945957c7e0801 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E4=BB=A4=E4=BB=A4?= Date: Sat, 7 May 2022 09:57:27 +0800 Subject: [PATCH 325/328] =?UTF-8?q?Update=200332.=E9=87=8D=E6=96=B0?= =?UTF-8?q?=E5=AE=89=E6=8E=92=E8=A1=8C=E7=A8=8B.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 恢复0332 原go代码 --- problems/0332.重新安排行程.md | 58 +++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/problems/0332.重新安排行程.md b/problems/0332.重新安排行程.md index d087d97b..c71b2a93 100644 --- a/problems/0332.重新安排行程.md +++ b/problems/0332.重新安排行程.md @@ -342,6 +342,64 @@ class Solution: return path ``` +### GO +```go +type pair struct { + target string + visited bool +} +type pairs []*pair + +func (p pairs) Len() int { + return len(p) +} +func (p pairs) Swap(i, j int) { + p[i], p[j] = p[j], p[i] +} +func (p pairs) Less(i, j int) bool { + return p[i].target < p[j].target +} + +func findItinerary(tickets [][]string) []string { + result := []string{} + // map[出发机场] pair{目的地,是否被访问过} + targets := make(map[string]pairs) + for _, ticket := range tickets { + if targets[ticket[0]] == nil { + targets[ticket[0]] = make(pairs, 0) + } + targets[ticket[0]] = append(targets[ticket[0]], &pair{target: ticket[1], visited: false}) + } + for k, _ := range targets { + sort.Sort(targets[k]) + } + result = append(result, "JFK") + var backtracking func() bool + backtracking = func() bool { + if len(tickets)+1 == len(result) { + return true + } + // 取出起飞航班对应的目的地 + for _, pair := range targets[result[len(result)-1]] { + if pair.visited == false { + result = append(result, pair.target) + pair.visited = true + if backtracking() { + return true + } + result = result[:len(result)-1] + pair.visited = false + } + } + return false + } + + backtracking() + + return result +} +``` + ### C语言 ```C From 29f41716f971506a001e8eb369b3f62964b43e8e Mon Sep 17 00:00:00 2001 From: GitHubQAQ <31883473+GitHubQAQ@users.noreply.github.com> Date: Sat, 7 May 2022 10:12:58 +0800 Subject: [PATCH 326/328] =?UTF-8?q?Update=200093.=E5=A4=8D=E5=8E=9FIP?= =?UTF-8?q?=E5=9C=B0=E5=9D=80.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 优化C++版本剪枝 当字符串长度小于4时,无法组成正确的IP地址,直接返回。 关于判断是否为数字的部分,是否有必要(题目明确说明s仅由数字组成) [从解题角度可以删去,保留的话增加容错,个人意见] --- problems/0093.复原IP地址.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/0093.复原IP地址.md b/problems/0093.复原IP地址.md index 7910fc50..6401824b 100644 --- a/problems/0093.复原IP地址.md +++ b/problems/0093.复原IP地址.md @@ -227,7 +227,7 @@ private: public: vector restoreIpAddresses(string s) { result.clear(); - if (s.size() > 12) return result; // 算是剪枝了 + if (s.size() < 4 || s.size() > 12) return result; // 算是剪枝了 backtracking(s, 0, 0); return result; } From 0e5e657a6d5ba057e8dfa77019b25c5404fe9a9b Mon Sep 17 00:00:00 2001 From: 243wresfdxvc Date: Tue, 10 May 2022 23:04:35 +0000 Subject: [PATCH 327/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200404.=E5=B7=A6?= =?UTF-8?q?=E5=8F=B6=E5=AD=90=E4=B9=8B=E5=92=8C.md=20C=E8=AF=AD=E8=A8=80?= =?UTF-8?q?=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0404.左叶子之和.md | 49 +++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/problems/0404.左叶子之和.md b/problems/0404.左叶子之和.md index 6420da81..d7fd629e 100644 --- a/problems/0404.左叶子之和.md +++ b/problems/0404.左叶子之和.md @@ -466,6 +466,55 @@ func sumOfLeftLeaves(_ root: TreeNode?) -> Int { } ``` +## C +递归法: +```c +int sumOfLeftLeaves(struct TreeNode* root){ + // 递归结束条件:若当前结点为空,返回0 + if(!root) + return 0; + + // 递归取左子树的左结点和和右子树的左结点和 + int leftValue = sumOfLeftLeaves(root->left); + int rightValue = sumOfLeftLeaves(root->right); + + // 若当前结点的左结点存在,且其为叶子结点。取它的值 + int midValue = 0; + if(root->left && (!root->left->left && !root->left->right)) + midValue = root->left->val; + + return leftValue + rightValue + midValue; +} +``` + +迭代法: +```c +int sumOfLeftLeaves(struct TreeNode* root){ + struct TreeNode* stack[1000]; + int stackTop = 0; + + // 若传入root结点不为空,将其入栈 + if(root) + stack[stackTop++] = root; + + int sum = 0; + //若栈不为空,进行循环 + while(stackTop) { + // 出栈栈顶元素 + struct TreeNode *topNode = stack[--stackTop]; + // 若栈顶元素的左孩子为左叶子结点,将其值加入sum中 + if(topNode->left && (!topNode->left->left && !topNode->left->right)) + sum += topNode->left->val; + + // 若当前栈顶结点有左右孩子。将他们加入栈中进行遍历 + if(topNode->right) + stack[stackTop++] = topNode->right; + if(topNode->left) + stack[stackTop++] = topNode->left; + } + return sum; +} +``` ----------------------- From a5db99363b1bca72345036228776a0320242c8c4 Mon Sep 17 00:00:00 2001 From: SevenMonths Date: Sun, 15 May 2022 15:35:08 +0800 Subject: [PATCH 328/328] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880035.?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E6=8F=92=E5=85=A5=E4=BD=8D=E7=BD=AE.md?= =?UTF-8?q?=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0PHP=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0035.搜索插入位置.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/problems/0035.搜索插入位置.md b/problems/0035.搜索插入位置.md index 9a770703..8a8f9706 100644 --- a/problems/0035.搜索插入位置.md +++ b/problems/0035.搜索插入位置.md @@ -318,6 +318,31 @@ func searchInsert(_ nums: [Int], _ target: Int) -> Int { ``` +### PHP + +```php +// 二分法(1):[左闭右闭] +function searchInsert($nums, $target) +{ + $n = count($nums); + $l = 0; + $r = $n - 1; + while ($l <= $r) { + $mid = floor(($l + $r) / 2); + if ($nums[$mid] > $target) { + // 下次搜索在左区间:[$l,$mid-1] + $r = $mid - 1; + } else if ($nums[$mid] < $target) { + // 下次搜索在右区间:[$mid+1,$r] + $l = $mid + 1; + } else { + // 命中返回 + return $mid; + } + } + return $r + 1; +} +``` -----------------------