From 40077b121944370a5af97f30d64f11076cce2006 Mon Sep 17 00:00:00 2001 From: xcg <852390212@qq.com> Date: Tue, 19 Mar 2019 16:58:43 +0800 Subject: [PATCH 001/163] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E5=9B=BE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\345\233\276.md" | 460 +++++++++++++++++++++++++++++++++++++ 1 file changed, 460 insertions(+) diff --git "a/LeetCode/\345\233\276.md" "b/LeetCode/\345\233\276.md" index 33ea1f6..dfdc9fc 100644 --- "a/LeetCode/\345\233\276.md" +++ "b/LeetCode/\345\233\276.md" @@ -10,6 +10,12 @@ * **并查集** * [冗余连接](#冗余连接) (`medium`) * [朋友圈](#朋友圈) (`medium`) + * **最短路径** + * [最短路径.一](#最短路径.一) (`hard` `迪杰斯特拉算法`) + * **最小生成树** + * [最小生成树一.Prim算法](##最小生成树一.Prim算法) + * [最小生成树二.Kruscal算法](最小生成树二.Kruscal算法) + * **其他** * [课程表](#课程表) (`medium` `拓扑排序`) * [课程表II](#课程表II) (`medium` `拓扑排序`) @@ -1119,3 +1125,457 @@ public: } }; ``` + + + +## 最短路径.一 + +[hihoCoder链接](http://hihocoder.com/problemset/problem/1081) + +### 描述 + +万圣节的早上,小Hi和小Ho在经历了一个小时的争论后,终于决定了如何度过这样有意义的一天——他们决定去闯鬼屋! + +在鬼屋门口排上了若干小时的队伍之后,刚刚进入鬼屋的小Hi和小Ho都颇饥饿,于是他们决定利用进门前领到的地图,找到一条通往终点的最短路径。 + +鬼屋中一共有N个地点,分别编号为1..N,这N个地点之间互相有一些道路连通,两个地点之间可能有多条道路连通,但是并不存在一条两端都是同一个地点的道路。那么小Hi和小Ho至少要走多少路程才能够走出鬼屋去吃东西呢? + +### 输入 + +每个测试点(输入文件)有且仅有一组测试数据。 + +在一组测试数据中: + +第1行为4个整数N、M、S、T,分别表示鬼屋中地点的个数和道路的条数,入口(也是一个地点)的编号,出口(同样也是一个地点)的编号。 + +接下来的M行,每行描述一条道路:其中的第i行为三个整数u_i, v_i, length_i,表明在编号为u_i的地点和编号为v_i的地点之间有一条长度为length_i的道路。 + +对于100%的数据,满足N<=10^3,M<=10^4, 1 <= length_i <= 10^3, 1 <= S, T <= N, 且S不等于T。 + +对于100%的数据,满足小Hi和小Ho总是有办法从入口通过地图上标注出来的道路到达出口。 + +### 输出 + +对于每组测试数据,输出一个整数Ans,表示那么小Hi和小Ho为了走出鬼屋至少要走的路程。 + +样例输入 + +``` +5 23 5 4 +1 2 708 +2 3 112 +3 4 721 +4 5 339 +5 4 960 +1 5 849 +2 5 98 +1 4 99 +2 4 25 +2 1 200 +3 1 146 +3 2 106 +1 4 860 +4 1 795 +5 4 479 +5 4 280 +3 4 341 +1 4 622 +4 2 362 +2 3 415 +4 1 904 +2 1 716 +2 5 575 +``` + +样例输出 + +``` +123 +``` + + + +### 解答 + +迪杰斯特拉算法 + +```c++ +#include +#include +#include +#include +using namespace std; + +void Dijkstral(int src,vector& dist,vector& vis,vector>& graph) +{ + int vex = graph.size(); + while (1) + { + int idx = -1; + int dis = INT_MAX; + for (int i=0;i graph[idx][i] + dist[idx]) + dist[i] = graph[idx][i] + dist[idx]; + } + } + + + } +} + +int main() +{ + int vex,edge; + cin >> vex >> edge; + int src,dst; + cin >> src >> dst; + vector> graph(vex,vector(vex,INT_MAX)); + + while (edge--) + { + int a,b,len; + cin >> a >> b >> len; + graph[a-1][b-1] = min(graph[a-1][b-1],len); + graph[b-1][a-1] = graph[a-1][b-1]; + } + + vector dist(vex,INT_MAX); + dist[src-1] = 0; + for(int i=0;i vis(vex,false); + + Dijkstral(src,dist,vis,graph); + + cout << dist[dst-1] << endl; + + return 0; +} +``` + + + +## 最小生成树一.Prim算法 + +[hihoCoder链接](http://hihocoder.com/problemset/problem/1097?sid=1402285) + +### 描述 + +最近,小Hi很喜欢玩的一款游戏模拟城市开放出了新Mod,在这个Mod中,玩家可以拥有不止一个城市了! + +但是,问题也接踵而来——小Hi现在手上拥有N座城市,且已知这N座城市中任意两座城市之间建造道路所需要的费用,小Hi希望知道,最少花费多少就可以使得任意两座城市都可以通过所建造的道路互相到达(假设有A、B、C三座城市,只需要在AB之间和BC之间建造道路,那么AC之间也是可以通过这两条道路连通的)。 + +### 输入 + +每个测试点(输入文件)有且仅有一组测试数据。 + +在一组测试数据中: + +第1行为1个整数N,表示小Hi拥有的城市数量。 + +接下来的N行,为一个N*N的矩阵A,描述任意两座城市之间建造道路所需要的费用,其中第i行第j个数为Aij,表示第i座城市和第j座城市之间建造道路所需要的费用。 + +对于100%的数据,满足N<=10^3,对于任意i,满足Aii=0,对于任意i, j满足Aij=Aji, 0 +#include +#include +#include +using namespace std; + + +void Prim(vector& dist,vector>& graph,int& sum) +{ + int vex = graph.size(); + while (1) + { + int idx = -1; + int dis = INT_MAX; + for (int i=0;i graph[idx][i]) + { + dist[i] = graph[idx][i]; + } + } + } + } +} + +int main() +{ + int vex; + cin >> vex; + vector> graph(vex,vector(vex,0)); + + for(int i=0;i> a; + graph[i][j] = a; + } + + vector dist(vex,INT_MAX); + dist[0] = 0; + for(int i=1;i +#include +#include +#include +#include +using namespace std; + + +struct edge +{ + int begin; + int end; + int weight; + edge(int b,int e,int w):begin(b),end(e),weight(w){} +}; + +inline bool cmp(const edge& e1,const edge& e2) +{ + return e1.weight > e2.weight; +} + +int findRoot(int idx,const vector& path) +{ + while(path[idx] != idx) + { + idx = path[idx]; + } + + return idx; +} + +void Kruscal(vector& graph,int& sum,const int& v) +{ + int e = graph.size(); + int cnt = 0; + + //根据权值weight建立最小堆,建立堆时间复杂度O(e) + make_heap(graph.begin(),graph.end(),cmp); + vector path(v,0); + for (int i=0;i> N >> M; + vector> graph(N,vector(N,INT_MAX)); + for(int i=0;i> a >> b >> w; + graph[a-1][b-1] = min(graph[a-1][b-1],w); + } + + vector edges; + for (int i=0;i Date: Tue, 19 Mar 2019 17:03:02 +0800 Subject: [PATCH 002/163] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E5=9B=BE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\345\233\276.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/LeetCode/\345\233\276.md" "b/LeetCode/\345\233\276.md" index dfdc9fc..df52973 100644 --- "a/LeetCode/\345\233\276.md" +++ "b/LeetCode/\345\233\276.md" @@ -11,10 +11,10 @@ * [冗余连接](#冗余连接) (`medium`) * [朋友圈](#朋友圈) (`medium`) * **最短路径** - * [最短路径.一](#最短路径.一) (`hard` `迪杰斯特拉算法`) + * [最短路径.一](#最短路径一) (`hard` `迪杰斯特拉算法`) * **最小生成树** - * [最小生成树一.Prim算法](##最小生成树一.Prim算法) - * [最小生成树二.Kruscal算法](最小生成树二.Kruscal算法) + * [最小生成树一.Prim算法](##最小生成树一prim算法) (`hard`) + * [最小生成树二.Kruscal算法](最小生成树二kruscal算法) (`hard`) * **其他** * [课程表](#课程表) (`medium` `拓扑排序`) From a1cd03fc36132909a4319276e28dab9400429e35 Mon Sep 17 00:00:00 2001 From: xcg <852390212@qq.com> Date: Tue, 19 Mar 2019 17:05:57 +0800 Subject: [PATCH 003/163] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E5=9B=BE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\345\233\276.md" | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git "a/LeetCode/\345\233\276.md" "b/LeetCode/\345\233\276.md" index df52973..f6613f5 100644 --- "a/LeetCode/\345\233\276.md" +++ "b/LeetCode/\345\233\276.md" @@ -13,9 +13,8 @@ * **最短路径** * [最短路径.一](#最短路径一) (`hard` `迪杰斯特拉算法`) * **最小生成树** - * [最小生成树一.Prim算法](##最小生成树一prim算法) (`hard`) - * [最小生成树二.Kruscal算法](最小生成树二kruscal算法) (`hard`) - + * [最小生成树一.Prim算法](#最小生成树一prim算法) (`hard`) + * [最小生成树二.Kruscal算法](#最小生成树二kruscal算法) (`hard`) * **其他** * [课程表](#课程表) (`medium` `拓扑排序`) * [课程表II](#课程表II) (`medium` `拓扑排序`) From 2213fb10d9b20f3ccaafa7c025db1e0e9b5e1974 Mon Sep 17 00:00:00 2001 From: xcg <852390212@qq.com> Date: Tue, 19 Mar 2019 17:33:25 +0800 Subject: [PATCH 004/163] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E5=9B=BE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\345\233\276.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/LeetCode/\345\233\276.md" "b/LeetCode/\345\233\276.md" index f6613f5..f9d94c8 100644 --- "a/LeetCode/\345\233\276.md" +++ "b/LeetCode/\345\233\276.md" @@ -15,7 +15,7 @@ * **最小生成树** * [最小生成树一.Prim算法](#最小生成树一prim算法) (`hard`) * [最小生成树二.Kruscal算法](#最小生成树二kruscal算法) (`hard`) - * **其他** + * **拓扑排序** * [课程表](#课程表) (`medium` `拓扑排序`) * [课程表II](#课程表II) (`medium` `拓扑排序`) From 90ad1fa9ce46db4655d2c43e0fbbe3535a34b2fc Mon Sep 17 00:00:00 2001 From: xcg <852390212@qq.com> Date: Thu, 21 Mar 2019 23:18:44 +0800 Subject: [PATCH 005/163] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E6=95=B0=E7=BB=84?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\346\225\260\347\273\204.md" | 57 ++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git "a/LeetCode/\346\225\260\347\273\204.md" "b/LeetCode/\346\225\260\347\273\204.md" index fae9e14..03988b1 100644 --- "a/LeetCode/\346\225\260\347\273\204.md" +++ "b/LeetCode/\346\225\260\347\273\204.md" @@ -1114,8 +1114,13 @@ public: 3. `(x1,y1)`和`(x2,y2)`是同一个元素 * 时间复杂度:O(*mn*) + * 空间复杂度:O(*mn*) + + +**C++代码** + ```c++ class Solution { public: @@ -1175,6 +1180,58 @@ public: +**Python代码** + +```python +class Solution: + def solution(self,x1,y1,x2,y2,vec:List[int],matrix:List[List[int]]): + i = x1 + j = y1 + if x1 < x2 and y1 < y2: + while j < y2: + vec.append(matrix[i][j]) + j += 1 + while i < x2: + vec.append(matrix[i][j]) + i += 1 + while j > y1: + vec.append(matrix[i][j]) + j -= 1 + while i > x1: + vec.append(matrix[i][j]) + i -= 1 + elif x1 == x2: + while j <= y2: + vec.append(matrix[i][j]) + j += 1 + else: + while i <= x2: + vec.append(matrix[i][j]) + i += 1 + + def spiralOrder(self, matrix: List[List[int]]) -> List[int]: + if len(matrix) == 0: + return matrix + + res = list() + m = len(matrix) + n = len(matrix[0]) + x1 = 0 + y1 = 0 + x2 = m-1 + y2 = n-1 + while x1 <= x2 and y1 <= y2: + self.solution(x1,y1,x2,y2,res,matrix) + x1 += 1 + y1 += 1 + x2 -= 1 + y2 -= 1 + + return res +``` + + + ## 螺旋矩阵II [LeetCode中文](https://leetcode-cn.com/problems/spiral-matrix-ii/) From f37e5a01d3ccdd432fb9138a09597ee6b28713ab Mon Sep 17 00:00:00 2001 From: xcg <852390212@qq.com> Date: Fri, 22 Mar 2019 00:06:36 +0800 Subject: [PATCH 006/163] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E6=95=B0=E7=BB=84?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\346\225\260\347\273\204.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/LeetCode/\346\225\260\347\273\204.md" "b/LeetCode/\346\225\260\347\273\204.md" index 03988b1..9ddb856 100644 --- "a/LeetCode/\346\225\260\347\273\204.md" +++ "b/LeetCode/\346\225\260\347\273\204.md" @@ -1238,7 +1238,7 @@ class Solution: [LeetCode英文](https://leetcode.com/problems/spiral-matrix-ii/) -给定一个正整数 `n`,生成一个包含 1 到 `n2` 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。 +给定一个正整数 `n`,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。 **示例**: From 1b0d5aee522359be34447d452656cc23cf20d7bf Mon Sep 17 00:00:00 2001 From: xcg <852390212@qq.com> Date: Fri, 22 Mar 2019 22:53:34 +0800 Subject: [PATCH 007/163] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E6=95=B0=E7=BB=84?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\346\225\260\347\273\204.md" | 104 ++++++++++++++++++++++++- 1 file changed, 102 insertions(+), 2 deletions(-) diff --git "a/LeetCode/\346\225\260\347\273\204.md" "b/LeetCode/\346\225\260\347\273\204.md" index 9ddb856..7895169 100644 --- "a/LeetCode/\346\225\260\347\273\204.md" +++ "b/LeetCode/\346\225\260\347\273\204.md" @@ -519,7 +519,9 @@ public: * 时间复杂度:O(*n*) * 空间复杂度:O(1) - + +**C++代码** + ```c++ class Solution { public: @@ -546,6 +548,26 @@ public: +**Python代码** + +```python +class Solution: + def moveZeroes(self, nums: List[int]) -> None: + """ + Do not return anything, modify nums in-place instead. + """ + slow = fast = 0 + while fast < len(nums): + if nums[fast] != 0: + nums[slow] = nums[fast] + slow += 1 + fast += 1 + for i in range(slow,len(nums)): + nums[i] = 0 +``` + + + ## 缺失数字 [LeetCode中文](https://leetcode-cn.com/problems/missing-number/) @@ -1258,7 +1280,9 @@ class Solution: * 时间复杂度:O(*n2*) * 空间复杂度:O(*n2*) - + +**C++代码** + ```c++ class Solution { public: @@ -1327,6 +1351,65 @@ private: +**Python代码** + +```python +class Solution: + def solution(self,x1,y1,x2,y2,matrix:List[List[int]],cnt) -> int: + i = x1 + j = y1 + if x1 < x2 and y1 < y2: + while j < y2: + matrix[i][j] = cnt + cnt += 1 + j += 1 + while i < x2: + matrix[i][j] = cnt + cnt += 1 + i += 1 + while j > y1: + matrix[i][j] = cnt + cnt += 1 + j -= 1 + while i > x1: + matrix[i][j] = cnt + cnt += 1 + i -= 1 + elif x1 == x2: + while j <= y2: + matrix[i][j] = cnt + cnt += 1 + j += 1 + else: + while i <= x2: + matrix[i][j] = cnt + cnt += 1 + i += 1 + + return cnt + + def generateMatrix(self, n: int) -> List[List[int]]: + if n == 0: + return [[]] + + cnt = 1 + res = [[0]*n for i in range(n)] + x1 = 0 + y1 = 0 + x2 = n - 1 + y2 = n - 1 + while x1 <= x2 and y1 <= y2: + cnt = self.solution(x1,y1,x2,y2,res,cnt) + x1 += 1 + y1 += 1 + x2 -= 1 + y2 -= 1 + + return res +``` + + + ## 旋转图像 [LeetCode中文](https://leetcode-cn.com/problems/rotate-image/) @@ -2060,6 +2143,8 @@ s = "`axc`", t = "`ahbgdc`" * 时间复杂度:O(*m+n*) * 空间复杂度:O(1) +**C++代码** + ```c++ class Solution { public: @@ -2088,6 +2173,21 @@ public: +**Python代码** + +```python +class Solution: + def isSubsequence(self, s: str, t: str) -> bool: + i = j = 0 + while i < len(s) and j < len(t): + if s[i] == t[j]: + i += 1 + j += 1 + return i == len(s) +``` + + + ## 搜索二维矩阵II [LeetCode中文](https://leetcode-cn.com/problems/search-a-2d-matrix-ii/) From f19736e30218e67c11de7f7603e33d415e5ee773 Mon Sep 17 00:00:00 2001 From: xcg <852390212@qq.com> Date: Fri, 22 Mar 2019 23:06:41 +0800 Subject: [PATCH 008/163] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E6=95=B0=E7=BB=84?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\346\225\260\347\273\204.md" | 257 +++++++++++++++++++++++-- 1 file changed, 246 insertions(+), 11 deletions(-) diff --git "a/LeetCode/\346\225\260\347\273\204.md" "b/LeetCode/\346\225\260\347\273\204.md" index 7895169..7e975f4 100644 --- "a/LeetCode/\346\225\260\347\273\204.md" +++ "b/LeetCode/\346\225\260\347\273\204.md" @@ -73,6 +73,8 @@ - 时间复杂度:O(*m + n*) - 空间复杂度:O(*m*) +**C++代码** + ```c++ class Solution { public: @@ -99,6 +101,12 @@ public: }; ``` +**Python代码** + +```python + +``` + #### 方法2:排序 +双指针 先将`nums1`和`nums2`排序(**从小到大排序**),维护一个`set`存放交集元素,定义两个指针`p1`和`p2`分别从`nums1`和`nums2`出发,处理情况如下: @@ -115,6 +123,8 @@ public: * 时间复杂度:O(*m log m + n log n*) * 空间复杂度:O(*max(m,n)*) +**C++代码** + ```c++ class Solution { public: @@ -154,6 +164,8 @@ public: * 时间复杂度:O(*(m + n) log m*) * 空间复杂度:O(*min(m,n)*) +**C++代码** + ```c++ class Solution { public: @@ -188,6 +200,12 @@ public: }; ``` +**Python代码** + +```python + +``` + ## 两个数组的交集II @@ -234,6 +252,8 @@ public: * 时间复杂度:O(*m + n*) * 空间复杂度:O(*max(m,n)*) +**C++代码** + ```c++ class Solution { public: @@ -256,11 +276,21 @@ public: }; ``` +**Python代码** + +```python + +``` + + + **优化空间**:哈希表统计两数组中**长度较小**的那个数组的元素个数。 * 时间复杂度:O(*m + n*) * 空间复杂度:O(*min(m,n)*) +**C++代码** + ```c++ class Solution { public: @@ -306,6 +336,8 @@ public: - 时间复杂度:O(*m log m + n log n*) - 空间复杂度:O(*max(m,n)*) +**C++代码** + ```c++ class Solution { public: @@ -333,6 +365,12 @@ public: }; ``` +**Python代码** + +```python + +``` + ## 杨辉三角 @@ -367,6 +405,8 @@ public: * 时间复杂度:O(*n2*) * 空间复杂度:O(*n2*) +**C++代码** + ```c++ class Solution { public: @@ -406,6 +446,12 @@ public: }; ``` +**Python代码** + +```python + +``` + ## 求众数 @@ -438,6 +484,8 @@ public: * 时间复杂度:O(*n*) * 空间复杂度:O(*n*) +**C++代码** + ```c++ class Solution { public: @@ -460,6 +508,12 @@ public: }; ``` +**Python代码** + +```python + +``` + #### 方法2:摩尔投票法 [参见博客](https://www.cnblogs.com/grandyang/p/4233501.html) @@ -467,6 +521,8 @@ public: * 时间复杂度:O(*n*) * 空间复杂度:O(1) +**C++代码** + ```c++ class Solution { public: @@ -492,7 +548,11 @@ public: }; ``` +**Python代码** + +```python +``` ## 移动零 @@ -546,8 +606,6 @@ public: }; ``` - - **Python代码** ```python @@ -600,6 +658,8 @@ class Solution: * 时间复杂度:O(*n*) * 空间复杂度:O(1) +**C++代码** + ```c++ class Solution { public: @@ -615,6 +675,12 @@ public: }; ``` +**Python代码** + +```python + +``` + #### 方法2:等差数列 等差数列求0~n的和减去数组所有元素相加得到的和即为缺失的数字 @@ -622,6 +688,8 @@ public: * 时间复杂度:O(*n*) * 空间复杂度:O(1) +**C++代码** + ``` class Solution { public: @@ -634,6 +702,12 @@ public: }; ``` +**Python代码** + +```python + +``` + ## 存在重复元素 @@ -665,6 +739,8 @@ public: * 时间复杂度:O(*n*) * 空间复杂度:O(*n*) +**C++代码** + ```c++ class Solution { public: @@ -687,6 +763,12 @@ public: }; ``` +**Python代码** + +```python + +``` + ## 两数之和 @@ -714,6 +796,8 @@ public: * 时间复杂度:O(*n*) * 空间复杂度:O(*n*) +**C++代码** + ```c++ class Solution { public: @@ -733,6 +817,12 @@ public: }; ``` +**Python代码** + +```python + +``` + ## 最接近的三数之和 @@ -760,6 +850,8 @@ public: * 时间复杂度:O(*n2*) * 空间复杂度:O(1) +**C++代码** + ```c++ class Solution { public: @@ -807,6 +899,12 @@ public: }; ``` +**Python代码** + +```python + +``` + ## 三数之和 @@ -887,6 +985,12 @@ public: }; ``` +**Python代码** + +```python + +``` + ## 删除排序数组中的重复项 @@ -923,7 +1027,9 @@ public: * 时间复杂度:O(*n*) * 空间复杂度:O(1) - + +**C++代码** + ```c++ class Solution { public: @@ -947,6 +1053,12 @@ public: }; ``` +**Python代码** + +```python + +``` + ## 合并两个有序数组 @@ -977,7 +1089,9 @@ nums2 = [2,5,6], n = 3 * 时间复杂度:O(*m + n*) * 空间复杂度:O(*m + n*) - + +**C++代码** + ```c++ class Solution { public: @@ -1005,6 +1119,12 @@ public: }; ``` +**Python代码** + +```python + +``` + ## 旋转数组 @@ -1049,6 +1169,8 @@ public: * 时间复杂度:O(*n*) * 空间复杂度:O(*n*) +**C++代码** + ```c++ class Solution { public: @@ -1065,6 +1187,12 @@ public: }; ``` +**Python代码** + +```python + +``` + #### 方法2 设数组的长度为`len`,`k`对`len`取模得到`k1 = k % len`,然后进行如下步骤: @@ -1076,7 +1204,9 @@ public: * 时间复杂度:O(*n*) * 空间复杂度:O(1) - + +**C++代码** + ```c++ class Solution { public: @@ -1094,6 +1224,12 @@ public: }; ``` +**Python代码** + +```python + +``` + ## 螺旋矩阵 @@ -1139,7 +1275,6 @@ public: * 空间复杂度:O(*mn*) - **C++代码** @@ -1200,8 +1335,6 @@ public: }; ``` - - **Python代码** ```python @@ -1467,7 +1600,9 @@ class Solution: * 时间复杂度:O(*n2*) * 空间复杂度:O(1) - + +**C++代码** + ```c++ class Solution { public: @@ -1522,6 +1657,14 @@ public: +**Python代码** + +```python + +``` + + + ## 寻找重复数 [LeetCode中文](https://leetcode-cn.com/problems/find-the-duplicate-number/) @@ -1560,7 +1703,9 @@ public: * 时间复杂度:O(*n*) * 空间复杂度:O(1) - + +**C++代码** + ```c++ class Solution { public: @@ -1586,6 +1731,14 @@ public: +**Python代码** + +```python + +``` + + + ## 除自身以外数组的乘积 [LeetCode中文](https://leetcode-cn.com/problems/product-of-array-except-self/) @@ -1621,6 +1774,8 @@ D[i] = D[i+1]*nums[i+1] (i = 0~len-2) * 时间复杂度:O(*n*) * 空间复杂度:O(*n*) +**C++代码** + ```c++ class Solution { public: @@ -1651,6 +1806,14 @@ public: }; ``` + + +**Python代码** + +```python + +``` + #### 方法2:优化空间复杂度 先将数组C的数值计算到输出数组`res`中,然后定义一个变量`tmp`代替数组D的递推关系计算,对数组`res`从后向前进行递推计算得出最终结果。可以优化空间复杂度到常数时间。 @@ -1658,6 +1821,8 @@ public: * 时间复杂度:O(*n*) (输出数组**不被视为**额外空间) * 空间复杂度:O(1) +**C++代码** + ```c++ class Solution { public: @@ -1737,6 +1902,9 @@ public: * 时间复杂度:O(*mn*) * 空间复杂度:O(*m + n*) + +**C++代码** + ```c++ class Solution { public: @@ -1770,6 +1938,14 @@ public: +**Python代码** + +```python + +``` + + + ## 盛最多水的容器 [LeetCode中文](https://leetcode-cn.com/problems/container-with-most-water) @@ -1801,7 +1977,9 @@ public: * 时间复杂度:O(*n*) * 空间复杂度:O(1) - + +**C++代码** + ```c++ class Solution { public: @@ -1834,6 +2012,14 @@ public: +**Python代码** + +```python + +``` + + + ## 合并区间 [LeetCode中文](https://leetcode-cn.com/problems/merge-intervals) @@ -1865,6 +2051,8 @@ public: * 时间复杂度:O(*n log n*) * 空间复杂度:O(*n*) +**C++代码** + ```c++ /** * Definition for an interval. @@ -1906,6 +2094,12 @@ public: }; ``` +**Python代码** + +```python + +``` + ## 下一个排列 @@ -1959,6 +2153,8 @@ public: * 时间复杂度:O(*n*) * 空间复杂度:O(1) +**C++代码** + ```c++ class Solution { public: @@ -1994,6 +2190,14 @@ public: +**Python代码** + +```python + +``` + + + ## 缺失的第一个正数 [LeetCode中文](https://leetcode-cn.com/problems/first-missing-positive) @@ -2033,6 +2237,8 @@ public: * 时间复杂度:O(*n*) * 空间复杂度:O(*n*) +**C++代码** + ```c++ class Solution { public: @@ -2055,6 +2261,14 @@ public: } }; ``` + + +**Python代码** + +```python + +``` + #### 方法2:优化空间复杂度 对于大小为n(n>0)的数组,这n个数可以分为以下几种情况: @@ -2075,6 +2289,8 @@ public: * 时间复杂度:O(*n*) * 空间复杂度:O(1) +**C++代码** + ```c++ class Solution { public: @@ -2230,6 +2446,8 @@ class Solution: - 时间复杂度:O(*m + n*) - 空间复杂度:O(1) +**C++代码** + ```c++ class Solution { public: @@ -2262,6 +2480,14 @@ public: +**Python代码** + +```python + +``` + + + ## 有效的数独 [LeetCode中文](https://leetcode-cn.com/problems/valid-sudoku/) @@ -2332,6 +2558,8 @@ public: - 时间复杂度:O(9x9) = O(1) - 空间复杂度:O(9) = O(1) +**C++代码** + ```c++ class Solution { public: @@ -2397,3 +2625,10 @@ public: }; ``` + + +**Python代码** + +```python + +``` \ No newline at end of file From 45987579c1f83c539eb573ae842aa9a29b3e90f5 Mon Sep 17 00:00:00 2001 From: xcg <852390212@qq.com> Date: Sat, 23 Mar 2019 17:35:44 +0800 Subject: [PATCH 009/163] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E6=95=B0=E7=BB=84?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\346\225\260\347\273\204.md" | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git "a/LeetCode/\346\225\260\347\273\204.md" "b/LeetCode/\346\225\260\347\273\204.md" index 7e975f4..e0cc62b 100644 --- "a/LeetCode/\346\225\260\347\273\204.md" +++ "b/LeetCode/\346\225\260\347\273\204.md" @@ -2015,7 +2015,26 @@ public: **Python代码** ```python - +class Solution: + def maxArea(self, height: List[int]) -> int: + n = len(height) + l = 0 + r = n - 1 + res = 0 + while l < r: + tmp = min(height[l],height[r]) + res = max(res,(r - l) * tmp) + if height[l] < height[r]: + l += 1 + else: + r -= 1 + + while l < r and tmp == height[l]: + l += 1 + while l < r and tmp == height[r]: + r -= 1 + + return res ``` From 55bb14f9bbe2af084b95996ec3947b0a665e4a18 Mon Sep 17 00:00:00 2001 From: xcg <852390212@qq.com> Date: Sat, 23 Mar 2019 19:44:56 +0800 Subject: [PATCH 010/163] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E9=93=BE=E8=A1=A8?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\351\223\276\350\241\250.md" | 54 ++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git "a/LeetCode/\351\223\276\350\241\250.md" "b/LeetCode/\351\223\276\350\241\250.md" index 2cf53d7..9fac501 100644 --- "a/LeetCode/\351\223\276\350\241\250.md" +++ "b/LeetCode/\351\223\276\350\241\250.md" @@ -39,6 +39,8 @@ * 时间复杂度:O(*n*) * 空间复杂度:O(1) +**C++代码** + ```c++ /** * Definition for singly-linked list. @@ -68,6 +70,31 @@ public: }; ``` +**Python代码** + +```python +# Definition for singly-linked list. +# class ListNode: +# def __init__(self, x): +# self.val = x +# self.next = None + +class Solution: + def reverseList(self, head: ListNode) -> ListNode: + pre = None + cur = head + nex = None + while cur: + nex = cur.next + cur.next = pre + + pre = cur + cur = nex + return pre +``` + + + #### 方法2:dummy结点 设一个dummy结点(`头结点`),它的next指针始终指向链表首节点。设cur指针指向当前节点,temp作为临时指针指向当前节点的下一个节点。那么翻转的过程就是: @@ -80,6 +107,8 @@ public: * 时间复杂度:O(*n*) * 空间复杂度:O(1) +**C++代码** + ```c++ /** * Definition for singly-linked list. @@ -110,6 +139,31 @@ public: }; ``` +**Python代码** + +```python +# Definition for singly-linked list. +# class ListNode: +# def __init__(self, x): +# self.val = x +# self.next = None + +class Solution: + def reverseList(self, head: ListNode) -> ListNode: + pre = None + cur = head + nex = None + while cur: + nex = cur.next + cur.next = pre + + pre = cur + cur = nex + return pre +``` + + + #### 方法3:递归 设第k+1层递归返回处理第k层结点k时,k以后的节点都已经反转。那么对于节点k,需要修改结点k+1的next指向节点,以及节点k的next指向节点 From 10d199480bdd148d9c021eaae7ba86c72c0e56f0 Mon Sep 17 00:00:00 2001 From: xcg <852390212@qq.com> Date: Sun, 24 Mar 2019 16:47:07 +0800 Subject: [PATCH 011/163] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E9=93=BE=E8=A1=A8?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\351\223\276\350\241\250.md" | 84 +++++++++++++++++++++++++- 1 file changed, 83 insertions(+), 1 deletion(-) diff --git "a/LeetCode/\351\223\276\350\241\250.md" "b/LeetCode/\351\223\276\350\241\250.md" index 9fac501..c6005ee 100644 --- "a/LeetCode/\351\223\276\350\241\250.md" +++ "b/LeetCode/\351\223\276\350\241\250.md" @@ -166,7 +166,7 @@ class Solution: #### 方法3:递归 -设第k+1层递归返回处理第k层结点k时,k以后的节点都已经反转。那么对于节点k,需要修改结点k+1的next指向节点,以及节点k的next指向节点 +设第k+1层递归返回处理第k层结点k时,k以后的节点都已经反转。那么对于节点k,需要修改结点k+1的next指向节点k,以及节点k的next指向空 ```c++ node(1) -> node(2) -> node(3) -> ... -> node(k) -> node(k+1) <- ... <- node(n-1) <- node(n) @@ -180,6 +180,8 @@ node(k)->next = nullptr; * 时间复杂度:O(n) * 空间复杂度:O(n) (`由于n层递归,而每层递归函数调用的栈帧会创建局部指针tmp`) +**C++代码** + ```c++ /** * Definition for singly-linked list. @@ -205,6 +207,30 @@ public: }; ``` +**Python代码** + +```python +# Definition for singly-linked list. +# class ListNode: +# def __init__(self, x): +# self.val = x +# self.next = None + +class Solution: + def reverseList(self, head: ListNode) -> ListNode: + if not head or not head.next: + return head + tmp = head + head = self.reverseList(tmp.next) + + tmp.next.next = tmp + tmp.next = None + + return head + + +``` + ## 合并两个有序链表 @@ -216,6 +242,7 @@ public: 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 **示例**: + ``` 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 @@ -232,6 +259,8 @@ public: * 时间复杂度:O(*m+n*) * 空间复杂度:O(1) +**C++代码** + ```c++ /** * Definition for singly-linked list. @@ -272,6 +301,30 @@ public: }; ``` +**Python代码** + +```python +# Definition for singly-linked list. +# class ListNode: +# def __init__(self, x): +# self.val = x +# self.next = None + +class Solution: + def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode: + if not l1: + return l2 + if not l2: + return l1 + if l1.val < l2.val: + res = l1 + res.next = self.mergeTwoLists(l1.next,l2) + else: + res = l2 + res.next = self.mergeTwoLists(l1,l2.next) + return res +``` + ## 删除排序链表中的重复元素 @@ -304,6 +357,8 @@ public: * 时间复杂度:O(*n*) * 空间复杂度:O(1) +**C++代码** + ```c++ /** * Definition for singly-linked list. @@ -340,6 +395,33 @@ public: }; ``` +**Python代码** + +```python +# Definition for singly-linked list. +# class ListNode: +# def __init__(self, x): +# self.val = x +# self.next = None + +class Solution: + def deleteDuplicates(self, head: ListNode) -> ListNode: + if not head: + return head + pre = head + cur = head.next + while cur: + if cur.val != pre.val: + pre.next = cur + pre = pre.next + cur = cur.next + + pre.next = None + return head +``` + + + ## 回文链表 From 01b5ab7711522f73d41ecb299b966fcc1d1e7630 Mon Sep 17 00:00:00 2001 From: xcg <852390212@qq.com> Date: Sun, 24 Mar 2019 19:42:10 +0800 Subject: [PATCH 012/163] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\344\272\214\345\217\211\346\240\221.md" | 66 ++++++++++++++++++- 1 file changed, 63 insertions(+), 3 deletions(-) diff --git "a/LeetCode/\344\272\214\345\217\211\346\240\221.md" "b/LeetCode/\344\272\214\345\217\211\346\240\221.md" index e9861eb..2aca4b8 100644 --- "a/LeetCode/\344\272\214\345\217\211\346\240\221.md" +++ "b/LeetCode/\344\272\214\345\217\211\346\240\221.md" @@ -1,4 +1,5 @@ * **二叉树总结** + * **二叉搜索树** * [将有序数组转换为二叉搜索树](#将有序数组转换为二叉搜索树) (`easy` `中序`) * [二叉搜索树的最近公共祖先](#二叉搜索树的最近公共祖先) (`easy`) @@ -29,8 +30,8 @@ * [对称二叉树](#对称二叉树) (`easy`) * [二叉树的序列化与反序列化](#二叉树的序列化与反序列化) (`hard`) - - + + # 二叉树总结 ## 二叉树的最大深度 [LeetCode中文](https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/) @@ -182,7 +183,9 @@ public: 对每一个子树组成的数组,有以下几种情况: 1. 数组为空:已经到了**空节点**,直接返回`nullptr`; -2. 数组非空:新建一个节点作为当前子树的根节点,它的值取为数组中间位置的值,然后将数组左边部分构成的子数组用来构造左子树,将数组右边部分构成的子数组用来构造右子树。 +2. 数组非空:新建一个节点作为当前子树的根节点,它的值取为数组中间位置的值,然后将数组左边部分构成的子数组用来构造左子树,将数组右边部分构成的子数组用来构造右子树。 + +**C++代码** ```c++ /** @@ -219,6 +222,32 @@ public: }; ``` +**Python代码** + +```python +# Definition for a binary tree node. +# class TreeNode: + +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class Solution: + def recursion(self,nums: List[int],l: int,r: int) -> TreeNode: + if l > r: + return None + m = (l + r) // 2 + node = TreeNode(nums[m]) + node.left = self.recursion(nums,l,m - 1) + node.right = self.recursion(nums,m + 1,r) + return node + + def sortedArrayToBST(self, nums: List[int]) -> TreeNode: + n = len(nums) + return self.recursion(nums,0,n - 1) +``` + ## 二叉树的所有路径 @@ -351,6 +380,8 @@ public: 其他两种方法参见[**二叉树的最近公共祖先**](#二叉树的最近公共祖先) 。 +**C++代码** + ```c++ /** * Definition for a binary tree node. @@ -395,6 +426,35 @@ public: }; ``` +**Python代码** + +```python +# Definition for a binary tree node. +# class TreeNode: +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class Solution: + def findNode(self,node: TreeNode,a: int,b: int): + if not node: + return None + tmp = node.val + if tmp >= a and tmp <= b: + return node + elif tmp < a: + return self.findNode(node.right,a,b) + elif tmp > b: + return self.findNode(node.left,a,b) + + def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode': + pa = min(p.val,q.val) + pb = max(p.val,q.val) + return self.findNode(root,pa,pb) + +``` + ## 平衡二叉树 From 1ab510d0a4f84895654951f8e33492f22529464f Mon Sep 17 00:00:00 2001 From: xcg <852390212@qq.com> Date: Mon, 25 Mar 2019 10:32:12 +0800 Subject: [PATCH 013/163] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\344\272\214\345\217\211\346\240\221.md" | 127 +++++++++++++++++- 1 file changed, 122 insertions(+), 5 deletions(-) diff --git "a/LeetCode/\344\272\214\345\217\211\346\240\221.md" "b/LeetCode/\344\272\214\345\217\211\346\240\221.md" index 2aca4b8..2fe14da 100644 --- "a/LeetCode/\344\272\214\345\217\211\346\240\221.md" +++ "b/LeetCode/\344\272\214\345\217\211\346\240\221.md" @@ -378,8 +378,6 @@ public: 3. 当前`节点的值 > qv 且 < pv`,公共祖先就是当前节点; 4. 其他情况,公共祖先就在`p`,`q`两个之间,找到和其中一个结点值相等的结点即可。 -其他两种方法参见[**二叉树的最近公共祖先**](#二叉树的最近公共祖先) 。 - **C++代码** ```c++ @@ -455,6 +453,8 @@ class Solution: ``` +其他两种方法参见[**二叉树的最近公共祖先**](#二叉树的最近公共祖先) 。 + ## 平衡二叉树 @@ -713,11 +713,11 @@ public: 分为以下几个步骤: 1. 找到从根到p指向结点的路径,并存储在一个向量或数组中; - -2. 找到从根到q指向结点的路径,并存储在一个向量或数组中; - +2. 找到从根到q指向结点的路径,并存储在一个向量或数组中; 3. **同时**从这两条路径起点开始走,直到**遇到一个不同的节点**,则**它前面的那个**即为`p`,`q`的最近公共祖先。 +**C++代码** + ```c++ /** * Definition for a binary tree node. @@ -770,7 +770,59 @@ private: }; ``` +**Pythono代码** + +```python +# Definition for a binary tree node. +# class TreeNode: +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class Solution: + def findPath(self,root: TreeNode,path: List,node: TreeNode) -> bool: + if not root: + return False + if root == node: + path.append(root) + return True + + path.append(root) + l = self.findPath(root.left,path,node) + r = self.findPath(root.right,path,node) + if l or r: + return True + + path.pop() + return False + + + def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode': + path_p = [] + path_q = [] + + self.findPath(root,path_p,p) + self.findPath(root,path_q,q) + + i = 0 + while i < len(path_p) and i < len(path_q): + if path_p[i] != path_q[i]: + break + i += 1 + + if i == len(path_p): + return path_p[-1] + if i == len(path_q): + return path_q[-1] + + return path_p[i - 1] +``` + + + #### 方法2 + 从根节点开始遍历二叉树,对二叉树的每一个子树(包括整个树),设它的根节点为`root`如果`node1`和`node2`中的任一个和`root`匹配,那么`root`就是最低公共祖先。 如果都不匹配,则分别递归左、右子树,如果有一个 节点出现在左子树,并且另一个节点出现在右子树,则`root`就是最近公共祖先. 如果两个节点都出现在左子树,则说明最低公共祖先在左子树中,否则在右子树。 具体过程:后序遍历二叉树,对每个子树,有以下几种情况: @@ -783,6 +835,8 @@ private: 最后,当遍历完整个二叉树,得到的就是p,q节点的最近公共祖先。 +**C++代码** + ```c++ /** @@ -816,6 +870,39 @@ public: }; ``` +**Python代码** + +```python +# Definition for a binary tree node. +# class TreeNode: +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class Solution: + def recursion(self,root: TreeNode,p: TreeNode,q: TreeNode) -> TreeNode: + if not root: + return None + if root == p: + return p + if root == q: + return q + l = self.recursion(root.left,p,q) + r = self.recursion(root.right,p,q) + + if not l and not r: + return None + if not l: + return r + if not r: + return l + return root + def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode': + return self.recursion(root,p,q) + +``` + ## 从前序与中序遍历序列构造二叉树 @@ -1411,6 +1498,7 @@ public: ``` **示例 2**: + ``` 输入: 5 @@ -1427,6 +1515,8 @@ public: 考察二叉树的中序遍历和链表的双指针。中序遍历二叉搜索树,设置`pre`和`cur`两个指针分别指向前一个结点和后一个节点,在中序遍历二叉树的过程中,`pre`和`cur`跟着向后移动,一旦发现 `pre->val >= cur->val`,则说明不是二叉搜索树;否则,便是二叉搜索树。 +**C++代码** + ```c++ /** * Definition for a binary tree node. @@ -1471,6 +1561,33 @@ private: }; ``` +**Python代码** + +```python +# Definition for a binary tree node. +# class TreeNode: +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class Solution: + def isValidBST(self, root: TreeNode) -> bool: + path = [] + self.inorder(root,path) + for i in range(1,len(path)): + if path[i - 1] >= path[i]: + return False + return True + def inorder(self,root: TreeNode,path: List[int]): + if not root: + return + self.inorder(root.left,path) + path.append(root.val) + self.inorder(root.right,path) + +``` + ## 路径总和II From da1ae26fa7797b778dfa1af67a6f22e859367bd6 Mon Sep 17 00:00:00 2001 From: xcg <852390212@qq.com> Date: Tue, 26 Mar 2019 11:49:18 +0800 Subject: [PATCH 014/163] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\344\272\214\345\217\211\346\240\221.md" | 101 +++++++++++++++++- 1 file changed, 100 insertions(+), 1 deletion(-) diff --git "a/LeetCode/\344\272\214\345\217\211\346\240\221.md" "b/LeetCode/\344\272\214\345\217\211\346\240\221.md" index 2fe14da..c357a86 100644 --- "a/LeetCode/\344\272\214\345\217\211\346\240\221.md" +++ "b/LeetCode/\344\272\214\345\217\211\346\240\221.md" @@ -1882,10 +1882,12 @@ public: 给定一个二叉搜索树,编写一个函数 `kthSmallest` 来查找其中第 **k** 个最小的元素。 -**说明**: +**说明**: + 你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。 **示例 1**: + ``` 输入: root = [3,1,4,null,2], k = 1 3 @@ -1917,6 +1919,8 @@ public: 中序遍历二叉搜索树,在遍历的过程中,每经过一个节点将`k`减1,当`k == 0`的时候,则找到了第k小的元素(`注意边界`)。 +**C++代码** + ```c++ /** * Definition for a binary tree node. @@ -1955,6 +1959,42 @@ public: }; ``` +**Python代码** + +```python +# Definition for a binary tree node. +# class TreeNode: +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class Solution: + def kthSmallest(self, root: TreeNode, k: int) -> int: + self.k = k + self.inorder(root) + return self.res + + def inorder(self,root) -> bool: + if root is None: + return False + + if self.inorder(root.left): + return True + + self.k -= 1 + if self.k == 0: + self.res = root.val + return True + + if self.inorder(root.right): + return True + + return False + + +``` + ## 二叉树的前序遍历 @@ -1982,6 +2022,8 @@ public: ### 解答 #### 方法1:递归 +**C++代码** + ```c++ /** * Definition for a binary tree node. @@ -2011,9 +2053,38 @@ public: }; ``` +**Python代码** + +```python +# Definition for a binary tree node. +# class TreeNode: +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class Solution: + def preorderTraversal(self, root: TreeNode) -> List[int]: + res = [] + self.preOrder(root,res) + return res + + def preOrder(self,root,lt: List[int]): + if root is None: + return + + lt.append(root.val) + + self.preOrder(root.left,lt) + self.preOrder(root.right,lt) +``` + #### 方法2:迭代 + 思路:对每个结点按照 **根->右->左** 的顺序入栈,出栈的顺序就是前序遍历的结果。 +**C++代码** + ```c++ /** * Definition for a binary tree node. @@ -2050,6 +2121,34 @@ public: }; ``` +**Python代码** + +```python +# Definition for a binary tree node. +# class TreeNode: +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class Solution: + def preorderTraversal(self, root: TreeNode) -> List[int]: + if root is None: + return [] + sta = [] + res = [] + sta.append(root) + while len(sta) > 0: + tmp = sta.pop() + res.append(tmp.val) + + if tmp.right: + sta.append(tmp.right) + if tmp.left: + sta.append(tmp.left) + return res +``` + ## 具有所有最深结点的最小子树 From 5ef3ab88cbfe0e8acb1266133b24cda78f107b98 Mon Sep 17 00:00:00 2001 From: xcg <852390212@qq.com> Date: Tue, 26 Mar 2019 17:20:44 +0800 Subject: [PATCH 015/163] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\344\272\214\345\217\211\346\240\221.md" | 164 ++++++++++++++++++ 1 file changed, 164 insertions(+) diff --git "a/LeetCode/\344\272\214\345\217\211\346\240\221.md" "b/LeetCode/\344\272\214\345\217\211\346\240\221.md" index c357a86..c7a8318 100644 --- "a/LeetCode/\344\272\214\345\217\211\346\240\221.md" +++ "b/LeetCode/\344\272\214\345\217\211\346\240\221.md" @@ -1141,6 +1141,8 @@ public: ### 解答 考察二叉树的层序遍历,利用队列结构`queue`实现。层序遍历的过程中需要将每层的元素分开存放,定义两个指针`pre`和`next`,`pre`指向当前层的最后一个节点,`next`指向下一层的最后一个节点,当遍历到的当前结点`cur == pre`时,令`pre = next`,`next`一直更新,它指向已入队列的最后一个节点。 +**C++代码** + ```c++ /** * Definition for a binary tree node. @@ -1194,6 +1196,44 @@ public: }; ``` +**Python代码** + +```python +# Definition for a binary tree node. +# class TreeNode: +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class Solution: + def levelOrder(self, root: TreeNode) -> List[List[int]]: + if root is None: + return [] + res = [] + que = [] + vec = [] + pre = root + nex = None + que.append(root) + while len(que) > 0: + cur = que.pop(0) + vec.append(cur.val) + + if cur.left: + que.append(cur.left) + nex = cur.left + if cur.right: + que.append(cur.right) + nex = cur.right + if cur == pre: + pre = nex + res.append(vec) + vec = [] + + return res +``` + ## 二叉树的右视图 @@ -1221,6 +1261,8 @@ public: 树的层序遍历的进阶,遍历树的时候设置双指针,`pre`指向当前层的最后一个节点,`next`指向遍历到的最新的结点,取出每层最后一个结点(`pre`)的值到结果数组`res`。 +**C++代码** + ```c++ /** * Definition for a binary tree node. @@ -1269,6 +1311,41 @@ public: }; ``` +**Python代码** + +```python +# Definition for a binary tree node. +# class TreeNode: +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class Solution: + def rightSideView(self, root: TreeNode) -> List[int]: + if root is None: + return [] + res = [] + que = [] + pre = root + nex = None + que.append(root) + while len(que) > 0: + cur = que.pop(0) + + if cur.left: + que.append(cur.left) + nex = cur.left + if cur.right: + que.append(cur.right) + nex = cur.right + if cur == pre: + pre = nex + res.append(cur.val) + + return res +``` + ## 二叉树的锯齿层次遍历 @@ -1303,6 +1380,8 @@ public: 二叉树层序遍历的进阶,加一个**标志位**`flag`,每一层根据`flag`判断是否反转当前层的数组。 +**C++代码** + ```c++ /** * Definition for a binary tree node. @@ -1364,6 +1443,50 @@ public: }; ``` +**Python代码** + +```python +# Definition for a binary tree node. +# class TreeNode: +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class Solution: + def zigzagLevelOrder(self, root: TreeNode) -> List[List[int]]: + if root is None: + return [] + res = [] + vec = [] + que = [] + + flag = True + pre = root + nex = None + que.append(root) + while len(que) > 0: + cur = que.pop(0) + vec.append(cur.val) + + if cur.left: + que.append(cur.left) + nex = cur.left + if cur.right: + que.append(cur.right) + nex = cur.right + + if cur == pre: + pre = nex + if not flag: + vec.reverse() + res.append(vec) + vec = [] + flag = not flag + + return res +``` + ## 填充同一层的兄弟节点 @@ -1414,6 +1537,8 @@ struct TreeLinkNode { 树的层序遍历结合链表指针操作。 +**C++代码** + ```c++ /** * Definition for binary tree with next pointer. @@ -1471,6 +1596,45 @@ public: }; ``` +**Python代码** + +```python +""" +# Definition for a Node. +class Node: + def __init__(self, val, left, right, next): + self.val = val + self.left = left + self.right = right + self.next = next +""" +class Solution: + def connect(self, root: 'Node') -> 'Node': + if root is None: + return None + pre = root + nex = None + que = [] + que.append(root) + while len(que) > 0: + cur = que.pop(0) + + if cur.left: + que.append(cur.left) + nex = cur.left + if cur.right: + que.append(cur.right) + nex = cur.right + + if cur == pre: + cur.next = None + pre = nex + elif len(que) > 0: + cur.next = que[0] + + return root +``` + ## 验证二叉搜索树 From ff3645e205eb5d4c5d171695e1a05bea07c9c5e3 Mon Sep 17 00:00:00 2001 From: xcg <852390212@qq.com> Date: Tue, 26 Mar 2019 17:22:15 +0800 Subject: [PATCH 016/163] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\344\272\214\345\217\211\346\240\221.md" | 1 - 1 file changed, 1 deletion(-) diff --git "a/LeetCode/\344\272\214\345\217\211\346\240\221.md" "b/LeetCode/\344\272\214\345\217\211\346\240\221.md" index c7a8318..77eeb74 100644 --- "a/LeetCode/\344\272\214\345\217\211\346\240\221.md" +++ "b/LeetCode/\344\272\214\345\217\211\346\240\221.md" @@ -1,5 +1,4 @@ * **二叉树总结** - * **二叉搜索树** * [将有序数组转换为二叉搜索树](#将有序数组转换为二叉搜索树) (`easy` `中序`) * [二叉搜索树的最近公共祖先](#二叉搜索树的最近公共祖先) (`easy`) From e1bbd35cfc8085ff0885ecbcc8a82c3f694d6b36 Mon Sep 17 00:00:00 2001 From: Xiechenguang <852390212@qq.com> Date: Thu, 28 Mar 2019 12:47:02 +0800 Subject: [PATCH 017/163] =?UTF-8?q?Update=20=E5=85=B6=E4=BB=96.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\345\205\266\344\273\226.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/LeetCode/\345\205\266\344\273\226.md" "b/LeetCode/\345\205\266\344\273\226.md" index 85814b8..210d402 100644 --- "a/LeetCode/\345\205\266\344\273\226.md" +++ "b/LeetCode/\345\205\266\344\273\226.md" @@ -1,7 +1,7 @@ * **其他类总结** * [Nim游戏](#Nim游戏) (`easy` `智力题`) * [四数相加II](#四数相加II) (`medium` `哈希`) - * [打乱数组](#打乱数组) (`mqdium` `洗牌算法`) + * [打乱数组](#打乱数组) (`mdium` `洗牌算法`) From 718a17974b0218e80330138710e884289ff1df3f Mon Sep 17 00:00:00 2001 From: xcg <852390212@qq.com> Date: Thu, 28 Mar 2019 13:33:58 +0800 Subject: [PATCH 018/163] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20Algorithm?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Bubble_Sort/Bubble_Sort/main.cpp | 19 +++--- .../Insert_Sort/Insert_Sort/main.cpp | 13 ++-- .../Select_Sort/Select_Sort/main.cpp | 11 ++-- .../heap_sort/heap_sort/main.cpp | 17 +++--- .../merge_sort_nonrecursion/main.cpp | 60 ++++++++++--------- .../merge_sort_recursion/merge_sort/main.cpp | 41 +++++++------ .../quick_sort/quick_sort/main.cpp | 36 ++++++----- 7 files changed, 108 insertions(+), 89 deletions(-) diff --git a/Algorithm/search_and_sort_algorithm/Bubble_Sort/Bubble_Sort/main.cpp b/Algorithm/search_and_sort_algorithm/Bubble_Sort/Bubble_Sort/main.cpp index 62b4301..15ecd77 100644 --- a/Algorithm/search_and_sort_algorithm/Bubble_Sort/Bubble_Sort/main.cpp +++ b/Algorithm/search_and_sort_algorithm/Bubble_Sort/Bubble_Sort/main.cpp @@ -4,10 +4,11 @@ using namespace std; void Bubble_Sort(vector& vec) { - int len=vec.size(); + int len = vec.size(); bool flag = true; //һַÿһѭԪ³ - /*for(int i=0;i& vec) flag = true; } } - }*/ + } + */ //ڶַÿһѭСԪϸ for(int i=0;i& vec) { if(vec[j] > vec[j+1]) { - swap(vec[j],vec[j+1]); flag = true; } @@ -37,21 +38,25 @@ void Bubble_Sort(vector& vec) } + +/***********/ int main() { vector vec_in; int n,a; - cin>>n; + cin >> n; for (int i=0;i>a; + cin >> a; vec_in.push_back(a); } + Bubble_Sort(vec_in); for(int j=0;j& vec) { - int len=vec.size(); + int len = vec.size(); for(int i=1;i=1 && vec[j] < vec[j-1];j--) { swap(vec[j],vec[j-1]); } - //vec[j+1]=tmp; } } +/*********/ int main() { vector vec_in; int n,a; - cin>>n; + cin >> n; for (int i=0;i>a; + cin >> a; vec_in.push_back(a); } Insert_Sort(vec_in); for (auto iter=vec_in.begin();iter!=vec_in.end();iter++) { - cout<<*iter< using namespace std; + void Select_Sort(vector& vec) { - int len=vec.size(); + int len = vec.size(); for (int i=0;i vec_in; diff --git a/Algorithm/search_and_sort_algorithm/heap_sort/heap_sort/main.cpp b/Algorithm/search_and_sort_algorithm/heap_sort/heap_sort/main.cpp index f885bc4..3ec3129 100644 --- a/Algorithm/search_and_sort_algorithm/heap_sort/heap_sort/main.cpp +++ b/Algorithm/search_and_sort_algorithm/heap_sort/heap_sort/main.cpp @@ -6,38 +6,38 @@ using namespace std; // void HeapSort(vector& vc,int a,int b) { - //int temp=vc[a]; - //int j=2*a+1; for(int j=a*2+1;j<=b;j=j*2+1) { //jӦӣͬʱӦüҺӣj+1<=bֹԽ - if(j+1<=b && vc[j] vec; - while(cin>>n) + while(cin >> n) { for(int i=0;i>a; + cin >> a; vec.push_back(a); } - int len=vec.size(); + int len = vec.size(); for(int i=len/2-1;i>=0;i--) { HeapSort(vec,i,len-1); @@ -53,6 +53,7 @@ int main() { cout<& vec1,vector& vec2,int a,int m,int b) { - int i=a; - int j=m+1; - int cnt=a; - for (;i<=m && j<=b;cnt++) + int i = a; + int j = m+1; + int cnt = a; + for (;i <= m && j <= b;cnt++) { - if(vec1[i]<=vec1[j]) + if(vec1[i] <= vec1[j]) { - vec2[cnt]=vec1[i++]; - //i++; + vec2[cnt] = vec1[i++]; } else{ - vec2[cnt]=vec1[j++]; + vec2[cnt] = vec1[j++]; } } - if(i<=m) + + if(i <= m) { - while (i<=m) + while (i <= m) { - vec2[cnt++]=vec1[i++]; + vec2[cnt++] = vec1[i++]; } } - if(j<=b) + + if(j <= b) { - while (j<=b) + while (j <= b) { - vec2[cnt++]=vec1[j++]; + vec2[cnt++] = vec1[j++]; } } } void solution(vector& vec1,vector& vec2,int length,int N) { - if(length>N) + if(length > N) { copy(vec1.begin(),vec1.end(),vec2.begin()); return; } int i=0; - for (;i& vec1,vector& vec2,int length,int N) void Merge_Sort(vector& vec) { vector vec_cp(vec.size(),0); - int length=1; - int N=vec.size(); - while (length vec_in; - cin>>n; + cin >> n; for (int i=0;i>a; + cin >> a; vec_in.push_back(a); } + Merge_Sort(vec_in); for (auto it=vec_in.begin();it!=vec_in.end();it++) { - cout<<*it<& vec1,int b,int m,int e); void MergeSort(vector& vec,int l,int r) { - if(l& vec,int l,int r) void Merge(vector& vec1,int b,int m,int e) { - int n1=m-b+1; - int n2=e-m; - vector vec_l(vec1.begin()+b,vec1.begin()+m+1); - vector vec_r(vec1.begin()+m+1,vec1.end()); + int n1 = m - b + 1; + int n2 = e - m; + vector vec_l(vec1.begin() + b,vec1.begin() + m + 1); + vector vec_r(vec1.begin() + m + 1,vec1.end()); int i,j,a; for (i=0,j=0,a=b;i num; - while (cin>>n) + while (cin >> n) { for (int i=0;i>tmp; + cin >> tmp; num.push_back(tmp); } - int len=num.size(); + + int len = num.size(); MergeSort(num,0,len-1); for (int i=0;i patition_divide(vector& v,int l,int r) b--; //滻潻ŻҪĽ v[a]=v[b]; - //swap(v[a],v[b]); while(a=v[a]) a++; v[b]=v[a]; - //swap(v[a],v[b]); } - v[a]=c;*/ - //󹫿η - //ԪȫʱlowhighָཻͣԪأԱ֤ÿpatitionֵȽмλãʹ帴ӶNlogN - /*int low=a+1; - int high=b; + v[a]=c; + */ + + //ֶεһַ˫ָ루󹫿ΣΪΣ<= pivot , > pivot + //ԪȫʱlowhighָཻͣԪأԱ֤ÿpatitionֵȽмλãʹ帴ӶNlogN + /* + int low = a+1; + int high = b; for(;;) { - while(v[low]c) + while(v[high] > c) high--; - if(low + // + //ֶεڶַ⣬Ϊ < pivot, = pivot, > pivotڶظԪǣԽʱ临Ӷȣ int less = l - 1; int cur = l; int more = r; @@ -82,6 +86,8 @@ void Quick_Sort(vector& vc,int l,int r) Quick_Sort(vc,pr.second+1,r); } + +/*****************/ int main() { vector vec; @@ -92,20 +98,20 @@ int main() for (int i=0;i>a; + input >> a; vec.push_back(a); } - int len=vec.size(); + int len = vec.size(); Quick_Sort(vec,0,len-1); for (int i=0;i Date: Mon, 1 Apr 2019 08:08:30 +0800 Subject: [PATCH 019/163] ignore --- .../merge_sort/Debug/merge_sort.log | 20 ------------------- 1 file changed, 20 deletions(-) delete mode 100644 Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/merge_sort.log diff --git a/Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/merge_sort.log b/Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/merge_sort.log deleted file mode 100644 index d795c1e..0000000 --- a/Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/merge_sort.log +++ /dev/null @@ -1,20 +0,0 @@ -生成启动时间为 2018/6/10 16:12:14。 - 1>项目“C:\Users\xcg\Desktop\Code_Pra\Algorithm\search_and_sort_algorithm\merge_sort_recursion\merge_sort\merge_sort.vcxproj”在节点 2 上(build 个目标)。 - 1>InitializeBuildStatus: - 正在创建“Debug\merge_sort_recursion.unsuccessfulbuild”,因为已指定“AlwaysCreate”。 - ClCompile: - I:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\CL.exe /c /ZI /nologo /W3 /WX- /Od /Oy- /D _MBCS /Gm /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Fo"Debug\\" /Fd"Debug\vc100.pdb" /Gd /TP /analyze- /errorReport:prompt main.cpp - main.cpp - Link: - I:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\link.exe /ERRORREPORT:PROMPT /OUT:"C:\Users\xcg\Desktop\Code_Pra\Algorithm\search_and_sort_algorithm\merge_sort_recursion\Debug\merge_sort_recursion.exe" /NOLOGO kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /MANIFEST /ManifestFile:"Debug\merge_sort_recursion.exe.intermediate.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"C:\Users\xcg\Desktop\Code_Pra\Algorithm\search_and_sort_algorithm\merge_sort_recursion\Debug\merge_sort_recursion.pdb" /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:"C:\Users\xcg\Desktop\Code_Pra\Algorithm\search_and_sort_algorithm\merge_sort_recursion\Debug\merge_sort_recursion.lib" /MACHINE:X86 Debug\main.obj - merge_sort.vcxproj -> C:\Users\xcg\Desktop\Code_Pra\Algorithm\search_and_sort_algorithm\merge_sort_recursion\Debug\merge_sort_recursion.exe - Manifest: - C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\mt.exe /nologo /verbose /outputresource:"C:\Users\xcg\Desktop\Code_Pra\Algorithm\search_and_sort_algorithm\merge_sort_recursion\Debug\merge_sort_recursion.exe;#1" /manifest Debug\merge_sort_recursion.exe.intermediate.manifest - FinalizeBuildStatus: - 正在删除文件“Debug\merge_sort_recursion.unsuccessfulbuild”。 - 正在对“Debug\merge_sort_recursion.lastbuildstate”执行 Touch 任务。 - 1>已完成生成项目“C:\Users\xcg\Desktop\Code_Pra\Algorithm\search_and_sort_algorithm\merge_sort_recursion\merge_sort\merge_sort.vcxproj”(build 个目标)的操作。 - -生成成功。 - -已用时间 00:00:01.46 From bf80093f33fad90cebba02e611eeaab50a51d6a8 Mon Sep 17 00:00:00 2001 From: xcg <852390212@qq.com> Date: Mon, 1 Apr 2019 08:10:43 +0800 Subject: [PATCH 020/163] ignore --- .../merge_sort/Debug/CL.read.1.tlog | Bin 24172 -> 0 bytes .../merge_sort/Debug/CL.write.1.tlog | Bin 1216 -> 0 bytes .../merge_sort/Debug/cl.command.1.tlog | Bin 1482 -> 0 bytes .../merge_sort/Debug/link.command.1.tlog | Bin 3174 -> 0 bytes .../merge_sort/Debug/link.read.1.tlog | Bin 6056 -> 0 bytes .../merge_sort/Debug/link.write.1.tlog | Bin 2188 -> 0 bytes .../merge_sort/Debug/main.obj | Bin 240959 -> 0 bytes .../merge_sort.exe.intermediate.manifest | 10 --- .../Debug/merge_sort.lastbuildstate | 2 - ...sort.vcxprojResolveAssemblyReference.cache | Bin 713 -> 0 bytes .../merge_sort/Debug/merge_sort.write.1.tlog | 0 ...e_sort_recursion.exe.intermediate.manifest | 10 --- .../Debug/merge_sort_recursion.lastbuildstate | 2 - .../Debug/merge_sort_recursion.write.1.tlog | 0 .../merge_sort/Debug/mt.command.1.tlog | Bin 1342 -> 0 bytes .../merge_sort/Debug/mt.read.1.tlog | Bin 1462 -> 0 bytes .../merge_sort/Debug/mt.write.1.tlog | Bin 958 -> 0 bytes .../merge_sort/Debug/vc100.idb | Bin 338944 -> 0 bytes .../merge_sort/Debug/vc100.pdb | Bin 266240 -> 0 bytes .../merge_sort/merge_sort.vcxproj | 69 ------------------ .../merge_sort/merge_sort.vcxproj.filters | 22 ------ .../merge_sort/merge_sort.vcxproj.user | 3 - 22 files changed, 118 deletions(-) delete mode 100644 Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/CL.read.1.tlog delete mode 100644 Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/CL.write.1.tlog delete mode 100644 Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/cl.command.1.tlog delete mode 100644 Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/link.command.1.tlog delete mode 100644 Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/link.read.1.tlog delete mode 100644 Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/link.write.1.tlog delete mode 100644 Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/main.obj delete mode 100644 Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/merge_sort.exe.intermediate.manifest delete mode 100644 Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/merge_sort.lastbuildstate delete mode 100644 Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/merge_sort.vcxprojResolveAssemblyReference.cache delete mode 100644 Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/merge_sort.write.1.tlog delete mode 100644 Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/merge_sort_recursion.exe.intermediate.manifest delete mode 100644 Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/merge_sort_recursion.lastbuildstate delete mode 100644 Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/merge_sort_recursion.write.1.tlog delete mode 100644 Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/mt.command.1.tlog delete mode 100644 Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/mt.read.1.tlog delete mode 100644 Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/mt.write.1.tlog delete mode 100644 Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/vc100.idb delete mode 100644 Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/vc100.pdb delete mode 100644 Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/merge_sort.vcxproj delete mode 100644 Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/merge_sort.vcxproj.filters delete mode 100644 Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/merge_sort.vcxproj.user diff --git a/Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/CL.read.1.tlog b/Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/CL.read.1.tlog deleted file mode 100644 index 2f600917fffc6951399a2ba61c0290646015d1a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24172 zcmeHPU2obz5ZvcV{SQ30FHzE{AL<(zNN5QlY_O?N`Tu{S?aW;-cAS_GwTkCq6$NZ_ z*yGu~y}i9LzkmI-%)Z**HkRAO)_C1pg=2SkALB@F->tBvt+2ns=SzIDwxK=PA?y#) zwy+sqCuou5^ELJlXfa1i?#-}&kM?`~^9px(Jv_GTK03rV7j}g+ukiQQ-e8|dpQ0Gp z6vyWQ>A>Cr`xpCU@59xIiinA73KRp|qHT_QCAtB&3T%&YY>B-ayT;Y7@y#v1x3>|F zFYx{W$3Eh9kE3(6pP|(lTl0V^vR8(-W1OeNS@*cdIkrdPIy3u$cXG50=Sv*%>|{CZ zlkF*5Zt&d#*I3{^f7ScWfbao-#Q7P>X2An!p&YD_aX&fu+ydJKJWr0?e{MUpEzst{ zZUc7(SXg5}f5P7DT9k}O82Tz$~Zc0z#hkUe!4)+ zEU=ZvGZhQd-{J_Wf+%KG%!C$!O$|#oJP=c}+4v+{oP$_)LTc4J=~35h5PSu zDa+)Dtbix_b?k9>0{qag6B-@AW){K<$^_A=5MZf^Ce|PnJUhmun6dSbCq--(JWX~q zJbQxtOalpXG*;i1=wlj)sxaQCNYuYKSIDSYd1Li;ClG-aKvN3fsE}!J-pahJkYGj) zPt1U(u+~_>UKwy?h&x00asR!l#-b5*%HYfF=}I%7SZ5nyWkZ7{_VX1uI)E*%Td7n? zn{}A}eS7yY_OFluY+)_-eGT8ys(-{4s#qV=uol-h z3j2nvej*Gd!@>&J@yk+p3_T)L=kk#91GDn%lF zh1JnIdr_z}vre!9M^VX6^)u%S%sDSn$Fugq^~0o#--olbHSipHSdn!HkRAJZkl#w!BMW?^=4-(*NJ5BbceVmj2lDBW;FUOCO)BY4eg)POhbYnIG5E zKYuo>?L)4m|CcA-+HAU(p83>iuWPR1YSeXHOP`+JZ2NRl_|dZcSCgZ@k61MP#iZmPxmAKTJM>stD*T*S5X z^{;HS$5+?VKm8SwHb1VV@9I^qrEmUvP1|o=OMi?V*V3O;??}o%*U}&JCD+m)W5>1h z?cW(|M{3v7pEKvFmHn=zKb|qBs7*g}E&a>Yk5nB>9BEWQTuXmCRAUMgjL@l4tzj+K(x1C_=307I>brk&xIGhaE&XMDxt9JizFbRxNpGaW N-?j9oGRHl{v0sDg9)Ue?e0#O>F)G)y(rd3 zUag!`)y!UJd>Lzk$LXL(Ruy(d+!Co}RH*B11GZ7loPuz~YwQlh5oEA(>>YT|7yghj zcQ533ui<2=h|CpZsRg?!G7VMQQom5K6CBrCF(No8_~*g9pkI$_TR87~*1sqtrqiJg zPfhs2{s)B_6cD3_ppcR?ZzYV^Oh=BCEG?^pwA&m_}Q4^J>q6UAw`t7n_NHoz$60_Nv zotZP2ot)Q~bNOm2(?F>LCCE%8d?C7pC)KI?iWFnV#3Le!Jav^@+XLHI2N{4!i6_`O zh%=DJ>R_LM&$y;Th|E8bKYKkgd#Y18=Im-m2byXRIVNKCoff*`UUH2+)REI8?b}zR znbRxhX<_F~a!lRS#zNg%9Wdp+>tO!it6}|J_OPxJx{SF>c2=rV0sfk-!Xn35O+6v6 zG$ER6`NcnH%8Ck8bm=nMyld1ibfE|Sk#TA^r%lhz$Rn8z9dhdA&&XIKLpNQYEtxG$ z*vo{ytn^IX^&Sd3SGIqGue7hF`@@3&mv++aVZvWn>%&6Bi;M1& diff --git a/Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/link.command.1.tlog b/Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/link.command.1.tlog deleted file mode 100644 index 5ca8ab7e0b32833e4b51cab89c44317d64966ba8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3174 zcmeH|U2hUm5Qg7t6aPcQP48&b#F!>t@YRaKLSUQJgt%F@6j8cM*i!rJtIwPT)&*2d zjEXUY-JOp!^Uj<(@A>@jPBoospbPcYP><(8m*~!U*U|L#M!q`gB6qQOu=G?>TY-}+ z`1)${Y~azy-a`)XXyIv66ZsYX1OArboM*81{Fc^oS3zYs+C*#0Q<->Gz1Cwr(us>@ zczXOAV97F{E>X65`#Qp}LlmDHOY2HgjWkzEc&-S zUlH~R&k-Ie_BnEZeu}3_6Xf^!5BOV#G0$M_nPnMj;WF;>DC2+6zvOUxAaC)vE*^o+ zBE~$YdZwrJVoJUtmIWEiR@9Dlg}tczgeJy&2HJ%6d5j48h80#xaZQN!jv8lM(NbzP zG@E!V@@OMUrVGJ(yJ1Nk{}J~auLT$8-b)~IdSvhF(GHnL4UdHZ7|0~z6MK5 z)-%2hm(79g_CEViW=+gm>#psWbu@Hx8Mzog+cTTguaR6J+xaTF+;_y7>ZOiZn}Ro{ zv&nL2kKImA@Q>VtrFfXVspwpJD47ykWDl;^_f7w>jB*T!BFijj^`Jnw*{Y=kdU?a1E}tJETc&4<6jj z`1u6?32v{^&nwQ8^~G4-`m)X7cH%~$5QXO&Y2Trj>`ldwc3E-Pq@e`brmEBOqlmu$O90<-*0f2>Y7qz*6d{t> zaXiOk&&)Y}dVH|d&aJYAIm>L$wX$3KM%;(=IJ>se3Y*cM@xI{A+y*wWm2VFiTUyRF zV}#@Voc4+lV@9f#)4pVU#lI|!xUODCzSb+-38;i)!fd%st20+_Ydj6 z@yJJ5)fidN?Vh`^6@0tKrkONrz$!}@j9lK{& zDCGrtNHbqBSC6M5{*zDJNSAhott0GK9&5t=npx-A&*(X|6W(hTNfa#MJjBK^!h?Bq zZ`8ZzIPnF4&@k%K{WR zXC-DvE3luCp<~BPz>yL)yRn4a`?YJavpXtZNhD1CIxC*OIGfPT(K!}nUZH!zB~HU{iPO4XKHnDWh975u+`Sow^Sa>}G#0@vTIG@6m#X^L9;y(dGwP2YsP zxx4Cp9*#~^w3TP4DOAU{6?vyAn!iwVnxgHG@1!ZdZsm^4;5ts(Rs(@`|BF-B?4$j= Y=*O$ZeK^%k=DDpgcd^($3^{1IXLIIFBLDyZ diff --git a/Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/link.write.1.tlog b/Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/link.write.1.tlog deleted file mode 100644 index 28bcaffa8b23f0062b8208282c32904d887af07d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2188 zcmdUvO%8%U429p?#H(-scYq_}4-iHZ7ewxV3H2*RjS+*A7-7LoUZ-?k+j%{oj*2x? zrMu5-nAxfOwHsnriZQ*3bN2^9o?Rp?2fo>gc%}1lRUA(p~Lq23GZq z_h$XDNON%5;GlU$8F+!+V;e_j3UY`VuHPs%Mk!Xan?|cvJ(}V}DixzoQ*6dR4`qI? z;hGqZD0_BKg>xePUe`m&vFly7Ri@u$7;m#I8 BNn-#2 diff --git a/Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/main.obj b/Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/main.obj deleted file mode 100644 index 4c62709eeb2b86728b39441779e48441897068d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 240959 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
ZX(*xzpKUv>OD{Gi03X)rH1E{EjX-v?3S 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 - - - - - - - - - diff --git a/Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/merge_sort.lastbuildstate b/Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/merge_sort.lastbuildstate deleted file mode 100644 index bb2a86e..0000000 --- a/Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/merge_sort.lastbuildstate +++ /dev/null @@ -1,2 +0,0 @@ -#v4.0:v100 -Debug|Win32|C:\Users\xcg\Desktop\Program_Practice\sort_algorithm\merge_sort\| diff --git a/Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/merge_sort.vcxprojResolveAssemblyReference.cache b/Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/merge_sort.vcxprojResolveAssemblyReference.cache deleted file mode 100644 index bde9b7733594e0b6007bb9420528c9a0c6ddc50f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 713 zcmaKqQEt;f5Qeu-oF=Y|asVD&i3d=lRiaQRpa@Zms1>v-BS zm2*&H=fP#G=4NB`hfl`NGk)@V`rD#eW-B}kTx#8=tjo4jlR}c+RiwZEgg?f#OEAk3 z5oN4}^T$T2LV=9M4bkER8Da?+P)Q_3z}V%&d$7ww?%BHXs)XA~Y!`RPbd3c;un}z2 dfZ2=hU%y;`JB*^J)kZU-8u+k396XD*egT@6*T?_> diff --git a/Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/merge_sort.write.1.tlog b/Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/merge_sort.write.1.tlog deleted file mode 100644 index e69de29..0000000 diff --git a/Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/merge_sort_recursion.exe.intermediate.manifest b/Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/merge_sort_recursion.exe.intermediate.manifest deleted file mode 100644 index ecea6f7..0000000 --- a/Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/merge_sort_recursion.exe.intermediate.manifest +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/merge_sort_recursion.lastbuildstate b/Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/merge_sort_recursion.lastbuildstate deleted file mode 100644 index 65cef56..0000000 --- a/Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/merge_sort_recursion.lastbuildstate +++ /dev/null @@ -1,2 +0,0 @@ -#v4.0:v100 -Debug|Win32|C:\Users\xcg\Desktop\Code_Pra\Algorithm\search_and_sort_algorithm\merge_sort_recursion\| diff --git a/Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/merge_sort_recursion.write.1.tlog b/Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/merge_sort_recursion.write.1.tlog deleted file mode 100644 index e69de29..0000000 diff --git a/Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/mt.command.1.tlog b/Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/mt.command.1.tlog deleted file mode 100644 index 4b8281a99905c81b9aec250b9c434f9208e9932c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1342 zcmdUtOHaa35QWd$#Q#8aU*i^6wIC7|2!(`2W5dg8gx0iR`1R^Hmk0|gLgL27eVmyy zXQsF3^W#y0s*2QCsJgoBkp{#XoHZh$?$lFT9dL(yn@m@}9uzz5!|kcbUWXBq?}B3( z_b?4L!ME@umUU>b#~bEPQR{upR5nLhokxDa^3ZS5!IX_x1N#npV4qx5H^f6?r#jJv zQe~R45>^HLuBmd3Km|98WLj#WH@D}+3Kz*W=3dp==EaPklZ~_@mvGh``<3d9dV8^) zTf#on+`X9H#^hg|TI95Ia7=vWX3EJe^b9{@S%-u@-Z0l)MoecN%NQQ~73)gpx@2Da zraAg4%1^`#^eb-GLsUGfQYvf`>ox%o9rkuq?S+qVRDeV5Pk(zUD)o&y)93#N_{f~q zqGs!$!@U-xQAefE8RCmJO6Bfadw-w*%C!E6Cj%Tg;Xm4&n;Y%Tcb#Y69+Ds9MDu1! h&DMj5yER5*ipr9+z&RO8zdN|B>Tg`VPx)A`4Fs diff --git a/Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/mt.read.1.tlog b/Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/mt.read.1.tlog deleted file mode 100644 index faa1bac26d22297ccf37a0d3769f70af895740ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1462 zcmeH`$xg#S5Jc;Y#6S257Yh``c5`gUSP4mFXFFK<|9=8_H6bJ*6M}>Uha6@`y-au2 zbj{22lTzKQ(Ok81RqTyc_zKPpPpzS5nrMnWB|afiDbb_aU?=3xRI=w})Wj?7mW&aZ zwo2>=@*9>r6zuJL=2u?#?t{uWy6(lqSFD)&V>-C9^D^ut*fDlOtkeL1jqg+^Z)}(0 zRtCN$5qB^HvonJMxiL3$&IW7EHz(J8hWHk`BIAP9WAEuwcX(4cSNJl{(N4FI?-o(9 zByLQR&R}t?Yn^wZh{(z4XpEmRFLV^Z@dEMCDrTz diff --git a/Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/mt.write.1.tlog b/Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/mt.write.1.tlog deleted file mode 100644 index 85490bcbee6f5d6ab9634bf8031eba3469f69dfa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 958 zcmd6l!485j5Jcx};;--l-YOsx6$q7tLnHtH6Y5)xdZ~y9qldPc-RX3@vzPNpsa6W= zfO8l|{Tw<(%(GN$!?cmJVZ?`C1DGd3SrBY2Sp diff --git a/Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/vc100.idb b/Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/vc100.idb deleted file mode 100644 index 49eb834e4129b7b55474441eace89f8849f3d1b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 338944 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 diff --git a/Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/vc100.pdb b/Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/Debug/vc100.pdb deleted file mode 100644 index e4aee494368cb95e881a04a9f6d438d9e9bf574e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 266240 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 diff --git a/Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/merge_sort.vcxproj b/Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/merge_sort.vcxproj deleted file mode 100644 index 560ca58..0000000 --- a/Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/merge_sort.vcxproj +++ /dev/null @@ -1,69 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {F3580C0F-B182-4EC5-942B-26CB5C217B05} - merge_sort - merge_sort_recursion - - - - Application - true - MultiByte - - - Application - false - true - MultiByte - - - - - - - - - - - - - - - Level3 - Disabled - - - true - - - - - Level3 - MaxSpeed - true - true - - - true - true - true - - - - - - - - - \ No newline at end of file diff --git a/Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/merge_sort.vcxproj.filters b/Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/merge_sort.vcxproj.filters deleted file mode 100644 index 63d98f2..0000000 --- a/Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/merge_sort.vcxproj.filters +++ /dev/null @@ -1,22 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - 源文件 - - - \ No newline at end of file diff --git a/Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/merge_sort.vcxproj.user b/Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/merge_sort.vcxproj.user deleted file mode 100644 index ace9a86..0000000 --- a/Algorithm/search_and_sort_algorithm/merge_sort_recursion/merge_sort/merge_sort.vcxproj.user +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file From 79825783285a51aa38309f0596d751497d7675ef Mon Sep 17 00:00:00 2001 From: xcg <852390212@qq.com> Date: Mon, 1 Apr 2019 08:15:41 +0800 Subject: [PATCH 021/163] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index fb625e7..fdea343 100644 --- a/README.md +++ b/README.md @@ -30,4 +30,6 @@ +**注意**:由于4月份写毕业论文,仓库会停更1个月,5月份会继续更新。。。 + From 297e9662f84540ccd157aef66a2588929e0e53de Mon Sep 17 00:00:00 2001 From: xcg <852390212@qq.com> Date: Fri, 26 Apr 2019 16:04:17 +0800 Subject: [PATCH 022/163] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\344\272\214\345\217\211\346\240\221.md" | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git "a/LeetCode/\344\272\214\345\217\211\346\240\221.md" "b/LeetCode/\344\272\214\345\217\211\346\240\221.md" index 77eeb74..2dc04f6 100644 --- "a/LeetCode/\344\272\214\345\217\211\346\240\221.md" +++ "b/LeetCode/\344\272\214\345\217\211\346\240\221.md" @@ -45,6 +45,7 @@ **示例**: 给定二叉树 `[3,9,20,null,null,15,7]` + ``` 3 / \ @@ -125,6 +126,8 @@ public: 经过整个遍历过程,就可以构造出合并后的二叉树 。 +**C++代码** + ```c++ /** * Definition for a binary tree node. @@ -150,6 +153,30 @@ public: }; ``` +**Python代码** + +```python +# Definition for a binary tree node. +# class TreeNode: +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class Solution: + def mergeTrees(self, t1: TreeNode, t2: TreeNode) -> TreeNode: + if t1 is None: + return t2 + if t2 is None: + return t1 + + node = TreeNode(t1.val + t2.val) + node.left = self.mergeTrees(t1.left,t2.left) + node.right = self.mergeTrees(t1.right,t2.right) + + return node +``` + ## 将有序数组转换为二叉搜索树 @@ -280,6 +307,8 @@ class Solution: **注意**:`->`符号的处理。 +**C++代码** + ```c++ /** * Definition for a binary tree node. @@ -333,6 +362,12 @@ public: }; ``` +**Python代码** + +```python + +``` + ## 二叉搜索树的最近公共祖先 From 4d7044e537225e359e5ff0c4915afe93d71cbc05 Mon Sep 17 00:00:00 2001 From: xcg <852390212@qq.com> Date: Fri, 26 Apr 2019 16:49:00 +0800 Subject: [PATCH 023/163] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\344\272\214\345\217\211\346\240\221.md" | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git "a/LeetCode/\344\272\214\345\217\211\346\240\221.md" "b/LeetCode/\344\272\214\345\217\211\346\240\221.md" index 2dc04f6..1d59ee7 100644 --- "a/LeetCode/\344\272\214\345\217\211\346\240\221.md" +++ "b/LeetCode/\344\272\214\345\217\211\346\240\221.md" @@ -365,7 +365,43 @@ public: **Python代码** ```python +# Definition for a binary tree node. +# class TreeNode: +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None +class Solution: + def recursion(self,root: TreeNode): + if root is None: + return + + self.str = self.str + str(root.val) + + if root.left is None and root.right is None: + self.res.append(self.str) + self.str = self.str.rstrip(str(root.val)) + return + + self.str = self.str + "->" + + if root.left: + self.recursion(root.left) + if root.right: + self.recursion(root.right) + + self.str = self.str.rstrip("->") + self.str = self.str.rstrip(str(root.val)) + + + def binaryTreePaths(self, root: TreeNode) -> List[str]: + self.res = [] + self.str = "" + + self.recursion(root) + + return self.res ``` From c72c86242969383c75ae376ec3994e6ace7d2b10 Mon Sep 17 00:00:00 2001 From: xcg <852390212@qq.com> Date: Fri, 26 Apr 2019 16:50:54 +0800 Subject: [PATCH 024/163] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/README.md b/README.md index fdea343..f6530ff 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,3 @@ * [mysql](https://github.com/xcg1995/Code/blob/master/LeetCode/数据库.md) - -**注意**:由于4月份写毕业论文,仓库会停更1个月,5月份会继续更新。。。 - - From 4fd658ef8470f339adfc807090cf8ce41b020a11 Mon Sep 17 00:00:00 2001 From: xcg <852390212@qq.com> Date: Fri, 26 Apr 2019 23:02:45 +0800 Subject: [PATCH 025/163] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E8=A7=84=E5=88=92.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" index e31d005..f0fa8c5 100644 --- "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" +++ "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" @@ -377,7 +377,7 @@ class Solution: 动态转移方程: ``` -dp[i][j] = min(dp[i-1][j],dp[i][j-1]) + dp[i-1][j-1]) +dp[i][j] = min(dp[i-1][j],dp[i][j-1]) + grid[i-1][j-1]) ``` 设二维矩阵的行数为`h`,列数为`l`,则`dp[h - 1][l - 1]`即为所求。 From b53496959d37c5ef09e27515d3c053fed310e597 Mon Sep 17 00:00:00 2001 From: xcg <852390212@qq.com> Date: Fri, 26 Apr 2019 23:11:25 +0800 Subject: [PATCH 026/163] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E8=A7=84=E5=88=92.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\345\212\250\346\200\201\350\247\204\345\210\222.md" | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" index f0fa8c5..faed0cf 100644 --- "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" +++ "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" @@ -388,11 +388,6 @@ dp[i][j] = min(dp[i-1][j],dp[i][j-1]) + grid[i-1][j-1]) ```c++ class Solution { public: - int getMin(int a,int b) - { - return a < b ? a : b; - } - int minPathSum(vector>& grid) { int h = grid.size(); int l = grid[0].size(); @@ -413,7 +408,7 @@ public: { for(int j=1;j Date: Wed, 1 May 2019 21:17:59 +0800 Subject: [PATCH 027/163] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\344\272\214\345\217\211\346\240\221.md" | 109 +++++++++++++++--- 1 file changed, 96 insertions(+), 13 deletions(-) diff --git "a/LeetCode/\344\272\214\345\217\211\346\240\221.md" "b/LeetCode/\344\272\214\345\217\211\346\240\221.md" index 1d59ee7..832f5c5 100644 --- "a/LeetCode/\344\272\214\345\217\211\346\240\221.md" +++ "b/LeetCode/\344\272\214\345\217\211\346\240\221.md" @@ -379,7 +379,7 @@ class Solution: self.str = self.str + str(root.val) - if root.left is None and root.right is None: + if not root.left and not root.right: self.res.append(self.str) self.str = self.str.rstrip(str(root.val)) return @@ -1129,6 +1129,8 @@ public: 树的前序遍历 + 字符串数字转换(详细思路参见:[二叉树的所有路径](#二叉树的所有路径))。 +**C++代码** + ```c++ /** * Definition for a binary tree node. @@ -1142,40 +1144,76 @@ public: class Solution { public: int sumNumbers(TreeNode* root) { - if(!root) return 0; - string str(""); - int sum = 0; + int sum = 0,tmp = 0; - recursion(root,sum,str); + recursion(root,sum,tmp); return sum; } - void recursion(TreeNode* root,int& sum,string& str) + void recursion(TreeNode* root,int& sum,int& tmp) { - str.push_back('0' + root->val); + if(!root) return; + + tmp = tmp * 10 + root->val; if(!root->left && !root->right) { - sum += stoi(str); - str.pop_back(); + sum += tmp; + tmp = (tmp - root->val) / 10; return; } if(root->left) { - recursion(root->left,sum,str); + recursion(root->left,sum,tmp); } if(root->right) { - recursion(root->right,sum,str); + recursion(root->right,sum,tmp); } - str.pop_back(); + tmp = (tmp - root->val) / 10; } }; ``` +**Python代码** + +```python +# Definition for a binary tree node. +# class TreeNode: +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class Solution: + def recursion(self,root: TreeNode): + if not root: + return + self.tmp = self.tmp * 10 + root.val + + if not root.left and not root.right: + self.res = self.res + self.tmp + self.tmp = int((self.tmp - root.val) / 10) + return + + if root.left: + self.recursion(root.left) + if root.right: + self.recursion(root.right) + + self.tmp = int((self.tmp - root.val) / 10) + + def sumNumbers(self, root: TreeNode) -> int: + self.res = 0 + self.tmp = 0 + self.recursion(root) + + return self.res +``` + ## 二叉树的层次遍历 @@ -1819,7 +1857,6 @@ class Solution: self.inorder(root.left,path) path.append(root.val) self.inorder(root.right,path) - ``` @@ -1836,6 +1873,7 @@ class Solution: **示例**: 给定如下二叉树,以及目标和 `sum = 22`, + ``` 5 / \ @@ -1857,6 +1895,8 @@ class Solution: 找出二叉树的所有路径,没经过一个节点,累加一次并且加到临时数组中。在每条路径结束的时候,判断累加的值是否和目标值相等,如果相等,则将这条路径对应的临时数组加入结果数组中;否则,继续走其他路径。找出所有路径的方法参见 [二叉树的所有路径](#二叉树的所有路径) 。 +**C++代码** + ```c++ /** * Definition for a binary tree node. @@ -1902,6 +1942,49 @@ public: }; ``` +**Python** + +```python +# Definition for a binary tree node. +# class TreeNode: +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class Solution: + def recursion(self,root: TreeNode,target: int): + if not root: + return + + self.sum = self.sum + root.val + self.lt.append(root.val) + + if not root.left and not root.right: + if self.sum == target: + self.res.append(self.lt[:]) + self.sum = self.sum - root.val + self.lt.pop() + return + + if root.left: + self.recursion(root.left,target) + if root.right: + self.recursion(root.right,target) + + self.sum = self.sum - root.val + self.lt.pop() + + def pathSum(self, root: TreeNode, sum: int) -> List[List[int]]: + self.res = [] + self.lt = [] + self.sum = 0 + + self.recursion(root,sum) + + return self.res +``` + ## 二叉树中的最大路径和 From a82be3fedaacfe0c43053a5b81f033819caad871 Mon Sep 17 00:00:00 2001 From: xcg <852390212@qq.com> Date: Wed, 1 May 2019 21:19:38 +0800 Subject: [PATCH 028/163] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\344\272\214\345\217\211\346\240\221.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/LeetCode/\344\272\214\345\217\211\346\240\221.md" "b/LeetCode/\344\272\214\345\217\211\346\240\221.md" index 832f5c5..8cb5aa8 100644 --- "a/LeetCode/\344\272\214\345\217\211\346\240\221.md" +++ "b/LeetCode/\344\272\214\345\217\211\346\240\221.md" @@ -1942,7 +1942,7 @@ public: }; ``` -**Python** +**Python代码** ```python # Definition for a binary tree node. From 37dd5d5f3a749177da596d4783520b025d4ff3ff Mon Sep 17 00:00:00 2001 From: xcg <852390212@qq.com> Date: Wed, 1 May 2019 22:24:41 +0800 Subject: [PATCH 029/163] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\344\272\214\345\217\211\346\240\221.md" | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git "a/LeetCode/\344\272\214\345\217\211\346\240\221.md" "b/LeetCode/\344\272\214\345\217\211\346\240\221.md" index 8cb5aa8..266990e 100644 --- "a/LeetCode/\344\272\214\345\217\211\346\240\221.md" +++ "b/LeetCode/\344\272\214\345\217\211\346\240\221.md" @@ -1953,32 +1953,29 @@ public: # self.right = None class Solution: - def recursion(self,root: TreeNode,target: int): + def recursion(self,root: TreeNode,sum: int): if not root: return - self.sum = self.sum + root.val + sum -= root.val self.lt.append(root.val) if not root.left and not root.right: - if self.sum == target: + if sum == 0: self.res.append(self.lt[:]) - self.sum = self.sum - root.val self.lt.pop() return if root.left: - self.recursion(root.left,target) + self.recursion(root.left,sum) if root.right: - self.recursion(root.right,target) + self.recursion(root.right,sum) - self.sum = self.sum - root.val self.lt.pop() def pathSum(self, root: TreeNode, sum: int) -> List[List[int]]: self.res = [] self.lt = [] - self.sum = 0 self.recursion(root,sum) From 5cb4107a3ad8dd45362628fd4d4a314c75c86016 Mon Sep 17 00:00:00 2001 From: xcg <852390212@qq.com> Date: Fri, 17 May 2019 22:16:47 +0800 Subject: [PATCH 030/163] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\344\272\214\345\217\211\346\240\221.md" | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git "a/LeetCode/\344\272\214\345\217\211\346\240\221.md" "b/LeetCode/\344\272\214\345\217\211\346\240\221.md" index 266990e..a549685 100644 --- "a/LeetCode/\344\272\214\345\217\211\346\240\221.md" +++ "b/LeetCode/\344\272\214\345\217\211\346\240\221.md" @@ -1007,6 +1007,8 @@ class Solution: 利用二叉树前序和中序遍历的性质,前序序列的第一个元素是树的根结点,而对于中序序列,在根节点左半部分是树的左子树,在根节点右半部分是树的右子树。对于二叉树的每个子树都有这样的规律,这很符合递归的特点。因此,在递归函数中,利用这一规律处理每个子树。 +**C++代码** + ```c++ /** * Definition for a binary tree node. @@ -1078,6 +1080,36 @@ public: }; ``` +**Python代码** + +```python +# Definition for a binary tree node. +# class TreeNode: +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class Solution: + def recursion(self,preorder,pre_l,pre_r,inorder,in_l,in_r): + if pre_l > pre_r: + return None + if pre_l == pre_r: + return TreeNode(preorder[pre_l]) + + root = preorder[pre_l] + node = TreeNode(root) + idx = inorder.index(root) + + node.left = self.recursion(preorder,pre_l + 1,pre_l + idx - in_l,inorder,in_l,idx - 1) + node.right = self.recursion(preorder,pre_l + idx - in_l + 1,pre_r,inorder,idx + 1,in_r) + + return node + + def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode: + return self.recursion(preorder,0,len(preorder) - 1,inorder,0,len(inorder) - 1) +``` + ## 求根到叶子节点数字之和 From b7cbc462ea5e6ff3c13ab918b8a88abdd78ab2a0 Mon Sep 17 00:00:00 2001 From: xcg <852390212@qq.com> Date: Sat, 18 May 2019 10:24:52 +0800 Subject: [PATCH 031/163] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\344\272\214\345\217\211\346\240\221.md" | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git "a/LeetCode/\344\272\214\345\217\211\346\240\221.md" "b/LeetCode/\344\272\214\345\217\211\346\240\221.md" index a549685..4b16a7c 100644 --- "a/LeetCode/\344\272\214\345\217\211\346\240\221.md" +++ "b/LeetCode/\344\272\214\345\217\211\346\240\221.md" @@ -2146,6 +2146,8 @@ public: ### 解答 #### 方法1:递归 +**C++代码** + ```c++ /** * Definition for a binary tree node. @@ -2176,11 +2178,40 @@ public: }; ``` +**Python代码** + +```python +# Definition for a binary tree node. +# class TreeNode: +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class Solution: + def recursion(self,root): + if root is None: + return + self.recursion(root.left) + self.lt.append(root.val) + self.recursion(root.right) + + def inorderTraversal(self, root: TreeNode) -> List[int]: + self.lt = [] + self.recursion(root) + return self.lt +``` + + + #### 方法2:迭代法(利用栈实现) + (1)树先一直向左走到叶节点并将沿途的结点入栈 ; (2)然后向右走一步,重复第一步操作。 +**C++代码** + ```c++ /** * Definition for a binary tree node. @@ -2218,6 +2249,33 @@ public: }; ``` +**Python代码** + +```python +# Definition for a binary tree node. +# class TreeNode: +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class Solution: + def inorderTraversal(self, root: TreeNode) -> List[int]: + if not root: + return [] + sta,res = [],[] + head = root + while head or len(sta) > 0: + while head: + sta.append(head) + head = head.left + head = sta.pop() + res.append(head.val) + head = head.right + return res + +``` + ## 二叉搜索树中第K小的元素 From eac397609ec6f19d177322f53ace5d715df765bc Mon Sep 17 00:00:00 2001 From: xcg <852390212@qq.com> Date: Sat, 18 May 2019 23:40:13 +0800 Subject: [PATCH 032/163] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E6=95=B0=E7=BB=84?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\346\225\260\347\273\204.md" | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git "a/LeetCode/\346\225\260\347\273\204.md" "b/LeetCode/\346\225\260\347\273\204.md" index e0cc62b..5e4d7af 100644 --- "a/LeetCode/\346\225\260\347\273\204.md" +++ "b/LeetCode/\346\225\260\347\273\204.md" @@ -1660,7 +1660,12 @@ public: **Python代码** ```python - +class Solution: + def rotate(self, matrix: List[List[int]]) -> None: + """ + Do not return anything, modify matrix in-place instead. + """ + matrix[:] = list(zip(*matrix[::-1])) ``` From 697e1a6cdb2922b5a8aa5d54846e3727c2206caa Mon Sep 17 00:00:00 2001 From: xcg <852390212@qq.com> Date: Tue, 21 May 2019 09:01:50 +0800 Subject: [PATCH 033/163] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\344\272\214\345\217\211\346\240\221.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/LeetCode/\344\272\214\345\217\211\346\240\221.md" "b/LeetCode/\344\272\214\345\217\211\346\240\221.md" index 4b16a7c..80820cd 100644 --- "a/LeetCode/\344\272\214\345\217\211\346\240\221.md" +++ "b/LeetCode/\344\272\214\345\217\211\346\240\221.md" @@ -1116,7 +1116,7 @@ class Solution: [LeetCode中文](https://leetcode-cn.com/problems/sum-root-to-leaf-numbers/) -[LeetCode英文](https://leetcode-cn.com/problems/sum-root-to-leaf-numbers/) +[LeetCode英文](https://leetcode.com/problems/sum-root-to-leaf-numbers/) 给定一个二叉树,它的每个结点都存放一个 `0-9` 的数字,每条从根到叶子节点的路径都代表一个数字。 From cd1417f43f82e2ba368aa849a4a0e03d63c88de6 Mon Sep 17 00:00:00 2001 From: xcg <852390212@qq.com> Date: Tue, 28 May 2019 13:00:46 +0800 Subject: [PATCH 034/163] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E6=95=B0=E7=BB=84?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\346\225\260\347\273\204.md" | 81 +++++++++++++++++++++++++- 1 file changed, 78 insertions(+), 3 deletions(-) diff --git "a/LeetCode/\346\225\260\347\273\204.md" "b/LeetCode/\346\225\260\347\273\204.md" index 5e4d7af..907a11a 100644 --- "a/LeetCode/\346\225\260\347\273\204.md" +++ "b/LeetCode/\346\225\260\347\273\204.md" @@ -1753,6 +1753,7 @@ public: 给定长度为 `n` 的整数数组 `nums`,其中 `n > 1`,返回输出数组 `output` ,其中 `output[i]` 等于 `nums` 中除 `nums[i]` 之外其余各元素的乘积。 **示例**: + ``` 输入: [1,2,3,4] 输出: [24,12,8,6] @@ -1816,7 +1817,18 @@ public: **Python代码** ```python - +class Solution: + def productExceptSelf(self, nums: List[int]) -> List[int]: + n = len(nums) + nums_l,nums_r = [1 for x in range(n)],[1 for x in range(n)] + res = [] + for i in range(1,n): + nums_l[i] = nums_l[i-1] * nums[i-1] + for i in range(n - 2,-1,-1): + nums_r[i] = nums_r[i + 1] * nums[i + 1] + for i in range(n): + res.append(nums_l[i] * nums_r[i]) + return res ``` #### 方法2:优化空间复杂度 @@ -1855,6 +1867,25 @@ public: +**Python代码** + +```python +class Solution: + def productExceptSelf(self, nums: List[int]) -> List[int]: + n = len(nums) + res = [1 for x in range(n)] + for i in range(1,n): + res[i] = nums[i-1] * res[i-1] + + tmp = 1 + for i in range(n - 1,-1,-1): + res[i] *= tmp + tmp *= nums[i] + return res +``` + + + ## 矩阵置零 [LeetCode中文](https://leetcode-cn.com/problems/set-matrix-zeroes) @@ -1864,6 +1895,7 @@ public: 给定一个 `m x n` 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法。 **示例 1**: + ``` 输入: [ @@ -1880,6 +1912,7 @@ public: ``` **示例 2**: + ``` 输入: [ @@ -1946,7 +1979,28 @@ public: **Python代码** ```python - +class Solution: + def setZeroes(self, matrix: List[List[int]]) -> None: + """ + Do not return anything, modify matrix in-place instead. + """ + dt_h,dt_l = dict(),dict() + m,n = len(matrix),len(matrix[0]) + for i in range(m): + dt_h[i] = False + for i in range(n): + dt_l[i] = False + for i in range(m): + for j in range(n): + if matrix[i][j] == 0: + dt_h[i] = True + dt_l[j] = True + + for i in range(m): + for j in range(n): + if dt_h[i] or dt_l[j]: + matrix[i][j] = 0 + ``` @@ -2507,7 +2561,28 @@ public: **Python代码** ```python - +class Solution: + def searchMatrix(self, matrix, target): + """ + :type matrix: List[List[int]] + :type target: int + :rtype: bool + """ + if len(matrix) == 0: + return False + m,n = len(matrix),len(matrix[0]) + i,j = 0,n - 1 + while i < m and j >= 0: + if target < matrix[i][j]: + j -= 1 + elif target > matrix[i][j]: + i += 1 + else: + return True + + return False + + ``` From c30dd078003922684651de1ea32f51792fca6703 Mon Sep 17 00:00:00 2001 From: xcg <852390212@qq.com> Date: Tue, 28 May 2019 15:04:17 +0800 Subject: [PATCH 035/163] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E8=A7=84=E5=88=92.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...50\346\200\201\350\247\204\345\210\222.md" | 34 +++++++++++++------ 1 file changed, 23 insertions(+), 11 deletions(-) diff --git "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" index faed0cf..a31500c 100644 --- "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" +++ "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" @@ -95,6 +95,7 @@ class Solution: 注意你不能在买入股票前卖出股票。 **示例 1**: + ``` 输入: [7,1,5,3,6,4] 输出: 5 @@ -102,6 +103,7 @@ class Solution: 注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。 ``` **示例 2**: + ``` 输入: [7,6,4,3,1] 输出: 0 @@ -125,7 +127,7 @@ public: for(int i=1;i& prices) { if(prices.empty()) return 0; - int len = prices.size(); int maxp = 0; int minp = prices[0]; for(int i=1;i maxp) - { - maxp = prices[i] - minp; - } - else if(prices[i] < minp) - { - minp = prices[i]; - } - + int tmp = prices[i] - minp; + maxp = max(tmp,maxp); + minp = min(prices[i],minp); } + return maxp; } }; ``` +**Python代码** + +```python +class Solution: + def maxProfit(self, prices: List[int]) -> int: + if len(prices) == 0: + return 0 + minp = prices[0] + maxp = 0 + for i in range(1,len(prices)): + tmp = prices[i] - minp + maxp = max(tmp,maxp) + minp = min(prices[i],minp) + return maxp +``` + ## 最大子序和 From 41729a7e280110f541bbd0ffe9c30317d9bb7e43 Mon Sep 17 00:00:00 2001 From: xcg <852390212@qq.com> Date: Wed, 29 May 2019 21:51:12 +0800 Subject: [PATCH 036/163] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E6=95=B0=E7=BB=84?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\346\225\260\347\273\204.md" | 56 ++++++++++++++++++++++++-- 1 file changed, 53 insertions(+), 3 deletions(-) diff --git "a/LeetCode/\346\225\260\347\273\204.md" "b/LeetCode/\346\225\260\347\273\204.md" index 907a11a..2406f69 100644 --- "a/LeetCode/\346\225\260\347\273\204.md" +++ "b/LeetCode/\346\225\260\347\273\204.md" @@ -902,7 +902,35 @@ public: **Python代码** ```python +class Solution: + def threeSumClosest(self, nums: List[int], target: int) -> int: + n = len(nums) + if n < 3: + return [] + nums.sort() + res = nums[0] + nums[1] + nums[2] + for i in range(n - 2): + if i == 0 or (i > 0 and nums[i] != nums[i - 1]): + l = i + 1 + r = n - 1 + while l < r: + tmp = nums[i] + nums[l] + nums[r] + if abs(tmp - target) < abs(res - target): + res = tmp + if tmp < target: + l += 1 + elif tmp > target: + r -= 1 + else: + return tmp + while l < r and nums[l] == nums[l - 1]: + l += 1 + while l < r and nums[r - 1] == nums[r]: + r -= 1 + if r < n - 1 and nums[r] == nums[r + 1]: + r -= 1 + return res ``` @@ -988,7 +1016,31 @@ public: **Python代码** ```python - +class Solution: + def threeSum(self, nums: List[int]) -> List[List[int]]: + n = len(nums) + res = [] + nums.sort() + for i in range(n - 2): + if i == 0 or (i > 0 and nums[i] != nums[i - 1]): + l = i + 1 + r = n - 1 + tmp = 0 - nums[i] + while l < r: + if tmp < nums[l] + nums[r]: + r -= 1 + elif tmp > nums[l] + nums[r]: + l += 1 + else: + res.append([nums[i] , nums[l] , nums[r]]) + l += 1 + r -= 1 + while l < r and nums[l] == nums[l - 1]: + l += 1 + while l < r and nums[r] == nums[r + 1]: + r -= 1 + + return res ``` @@ -2581,8 +2633,6 @@ class Solution: return True return False - - ``` From 0595667bed453b567c2e89208f4263faf69ec6e8 Mon Sep 17 00:00:00 2001 From: xcg <852390212@qq.com> Date: Thu, 30 May 2019 12:58:50 +0800 Subject: [PATCH 037/163] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E6=95=B0=E7=BB=84?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\346\225\260\347\273\204.md" | 5 ----- 1 file changed, 5 deletions(-) diff --git "a/LeetCode/\346\225\260\347\273\204.md" "b/LeetCode/\346\225\260\347\273\204.md" index 2406f69..26c2b36 100644 --- "a/LeetCode/\346\225\260\347\273\204.md" +++ "b/LeetCode/\346\225\260\347\273\204.md" @@ -1105,11 +1105,6 @@ public: }; ``` -**Python代码** - -```python - -``` From a74ff0099b6badb51da43d6ade36d2e5fa7aecc9 Mon Sep 17 00:00:00 2001 From: xcg <852390212@qq.com> Date: Sun, 2 Jun 2019 12:10:49 +0800 Subject: [PATCH 038/163] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E6=95=B0=E7=BB=84?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\346\225\260\347\273\204.md" | 75 ++++++++++++++++++++------ 1 file changed, 58 insertions(+), 17 deletions(-) diff --git "a/LeetCode/\346\225\260\347\273\204.md" "b/LeetCode/\346\225\260\347\273\204.md" index 26c2b36..1021dd9 100644 --- "a/LeetCode/\346\225\260\347\273\204.md" +++ "b/LeetCode/\346\225\260\347\273\204.md" @@ -66,8 +66,6 @@ 将数组`nums1`的元素放入一个`set`中,然后遍历`nums2`的元素`nums2[i]`,判断它是否在`set`中,如果在`set`中,则说明这个元素是交集的部分,将它加入结果中。 - - 设`nums1`的大小为`m`,数组`nums2`的大小为`n` - 时间复杂度:O(*m + n*) @@ -104,7 +102,17 @@ public: **Python代码** ```python - +class Solution: + def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]: + s = set() + res = [] + for a in nums1: + s.add(a) + for a in nums2: + if a in s: + res.append(a) + s.remove(a) + return res ``` #### 方法2:排序 +双指针 @@ -155,6 +163,31 @@ public: }; ``` +**Python代码** + +```python +class Solution: + def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]: + nums1.sort() + nums2.sort() + i = 0 + s = set() + res = [] + i,j = 0,0 + while i < len(nums1) and j < len(nums2): + if nums1[i] == nums2[j]: + s.add(nums1[i]) + i += 1 + j += 1 + elif nums1[i] > nums2[j]: + j += 1 + else: + i += 1 + for a in s: + res.append(a) + return res +``` + #### 方法3 现将`nums1`从小到大排序,遍历数组`nums2`的每一个元素`nums2[i]`,同时在`nums1`中二分查找`nums2[i]`,如果能找到`nums2[i]`,则将它加入`set`中;否则,跳过。最后,将`set`中的元素放入结果数组即可。 @@ -200,12 +233,6 @@ public: }; ``` -**Python代码** - -```python - -``` - ## 两个数组的交集II @@ -279,7 +306,20 @@ public: **Python代码** ```python - +class Solution: + def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]: + dt = {} + res = [] + for a in nums1: + if a not in dt: + dt[a] = 1 + else: + dt[a] += 1 + for b in nums2: + if b in dt and dt[b] > 0: + res.append(b) + dt[b] -= 1 + return res ``` @@ -365,12 +405,6 @@ public: }; ``` -**Python代码** - -```python - -``` - ## 杨辉三角 @@ -766,7 +800,14 @@ public: **Python代码** ```python - +class Solution: + def containsDuplicate(self, nums: List[int]) -> bool: + st = set() + for a in nums: + if a in st: + return True + st.add(a) + return False ``` From d99f5950a0cf324a9b41c7482152d4cfaa108d5a Mon Sep 17 00:00:00 2001 From: xcg <852390212@qq.com> Date: Fri, 5 Jul 2019 11:51:12 +0800 Subject: [PATCH 039/163] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20class=20Solution:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\346\225\260\347\273\204.md" | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git "a/LeetCode/\346\225\260\347\273\204.md" "b/LeetCode/\346\225\260\347\273\204.md" index 1021dd9..c365824 100644 --- "a/LeetCode/\346\225\260\347\273\204.md" +++ "b/LeetCode/\346\225\260\347\273\204.md" @@ -1827,7 +1827,22 @@ public: **Python代码** ```python - +class Solution: + def findDuplicate(self, nums: List[int]) -> int: + if len(nums) <= 0: + return False + + for i in range(len(nums)): + while i != nums[i]: + m = nums[i] + if m == nums[m]: + return m + else: + a = nums[i] + nums[i] = nums[m] + nums[m] = a + + return False ``` From abfaac1a1f3a5b37fcd1268b1c8d9b7217fee0bb Mon Sep 17 00:00:00 2001 From: xcg <852390212@qq.com> Date: Fri, 5 Jul 2019 22:33:31 +0800 Subject: [PATCH 040/163] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E5=89=91=E6=8C=87?= =?UTF-8?q?Offer.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\345\211\221\346\214\207Offer.md" | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git "a/\345\211\221\346\214\207Offer\351\242\230\350\247\243/\345\211\221\346\214\207Offer.md" "b/\345\211\221\346\214\207Offer\351\242\230\350\247\243/\345\211\221\346\214\207Offer.md" index dfc766a..1ea9fec 100644 --- "a/\345\211\221\346\214\207Offer\351\242\230\350\247\243/\345\211\221\346\214\207Offer.md" +++ "b/\345\211\221\346\214\207Offer\351\242\230\350\247\243/\345\211\221\346\214\207Offer.md" @@ -68,8 +68,92 @@ # 剑指Offer题解 ## 赋值运算符函数 + ## 实现Singleton模式 ## 数组中重复的数字 + +[Nowcoder](https://www.nowcoder.com/practice/623a5ac0ea5b4e5f95552655361ae0a8?tpId=13&tqId=11203&tPage=3&rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking) + +### 题目描述 + +在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。 + +### 解答 + +遍历数组,判断当前元素`numbers[i]`是否和位置`i`相等: + +1. 如果`numbers[i] == i`,则`numbers[i]`位于它自己的位置,`++i`遍历下一个元素; +2. 否则,找到位置是`numbers[i]`位置的元素`numbers[numbers[i]]`: + - 如果`numbers[numbers[i]] == numbers[i]`,则找到重复元素`numbers[i]` + - 否则,交换`numbers[numbers[i]]`和`numbers[i]` + 重复`情况2`的过程,直到`numbers[i] == i`时,执行`情况1`。 + +- 时间复杂度:O(*n*) +- 空间复杂度:O(1) + +**C++代码** + +```c++ +class Solution { +public: + // Parameters: + // numbers: an array of integers + // length: the length of array numbers + // duplication: (Output) the duplicated number in the array number + // Return value: true if the input is valid, and there are some duplications in the array number + // otherwise false + bool duplicate(int numbers[], int length, int* duplication) { + if(length == 0) + return false; + + for(int i=0;i Date: Sat, 6 Jul 2019 22:29:23 +0800 Subject: [PATCH 041/163] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E5=89=91=E6=8C=87?= =?UTF-8?q?Offer.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\345\211\221\346\214\207Offer.md" | 151 +++++++++++++++++- 1 file changed, 149 insertions(+), 2 deletions(-) diff --git "a/\345\211\221\346\214\207Offer\351\242\230\350\247\243/\345\211\221\346\214\207Offer.md" "b/\345\211\221\346\214\207Offer\351\242\230\350\247\243/\345\211\221\346\214\207Offer.md" index 1ea9fec..06d65f4 100644 --- "a/\345\211\221\346\214\207Offer\351\242\230\350\247\243/\345\211\221\346\214\207Offer.md" +++ "b/\345\211\221\346\214\207Offer\351\242\230\350\247\243/\345\211\221\346\214\207Offer.md" @@ -4,7 +4,7 @@ * 面试题3:[数组中重复的数字](#数组中重复的数字) * 面试题4:[二维数组的查找](#二维数组的查找) * 面试题5:[替换空格](#替换空格) - * 面试题6:[从头到尾打印链表](#从头到尾打印链表) + * 面试题6:[从尾到头打印链表](#从尾到头打印链表) * 面试题7:[重建二叉树](#重建二叉树) * 面试题8:[二叉树的下一个节点](#二叉树的下一个节点) * 面试题9:[用两个栈实现队列](#用两个栈实现队列) @@ -156,7 +156,154 @@ class Solution: ## 二维数组的查找 ## 替换空格 -## 从头到尾打印链表 + +[NowCoder]() + +### 题目描述 + +请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 + +### 解答 + +两个首先统计字符串中的空格数`cnt`,设原字符串的长度为`len`,那么替换之后字符串长度为`len + cnt * 2`,的然后定义两个指针`index1`和`index2`,刚开始`index1`和`index2`指向原字符串和新字符串末尾,然后向前反向移动指针,逐个将`index1`位置的字符赋值给`index2`位置,如果`index1`位置遇到空格,则在`index2`位置开始之前的三个位置赋值为"%20",同时`index2`向前移动3个位置,重复以上过程,直到`index1`到达字符串第一个字符或者`index2 == index1`为止。 + +**注意**:字符串反向复制,避免内存重叠! + +* 时间复杂度:O(*n*) + +**C++代码** + +```c++ +class Solution { +public: + void replaceSpace(char *str,int length) { + if(length <= 0 || !str) + return; + + int cnt=0; + for(int i=0;i= 0 && index2 > index1) + { + if(str[index1] != ' ') + { + str[index2--] = str[index1--]; + } + else{ + str[index2--] = '0'; + str[index2--] = '2'; + str[index2--] = '%'; + index1--; + } + } + + } +}; +``` + + + +**Python代码** + +```python +# -*- coding:utf-8 -*- +class Solution: + # s 源字符串 + def replaceSpace(self, s): + # write code here + res = '' + for ch in s: + if ch != ' ': + res += ch + else: + res += '%20' + + return res +``` + + + +## 从尾到头打印链表 + +### 题目描述 + +输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。 + +### 解答 + +#### 方法1 + +如果允许原地修改链表,转换为**反转链表**问题,详见[反转链表](https://github.com/Making-It/Code/blob/master/LeetCode/链表.md#反转链表) + +* 时间复杂度:O(*n*) +* 空间复杂度:O(1) + +#### 方法2 + +如果不允许原地修改链表,那么可以利用栈后进先出的特点,遍历链表,逐个将链表元素放入栈中,然后依次弹出栈顶元素并打印。 + +* 时间复杂度:O(*n*) +* 空间复杂度:O(*n*) + +**C++代码** + +```c++ +/** +* struct ListNode { +* int val; +* struct ListNode *next; +* ListNode(int x) : +* val(x), next(NULL) { +* } +* }; +*/ +class Solution { +public: + vector printListFromTailToHead(ListNode* head) { + vector res; + if(!head) + return res; + + stack sta; + ListNode* p = head; + while(p) + { + sta.push(p->val); + p = p->next; + } + while(!sta.empty()) + { + int a = sta.top(); + sta.pop(); + res.push_back(a); + } + + return res; + } +}; +``` + + + +**Python代码** + +```python + +``` + + + + + ## 重建二叉树 ## 二叉树的下一个节点 ## 用两个栈实现队列 From 45a9d4a5d95ad026cf13db1471f7fd13fb00a700 Mon Sep 17 00:00:00 2001 From: xcg <852390212@qq.com> Date: Sun, 7 Jul 2019 10:08:51 +0800 Subject: [PATCH 042/163] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E5=89=91=E6=8C=87?= =?UTF-8?q?Offer.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\345\211\221\346\214\207Offer.md" | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git "a/\345\211\221\346\214\207Offer\351\242\230\350\247\243/\345\211\221\346\214\207Offer.md" "b/\345\211\221\346\214\207Offer\351\242\230\350\247\243/\345\211\221\346\214\207Offer.md" index 06d65f4..03a4d3b 100644 --- "a/\345\211\221\346\214\207Offer\351\242\230\350\247\243/\345\211\221\346\214\207Offer.md" +++ "b/\345\211\221\346\214\207Offer\351\242\230\350\247\243/\345\211\221\346\214\207Offer.md" @@ -1,6 +1,4 @@ * **剑指Offer题解** - * 面试题1:[赋值运算符函数](#赋值运算符函数) - * 面试题2:[实现Singleton模式](#实现Singleton模式) * 面试题3:[数组中重复的数字](#数组中重复的数字) * 面试题4:[二维数组的查找](#二维数组的查找) * 面试题5:[替换空格](#替换空格) @@ -67,9 +65,6 @@ * 面试题66:[构建乘积数组](#构建乘积数组) # 剑指Offer题解 -## 赋值运算符函数 - -## 实现Singleton模式 ## 数组中重复的数字 [Nowcoder](https://www.nowcoder.com/practice/623a5ac0ea5b4e5f95552655361ae0a8?tpId=13&tqId=11203&tPage=3&rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking) @@ -234,6 +229,8 @@ class Solution: ## 从尾到头打印链表 +[NowCoder]() + ### 题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。 @@ -297,7 +294,28 @@ public: **Python代码** ```python +# -*- coding:utf-8 -*- +# class ListNode: +# def __init__(self, x): +# self.val = x +# self.next = None +class Solution: + # 返回从尾部到头部的列表值序列,例如[1,2,3] + def printListFromTailToHead(self, listNode): + # write code here + sta = [] + p = listNode + while p: + sta.append(p.val) + p = p.next + + res = [] + while len(sta) > 0: + res.append(sta[-1]) + sta.pop() + + return res ``` From f4d569fc0d2fc13a34f54c2d215fc3d79ec5c4ec Mon Sep 17 00:00:00 2001 From: xcg <852390212@qq.com> Date: Sun, 7 Jul 2019 10:42:07 +0800 Subject: [PATCH 043/163] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E9=93=BE=E8=A1=A8?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\351\223\276\350\241\250.md" | 85 +++++++++++++++++++++++++- 1 file changed, 83 insertions(+), 2 deletions(-) diff --git "a/LeetCode/\351\223\276\350\241\250.md" "b/LeetCode/\351\223\276\350\241\250.md" index c6005ee..f8ef0f5 100644 --- "a/LeetCode/\351\223\276\350\241\250.md" +++ "b/LeetCode/\351\223\276\350\241\250.md" @@ -422,8 +422,6 @@ class Solution: - - ## 回文链表 [LeetCode中文](https://leetcode-cn.com/problems/palindrome-linked-list/) @@ -592,6 +590,43 @@ public: +**Python代码** + +```python +# Definition for singly-linked list. +# class ListNode(object): +# def __init__(self, x): +# self.val = x +# self.next = None + +class Solution(object): + def hasCycle(self, head): + """ + :type head: ListNode + :rtype: bool + """ + if not head: + return False + + if head.next: + p1 = head.next.next + p2 = head.next + else: + return False + + while p1 != p2 and p1 : + p1 = p1.next + if p1: + p1 = p1.next + p2 = p2.next + + if not p1: + return False + return True +``` + + + ## 环形链表II [LeetCode中文](https://leetcode-cn.com/problems/linked-list-cycle-ii/) @@ -615,6 +650,7 @@ public: ![1](https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2018/12/07/circularlinkedlist.png) **示例 2**: + ``` 输入:head = [1,2], pos = 0 输出:tail connects to node index 0 @@ -724,6 +760,7 @@ public: ``` **注意**: + * 如果两个链表没有交点,返回 null. * 在返回结果后,两个链表仍须保持原有的结构。 * 可假定整个链表结构中没有循环。 @@ -799,6 +836,50 @@ public: }; ``` +**Python代码** + +```python +# Definition for singly-linked list. +# class ListNode(object): +# def __init__(self, x): +# self.val = x +# self.next = None + +class Solution(object): + def getIntersectionNode(self, headA, headB): + """ + :type head1, head1: ListNode + :rtype: ListNode + """ + n1 = n2 = 0 + p = headA + while p: + n1 += 1 + p = p.next + p = headB + + while p: + n2 += 1 + p = p.next + + p1 = p2 = None + if n1 > n2: + p1 = headA + p2 = headB + else: + p1 = headB + p2 = headA + + for i in range(abs(n1 - n2)): + p1 = p1.next + + while p1 and p2 and p1 != p2: + p1 = p1.next + p2 = p2.next + + return p1 +``` + ## 奇偶链表 From fbaa326d9606bfeef6fe275e1684fe04b18525cc Mon Sep 17 00:00:00 2001 From: xcg <852390212@qq.com> Date: Sun, 7 Jul 2019 10:59:15 +0800 Subject: [PATCH 044/163] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E5=89=91=E6=8C=87?= =?UTF-8?q?Offer.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\345\211\221\346\214\207Offer.md" | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git "a/\345\211\221\346\214\207Offer\351\242\230\350\247\243/\345\211\221\346\214\207Offer.md" "b/\345\211\221\346\214\207Offer\351\242\230\350\247\243/\345\211\221\346\214\207Offer.md" index 03a4d3b..2564d99 100644 --- "a/\345\211\221\346\214\207Offer\351\242\230\350\247\243/\345\211\221\346\214\207Offer.md" +++ "b/\345\211\221\346\214\207Offer\351\242\230\350\247\243/\345\211\221\346\214\207Offer.md" @@ -150,6 +150,19 @@ class Solution: ## 二维数组的查找 + +[NowCoder]() + +### 题目描述 + +在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 + +### 解答 + +参考[搜索二维矩阵II](https://github.com/Making-It/Code/blob/master/LeetCode/数组.md#搜索二维矩阵II) + + + ## 替换空格 [NowCoder]() From 4288b01226ee03e373ed0fbec6b834ff2307ada9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?millerxie=28=E8=B0=A2=E6=99=A8=E5=85=89=29?= Date: Tue, 9 Jul 2019 20:55:59 +0800 Subject: [PATCH 045/163] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E5=89=91=E6=8C=87?= =?UTF-8?q?Offer=E9=A2=98=E8=A7=A3.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\345\211\221\346\214\207Offer.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/\345\211\221\346\214\207Offer\351\242\230\350\247\243/\345\211\221\346\214\207Offer.md" "b/\345\211\221\346\214\207Offer\351\242\230\350\247\243/\345\211\221\346\214\207Offer.md" index 2564d99..a311536 100644 --- "a/\345\211\221\346\214\207Offer\351\242\230\350\247\243/\345\211\221\346\214\207Offer.md" +++ "b/\345\211\221\346\214\207Offer\351\242\230\350\247\243/\345\211\221\346\214\207Offer.md" @@ -149,6 +149,8 @@ class Solution: + + ## 二维数组的查找 [NowCoder]() From e3eaeed7e5ef9dba59d8af9a1a4b9a610ffd9381 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?millerxie=28=E8=B0=A2=E6=99=A8=E5=85=89=29?= Date: Sun, 14 Jul 2019 11:07:50 +0800 Subject: [PATCH 046/163] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E5=89=91=E6=8C=87?= =?UTF-8?q?Offer.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\345\211\221\346\214\207Offer.md" | 446 +++++++++++++++++- 1 file changed, 436 insertions(+), 10 deletions(-) diff --git "a/\345\211\221\346\214\207Offer\351\242\230\350\247\243/\345\211\221\346\214\207Offer.md" "b/\345\211\221\346\214\207Offer\351\242\230\350\247\243/\345\211\221\346\214\207Offer.md" index a311536..307aedb 100644 --- "a/\345\211\221\346\214\207Offer\351\242\230\350\247\243/\345\211\221\346\214\207Offer.md" +++ "b/\345\211\221\346\214\207Offer\351\242\230\350\247\243/\345\211\221\346\214\207Offer.md" @@ -83,11 +83,11 @@ - 否则,交换`numbers[numbers[i]]`和`numbers[i]` 重复`情况2`的过程,直到`numbers[i] == i`时,执行`情况1`。 +**C++代码** + - 时间复杂度:O(*n*) - 空间复杂度:O(1) -**C++代码** - ```c++ class Solution { public: @@ -149,8 +149,6 @@ class Solution: - - ## 二维数组的查找 [NowCoder]() @@ -175,14 +173,15 @@ class Solution: ### 解答 -两个首先统计字符串中的空格数`cnt`,设原字符串的长度为`len`,那么替换之后字符串长度为`len + cnt * 2`,的然后定义两个指针`index1`和`index2`,刚开始`index1`和`index2`指向原字符串和新字符串末尾,然后向前反向移动指针,逐个将`index1`位置的字符赋值给`index2`位置,如果`index1`位置遇到空格,则在`index2`位置开始之前的三个位置赋值为"%20",同时`index2`向前移动3个位置,重复以上过程,直到`index1`到达字符串第一个字符或者`index2 == index1`为止。 +两个首先统计字符串中的空格数`cnt`,设原字符串的长度为`len`,那么替换之后字符串长度为`len + cnt * 2`,然后定义两个指针`index1`和`index2`,刚开始`index1`和`index2`指向原字符串和新字符串末尾,然后向前反向移动指针,逐个将`index1`位置的字符赋值给`index2`位置,如果`index1`位置遇到空格,则在`index2`位置开始之前的三个位置赋值为"%20",同时`index2`向前移动3个位置,重复以上过程,直到`index1`到达字符串第一个字符或者`index2 == index1`为止。 **注意**:字符串反向复制,避免内存重叠! -* 时间复杂度:O(*n*) - **C++代码** +* 时间复杂度:O(*n*) +* 空间复杂度:O(1) + ```c++ class Solution { public: @@ -263,11 +262,11 @@ class Solution: 如果不允许原地修改链表,那么可以利用栈后进先出的特点,遍历链表,逐个将链表元素放入栈中,然后依次弹出栈顶元素并打印。 +**C++代码** + * 时间复杂度:O(*n*) * 空间复杂度:O(*n*) -**C++代码** - ```c++ /** * struct ListNode { @@ -335,18 +334,445 @@ class Solution: +## 重建二叉树 + +[NowCoder](https://www.nowcoder.com/practice/8a19cbe657394eeaac2f6ea9b0f6fcf6?tpId=13&tqId=11157&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking) + +### 题目描述 + +输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 + +### 解答 + +详见LeetCode题解 [从前序与中序遍历序列构造二叉树](https://github.com/Making-It/Code/blob/master/LeetCode/二叉树.md#从前序与中序遍历序列构造二叉树) + -## 重建二叉树 ## 二叉树的下一个节点 + +[NowCoder]() + +### 题目描述 + +给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。 + +### 解答 + +分几种情况考虑: + +* 如果节点`pNode`有右子树,那么找到`pNode`右子树的最左节点就是下一个节点 +* 如果节点`pNode`没有右子树,分两种情况: + * 如果`pNode`的父节点为空,返回空值`None` + * 如果`pNode`是它的父节点的左子节点,那么下一个节点是它的父节点 + * 如果`pNode`是它的父节点的右子节点,那么从它的父节点一直往上找,直到当前节点的父节点为空或者它是父节点的左子节点为止,此时的父节点就是下一个节点 + +**C++代码** + +```c++ +/* +struct TreeLinkNode { + int val; + struct TreeLinkNode *left; + struct TreeLinkNode *right; + struct TreeLinkNode *next; + TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) { + + } +}; +*/ +class Solution { +public: + TreeLinkNode* GetNext(TreeLinkNode* pNode) + { + TreeLinkNode* res = nullptr; + if(pNode->right) + { + res = pNode->right; + while(res->left) + { + res = res->left; + } + } + else{ + if(!pNode->next) return nullptr; + if(pNode == pNode->next->left) + res = pNode->next; + else{ + res = pNode->next; + while(res->next && res == res->next->right) + { + res = res->next; + } + res = res->next; + } + } + + return res; + } +}; +``` + +**Python代码** + +```python +# -*- coding:utf-8 -*- +# class TreeLinkNode: +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None +# self.next = None +class Solution: + def GetNext(self, pNode): + # write code here + res = None + if pNode.right is not None: + res = pNode.right + while res.left is not None: + res = res.left + else: + if not pNode.next: + return None + if pNode.next and pNode == pNode.next.left: + res = pNode.next + else: + res = pNode.next + while res.next and res == res.next.right: + res = res.next + res = res.next + + return res +``` + + + ## 用两个栈实现队列 + +[NowCoder](https://www.nowcoder.com/practice/54275ddae22f475981afa2244dd448c6?tpId=13&tqId=11158&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking) + +### 题目描述 + +用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 + +### 解答 + +结合栈结构先进后出以及队列结构先进先出的特点: + +* 当`push`操作时,直接将元素加到栈1中 +* 而当`pop`时,首先检查栈2: + * 如果栈2有元素,直接弹出栈2的栈顶元素 + * 如果栈2为空,则逐个将栈1的元素弹出并加入到栈2中,直到栈1为空,最后弹出栈2的栈顶元素即可 + +**C++代码** + +* 时间复杂度:`push`为O(1),`pop`为O(*n*) +* 空间复杂度:O(*n*) + +```c++ +class Solution +{ +public: + void push(int node) { + stack1.push(node); + } + + int pop() { + if(stack2.empty()) + { + if(!stack1.empty()) + { + while(!stack1.empty()) + { + int a=stack1.top(); + stack1.pop(); + stack2.push(a); + } + } + else + return 0; + } + int res=stack2.top(); + stack2.pop(); + return res; + } + +private: + stack stack1; + stack stack2; +}; +``` + +**Python代码** + +```python +# -*- coding:utf-8 -*- +class Solution: + def __init__(self): + self.sta1 = [] + self.sta2 = [] + def push(self, node): + # write code here + self.sta1.append(node) + def pop(self): + # return xx + if len(self.sta2) == 0: + if len(self.sta1) == 0: + return None + else: + while len(self.sta1) > 0: + self.sta2.append(self.sta1.pop()) + return self.sta2.pop() +``` + + + ## 裴波那契数列 + +[NowCoder](https://www.nowcoder.com/practice/c6c7742f5ba7442aada113136ddea0c3?tpId=13&tqId=11160&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking) + +### 题目描述 + +大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。 + +n<=39 + +### 解答 + +#### 方法1:递归 + +会进行很多重复计算,需要优化 + +* 时间复杂度:O(*2n*) +* 空间复杂度:O(*n*) + +#### 方法2:迭代 + +循环代替递归,优化到线性的时间复杂度 + +**C++代码** + +- 时间复杂度:O(*n*) +- 空间复杂度:O(*1*) + +```c++ +class Solution { +public: + int Fibonacci(int n) { + if(n <= 0) + return 0; + if(n == 1 || n == 2) + return 1; + + int pre = 1; + int last = 1; + int cur; + for(int i = 2;i < n;i++) + { + cur = pre + last; + + pre = last; + last = cur; + } + return cur; + } +}; +``` + +**Python代码** + +```python +# -*- coding:utf-8 -*- +class Solution: + def Fibonacci(self, n): + # write code here + if n == 0: + return 0 + if n == 1: + return 1 + pre,cur = 0,1 + for i in range(2,n+1): + nex = pre + cur + pre = cur + cur = nex + return nex +``` + + + ## 旋转数组的最小数字 + +[NowCoder]() + +### 题目描述 + + + +### 解答 + + + +**C++代码** + +- 时间复杂度:O() +- 空间复杂度:O() + +```c++ + +``` + +**Python代码** + +```python + +``` + + + ## 矩阵中的路径 + +[NowCoder]() + +### 题目描述 + + + +### 解答 + + + +**C++代码** + +- 时间复杂度:O() +- 空间复杂度:O() + +```c++ + +``` + +**Python代码** + +```python + +``` + + + ## 机器人的运动范围 + +[NowCoder]() + +### 题目描述 + + + +### 解答 + + + +**C++代码** + +- 时间复杂度:O() +- 空间复杂度:O() + +```c++ + +``` + +**Python代码** + +```python + +``` + + + ## 剪绳子 + +[NowCoder]() + +### 题目描述 + + + +### 解答 + + + +**C++代码** + +- 时间复杂度:O() +- 空间复杂度:O() + +```c++ + +``` + +**Python代码** + +```python + +``` + + + ## 二进制中1的个数 + +[NowCoder]() + +### 题目描述 + + + +### 解答 + + + +**C++代码** + +- 时间复杂度:O() +- 空间复杂度:O() + +```c++ + +``` + +**Python代码** + +```python + +``` + + + ## 数值的整数次方 + +[NowCoder]() + +### 题目描述 + + + +### 解答 + + + +**C++代码** + +- 时间复杂度:O() +- 空间复杂度:O() + +```c++ + +``` + +**Python代码** + +```python + +``` + + + ## 打印从1到最大的n位数 ## 删除链表的节点 ## 正则表达式匹配 From 726df239e8bfb0939c9ca61532211363eb381d6f Mon Sep 17 00:00:00 2001 From: Making-It <852390212@qq.com> Date: Sun, 14 Jul 2019 11:32:45 +0800 Subject: [PATCH 047/163] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E5=89=91=E6=8C=87?= =?UTF-8?q?Offer.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\345\211\221\346\214\207Offer.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/\345\211\221\346\214\207Offer\351\242\230\350\247\243/\345\211\221\346\214\207Offer.md" "b/\345\211\221\346\214\207Offer\351\242\230\350\247\243/\345\211\221\346\214\207Offer.md" index 307aedb..85e5fc2 100644 --- "a/\345\211\221\346\214\207Offer\351\242\230\350\247\243/\345\211\221\346\214\207Offer.md" +++ "b/\345\211\221\346\214\207Offer\351\242\230\350\247\243/\345\211\221\346\214\207Offer.md" @@ -159,7 +159,7 @@ class Solution: ### 解答 -参考[搜索二维矩阵II](https://github.com/Making-It/Code/blob/master/LeetCode/数组.md#搜索二维矩阵II) +参考LeetCode题解 [搜索二维矩阵II](https://github.com/Making-It/Code/blob/master/LeetCode/数组.md#搜索二维矩阵II) @@ -350,7 +350,7 @@ class Solution: ## 二叉树的下一个节点 -[NowCoder]() +[NowCoder](https://www.nowcoder.com/practice/9023a0c988684a53960365b889ceaf5e?tpId=13&tqId=11210&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking) ### 题目描述 From c8acf121b3093a5392c7275dbd1f6810d093cbd8 Mon Sep 17 00:00:00 2001 From: millerxie Date: Tue, 4 Feb 2020 13:02:30 +0800 Subject: [PATCH 048/163] =?UTF-8?q?=E6=B7=BB=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...50\346\200\201\350\247\204\345\210\222.md" | 67 +++- "LeetCode/\345\233\236\346\272\257.md" | 81 +++- "LeetCode/\346\225\260\347\273\204.md" | 62 +++- .../\347\272\277\346\256\265\346\240\221.md" | 77 +++- "LeetCode/\350\264\252\345\277\203.md" | 345 +++++++++++++++++- 5 files changed, 618 insertions(+), 14 deletions(-) diff --git "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" index a31500c..801775e 100644 --- "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" +++ "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" @@ -17,8 +17,8 @@ * [最大回文子串](#最大回文子串) (`medium`) * [无重复字符的最长子串](#无重复字符的最长子串) (`medium` `hash` `滑动窗口`) * [戳气球](#戳气球) (`hard`) - - +* [最长等差数列](#最长等差数列) (`medium`) + * [最长递增子序列的个数](#最长递增子序列的个数) (`medium`) # 动态规划总结 @@ -1917,3 +1917,66 @@ public: }; ``` + + +## 最长等差数列 + +[LeetCode中文](https://leetcode-cn.com/problems/longest-arithmetic-sequence/) + +[LeetCode英文](https://leetcode.com/problems/longest-arithmetic-sequence/) + +### 解答 + +**Python代码** + +```python +from collections import defaultdict + +class Solution: + def longestArithSeqLength(self, A: List[int]) -> int: + l = len(A) + if l <= 1: + return l + dp = [{} for _ in range(l)] + res = 2 + for i in range(1, l): + for j in range(i): + d = A[i] - A[j] + dp[i][d] = dp[j].get(d, 1) + 1 + res = max(dp[i][d], res) + return res +``` + + + +## 最长递增子序列的个数 + +[LeetCode中文](https://leetcode-cn.com/problems/number-of-longest-increasing-subsequence/) + +[LeetCode英文](https://leetcode.com/problems/number-of-longest-increasing-subsequence/) + + + +### 解答 + +**Python代码** + +```python +class Solution: + def findNumberOfLIS(self, nums: List[int]) -> int: + if len(nums) == 0: + return 0 + dp_len, dp_num = [1] * len(nums), [1] * len(nums) + for i in range(1, len(nums)): + for j in range(i): + if nums[i] > nums[j]: + dp_len[i] = max(dp_len[j] + 1, dp_len[i]) + tmp_num = 0 + for j in range(i): + if nums[i] > nums[j] and dp_len[j] == dp_len[i] - 1: + tmp_num += dp_num[j] + dp_num[i] = max(dp_num[i], tmp_num) + max_len = max(dp_len) + return sum(x for i, x in enumerate(dp_num) if dp_len[i] == max_len) +``` + diff --git "a/LeetCode/\345\233\236\346\272\257.md" "b/LeetCode/\345\233\236\346\272\257.md" index bb887c8..fd91967 100644 --- "a/LeetCode/\345\233\236\346\272\257.md" +++ "b/LeetCode/\345\233\236\346\272\257.md" @@ -7,6 +7,9 @@ * [格雷编码](#格雷编码) (`medium`) * [累加数](#累加数) (`medium`) * [将数组拆分成斐波那契序列](#将数组拆分成斐波那契序列) (`medium` `贪心`) + * [解数独](#解数独) (`hard` `哈希`) + + # 回溯法总结 @@ -333,7 +336,7 @@ public: #### 方法1 -利用全排列的原理,设`nums`大小为`n`,想象有`n`个空位排成一排,从左往右,每一次都从数组选择一个数`nums[i]`放入空位,后面的空位就不能选择`nums[i]`,每一个空位都有多种选择,这样`n`个空位的选择组合在一起,就得到了所有可能的全排列。这个过程用递归来实现,定义`bool`类型数组`vis`来记录访问过的数字,定义数组`res`存放结果,每一步递归循环访问`nums`中所有未被访问的元素`nums[i]`,并加入临时数组`tmp`,同时在`vis`中记录(令`vis[i] = true`),然后进入下一层递归。定义变量`idx`记录递归层书,那么递归结束条件是`idx == nums.size()`,此时`tmp`中已经存放了数组序列的全排列之一,将`tmp`加入结果数组`res`,然后返回。最后,所有递归过程结束之后,数组`res`就存放了所有的全排列。 +利用全排列的原理,设`nums`大小为`n`,想象有`n`个空位排成一排,从左往右,每一次都从数组选择一个数`nums[i]`放入空位,后面的空位就不能选择`nums[i]`,每一个空位都有多种选择,这样`n`个空位的选择组合在一起,就得到了所有可能的全排列。这个过程用递归来实现,定义`bool`类型数组`vis`来记录访问过的数字,定义数组`res`存放结果,每一步递归循环访问`nums`中所有未被访问的元素`nums[i]`,并加入临时数组`tmp`,同时在`vis`中记录(令`vis[i] = true`),然后进入下一层递归。定义变量`idx`记录递归层数,那么递归结束条件是`idx == nums.size()`,此时`tmp`中已经存放了数组序列的全排列之一,将`tmp`加入结果数组`res`,然后返回。最后,所有递归过程结束之后,数组`res`就存放了所有的全排列。 * 时间复杂度:O(*n!*) * 空间复杂度:O(*n*) (忽略存放结果的数组占用的内存) @@ -666,7 +669,7 @@ public: -# 将数组拆分成斐波那契序列 +## 将数组拆分成斐波那契序列 [LeetCode中文](https://leetcode-cn.com/problems/split-array-into-fibonacci-sequence) @@ -804,3 +807,77 @@ public: ``` + +## 解数独 + +[LeetCode中文](https://leetcode-cn.com/problems/sudoku-solver/) + +[LeetCode英文](https://leetcode.com/problems/sudoku-solver/) + + + +### 解答 + +**Python代码** + +```python +class Solution: + def solveSudoku(self, board: List[List[str]]) -> None: + """ + Do not return anything, modify board in-place instead. + """ + def _remove_num(val: int, i: int, j: int, block_i: int): + row_list[val][i] -= 1 + col_list[val][j] -= 1 + block_list[val][block_i] -= 1 + board[i][j] = '.' + + def _add_num(val: int, i: int, j: int, block_i: int): + row_list[val][i] += 1 + col_list[val][j] += 1 + block_list[val][block_i] += 1 + board[i][j] = str(val) + + def _place_next_num(i: int, j: int): + if i == 8 and j == 8: + return True + elif j == 8: + if _dfs(i + 1, 0): + return True + elif _dfs(i, j + 1): + return True + return False + + def _get_block(i: int, j: int): + return (i // 3) * 3 + j // 3 + + def _dfs(i: int, j: int) -> bool: + if board[i][j] != '.': + if _place_next_num(i, j): + return True + else: + for val in range(1, 10): + block_i = _get_block(i, j) + if row_list[val][i] > 0 or col_list[val][j] > 0 \ + or block_list[val][block_i] > 0: + continue + _add_num(val, i, j, block_i) + if _place_next_num(i, j): + return True + _remove_num(val, i, j, block_i) + return False + + row_list = [[0 for i in range(9)] for i in range(10)] + col_list = [[0 for i in range(9)] for i in range(10)] + block_list = [[0 for i in range(9)] for i in range(10)] + for i in range(0, 9): + for j in range(0, 9): + val = board[i][j] + if val != '.': + row_list[int(val)][i] += 1 + col_list[int(val)][j] += 1 + block_i = _get_block(i, j) + block_list[int(val)][block_i] += 1 + _dfs(0, 0) +``` + diff --git "a/LeetCode/\346\225\260\347\273\204.md" "b/LeetCode/\346\225\260\347\273\204.md" index c365824..8d30759 100644 --- "a/LeetCode/\346\225\260\347\273\204.md" +++ "b/LeetCode/\346\225\260\347\273\204.md" @@ -11,6 +11,7 @@ * [判断子序列](#判断子序列) (`medium` `双指针`) * [盛最多水的容器](#盛最多水的容器) (`medium` `双指针`) * [三数之和](#三数之和) (`medium` `双指针`) + * [四数之和](#四数之和) (`medium` `双指针`) * [最接近的三数之和](#最接近的三数之和) (`medium` `双指针`) * [删除排序数组中的重复项](#删除排序数组中的重复项) (`easy` `双指针`) * [合并两个有序数组](#合并两个有序数组) (`easy` `双指针`) @@ -28,8 +29,8 @@ * [合并区间](#合并区间) (`medium` `排序`) * [下一个排列](#下一个排列) (`medium`) * [寻找重复数](#寻找重复数) (`medium` `交换`) - * [缺失的第一个正数](#缺失的第一个正数) (`hard` `交换`) - + * [缺失的第一个正数](#缺失的第一个正数) (`hard` `交换`) + # 数组类总结 @@ -2831,4 +2832,59 @@ public: ```python -``` \ No newline at end of file +``` + + + +## 四数之和 + +[LeetCode中文](https://leetcode-cn.com/problems/4sum/) + +[LeetCode英文](https://leetcode.com/problems/4sum/) + +### 解答 + +双指针 + + + +**Python代码** + +```python +class Solution: + def fourSum(self, nums: list, target: int) -> list: + nums.sort() + if len(nums) < 4: + return [] + idx1 = 0 + out_list = [] + while idx1 < len(nums) - 3: + idx2 = idx1 + 1 + while idx2 < len(nums) - 2: + target_tmp = target - nums[idx1] - nums[idx2] + l = idx2 + 1 + r = len(nums) - 1 + while l < r: + if target_tmp > nums[l] + nums[r]: + l += 1 + elif target_tmp < nums[l] + nums[r]: + r -= 1 + else: + tmp_list = [nums[idx1], nums[idx2], nums[l], nums[r]] + if tmp_list not in out_list: + out_list.append(tmp_list) + while l < r and nums[l] == nums[l + 1]: + l += 1 + while l < r and nums[r - 1] == nums[r]: + r -= 1 + l += 1 + r -= 1 + idx2 += 1 + while idx2 < len(nums) - 2 and nums[idx2] == nums[idx2 - 1]: + idx2 += 1 + idx1 += 1 + while idx1 < len(nums) - 3 and nums[idx1] == nums[idx1 - 1]: + idx1 += 1 + return out_list +``` + diff --git "a/LeetCode/\347\272\277\346\256\265\346\240\221.md" "b/LeetCode/\347\272\277\346\256\265\346\240\221.md" index fbe90e4..e26944b 100644 --- "a/LeetCode/\347\272\277\346\256\265\346\240\221.md" +++ "b/LeetCode/\347\272\277\346\256\265\346\240\221.md" @@ -1,6 +1,7 @@ * **线段树总结** * [区间和检索-数组可修改](#区间和检索-数组可修改) (`medium`) * [计算右侧小于当前元素的个数](#计算右侧小于当前元素的个数) (`hard`) + * [字符串中的加粗单词](#字符串中的加粗单词) (`easy`) # 线段树总结 ## 区间和检索-数组可修改 @@ -28,7 +29,7 @@ sumRange(0, 2) -> 8 1. 数组仅可以在 `update` 函数下进行修改。 2. 你可以假设 `update` 函数与 `sumRange` 函数的调用次数是均匀分布的。 -## 解答 +### 解答 参考 [线段树课程-九章算法](https://www.jiuzhang.com/tutorial/segment-tree) @@ -173,7 +174,7 @@ private: 1 的右侧有 0 个更小的元素. ``` -## 解答 +### 解答 此问题可以转化为线段树的区间问题,对于`nums[i]`,求小于它的元素个数相当于是求在区间`0~nums[i]-1`中的元素个数。开辟数组`count`,找出数组`nums`的最大值`num_max`和最小值`num_min`,`count`的大小为`num_max-num_min+1`,`count[i]`表示数`i+num_min`到目前为止的数量,将`count`建立成线段树。然后从右往左遍历`nums`,遇到`nums[i]`时,去查询`count`在`0~nums[i]-1`区间的总和,即`nums[i]`右边小于它的元素个数。每次查询完后,将查询结果添加到结果`res`中,然后将`nums[i]`在`count`对应的计数值加一(即`count[nums[i] - num_min]`加一),同时更新到线段树。遍历结束后,将结果数组`res`反转即为所求。 @@ -315,3 +316,75 @@ private: ``` + +## 字符串中的加粗单词 + +[LeetCode中文](https://leetcode-cn.com/problems/bold-words-in-string/) + +[LeetCode英文](https://leetcode.com/problems/bold-words-in-string/) + +给定一个关键词集合 `words` 和一个字符串 `S`,将所有 `S` 中出现的关键词加粗。所有在标签 `` 和 `` 中的字母都会加粗。 + +返回的字符串需要使用尽可能少的标签,当然标签应形成有效的组合。 + +例如,给定`words = ["ab", "bc"]` 和 `S = "aabcd"`,需要返回 `"aabcd"`。注意返回 `"aabcd"` 会使用更多的标签,因此是错误的。 + +**注**: + +* `words` 长度的范围为 `[0, 50]`。 +* `words[i]` 长度的范围为 `[1, 10]`。 +* `S` 长度的范围为 `[0, 500]`。 +* 所有 `words[i]` 和 `S` 中的字符都为小写字母。 + +### 解答 + +#### 方法1:字典树 + + + +**C++代码** + +```c++ + +``` + +#### 方法2:哈希 + + + +**Python代码** + +```python +class Solution: + def boldWords(self, words: List[str], S: str) -> str: + bold_tag = [False] * len(S) + for w in words: + b = 0 + l = len(w) + while b < len(S): + if w not in S[b:]: + break + idx = S.index(w, b) + for i in range(idx, idx + l): + bold_tag[i] = True + b = idx + 1 + res = '' + i = 0 + while i < len(S): + if not bold_tag[i]: + res += S[i] + i += 1 + else: + res += '' + S[i] + i += 1 + while i < len(S) and bold_tag[i]: + res += S[i] + i += 1 + res += '' + return res +``` + + + + + diff --git "a/LeetCode/\350\264\252\345\277\203.md" "b/LeetCode/\350\264\252\345\277\203.md" index 0b8eac9..dcd6176 100644 --- "a/LeetCode/\350\264\252\345\277\203.md" +++ "b/LeetCode/\350\264\252\345\277\203.md" @@ -1,13 +1,22 @@ * **贪心总结** - + * [买卖股票的最佳时机II](#买卖股票的最佳时机II) (`easy`) * [柠檬水找零](#柠檬水找零) (`easy`) * [分发饼干](#分发饼干) (`easy`) * [任务调度器](#任务调度器) (`medium`) * [分割数组为连续子序列](#分割数组为连续子序列) (`medium`) * [跳跃游戏](#跳跃游戏) (`medium` `动态规划`) - + * [使数组唯一的最大增量](#使数组唯一的最大增量) (`medium` ) + * [分发糖果](#分发糖果) (`hard`) + * [根据身高重建队列](#根据身高重建队列) (`medium`) + * [救生艇](#救生艇) (`medium`) + * [用最少数量的箭引爆气球](#用最少数量的箭引爆气球) (`medium`) + * [移掉K位数字](#移掉K位数字) (`medium`) + * [无重叠区间](#无重叠区间) (`medium`) + * [加油站](#加油站) (`medium`) + + # 贪心总结 ## 买卖股票的最佳时机II [LeetCode中文](https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii/) @@ -254,7 +263,7 @@ public: -# 任务调度器 +## 任务调度器 [LeetCode中文](https://leetcode-cn.com/problems/task-scheduler) @@ -356,7 +365,7 @@ public: -# 分割数组为连续子序列 +## 分割数组为连续子序列 [LeetCode中文](https://leetcode-cn.com/problems/split-array-into-consecutive-subsequences) @@ -445,7 +454,7 @@ public: -# 跳跃游戏 +## 跳跃游戏 [LeetCode中文](https://leetcode-cn.com/problems/jump-game) @@ -538,3 +547,329 @@ public: ``` + +## 使数组唯一的最大增量 + +[LeetCode中文](https://leetcode-cn.com/problems/minimum-increment-to-make-array-unique/) + +[LeetCode英文](https://leetcode.com/problems/minimum-increment-to-make-array-unique/) + +给定整数数组 `A`,每次 move 操作将会选择任意 `A[i]`,并将其递增 1。 + +返回使 `A` 中的每个值都是唯一的最少操作次数。 + +**示例 1**: + +``` +输入:[1,2,2] +输出:1 +解释:经过一次 move 操作,数组将变为 [1, 2, 3]。 +``` + +**示例 2**: +``` +输入:[3,2,1,2,1,7] +输出:6 +解释:经过 6 次 move 操作,数组将变为 [3, 4, 1, 2, 5, 7]。 +可以看出 5 次或 5 次以下的 move 操作是不能让数组的每个值唯一的。 +``` + +**提示**: + +1. 0 <= A.length <= 40000 +2. 0 <= A[i] < 40000 + +### 解答 + +贪心法 + +```python +class Solution: + def minIncrementForUnique(self, A: List[int]) -> int: + if len(A) == 0: + return 0 + A.sort() + move = 0 + for i in range(1, len(A)): + if A[i] <= A[i - 1]: + add = A[i - 1] - A[i] + 1 + move += add + A[i] += add + return move +``` + + + +## 分发糖果 + +[LeetCode中文](https://leetcode-cn.com/problems/candy/) + +[LeetCode英文](https://leetcode.com/problems/candy/) + +### 解答 + +**C++代码** + +```python +class Solution { +public: + int candy(vector& ratings) { + vector nums(ratings.size(),1); + for(int i = 1;i < ratings.size();i++) + { + if(ratings[i] > ratings[i-1]) + nums[i] = nums[i-1] + 1; + } + + for(int i = ratings.size() - 1;i >= 1;i--) + { + if(ratings[i-1] > ratings[i]) + nums[i-1] = max(nums[i-1],nums[i] + 1); + } + + return accumulate(nums.begin(),nums.end(),0); + } +}; +``` + + + +## 根据身高重建队列 + +[LeetCode中文](https://leetcode-cn.com/problems/queue-reconstruction-by-height/) + +[LeetCode英文](https://leetcode.com/problems/queue-reconstruction-by-height/) + + + +### 解答 + +**C++代码** + +```c++ +class Solution { +public: + vector> reconstructQueue(vector>& people) { + if(people.size() <= 0) return {}; + sort(people.begin(),people.end(),[](const vector& vec1,const vector& vec2) + { + return (vec1[0] > vec2[0]) || (vec1[0] == vec2[0] && vec1[1] < vec2[1]); + }); + vector> res; + for(auto& vec : people) + { + res.insert(res.begin() + vec[1],vec); + } + + return res; + } +}; +``` + + + +## 救生艇 + +[LeetCode中文](https://leetcode-cn.com/problems/boats-to-save-people/) + +[LeetCode英文](https://leetcode.com/problems/boats-to-save-people/) + + + +### 解答 + +**Python代码** + +```python +class Solution: + def numRescueBoats(self, people: List[int], limit: int) -> int: + # 降序排序 + people.sort(reverse=True) + max_x = max(people) + if max_x > limit: + raise Exception('存在船员的体重大于limit数值,不可能装载所有人') + out = 0 + left, right = 0, len(people) - 1 + tmp = 0 + while left < right: + tmp = people[left] + people[right] + if tmp > limit: + left += 1 + else: + left += 1 + right -= 1 + out += 1 + if left == right: + out += 1 + return out +``` + + + +## 用最少数量的箭引爆气球 + +[LeetCode中文](https://leetcode-cn.com/problems/minimum-number-of-arrows-to-burst-balloons/) + +[LeetCode英文](https://leetcode.com/problems/minimum-number-of-arrows-to-burst-balloons/) + +### 解答 + +**C++代码** + +```c++ +class Solution { +public: + int findMinArrowShots(vector>& points) { + int n = points.size(); + if(n <= 1) return n; + + sort(points.begin(),points.end(),[](const vector& v1,const vector& v2) + {return v1[0] < v2[0] || (v1[0] == v2[0] && v1[1] < v2[1]);}); + auto pre = points[0]; + int res = 1; + for(int i = 1;i < n;i++) + { + int start = points[i][0]; + int end = points[i][1]; + if(start > pre[1]) + { + res++; + pre = points[i]; + } + else{ + if(end <= pre[1]) + { + pre = points[i]; + } + } + } + + return res; + } +}; +``` + + + +## 移掉K位数字 + +[LeetCode中文](https://leetcode-cn.com/problems/remove-k-digits/) + +[LeetCode英文](https://leetcode.com/problems/remove-k-digits/) + + + +### 解答 + +**C++代码** + +```c++ +class Solution { +public: + string removeKdigits(string num, int k) { + int n = num.size(); + int sz = n - k; + string res; + for(auto ch : num) + { + while(!res.empty() && ch < res.back() && k > 0) + { + res.pop_back(); + k--; + } + + res.push_back(ch); + } + + res.resize(sz); + while(res.size() > 0 && res[0] == '0') res.erase(res.begin()); + + return res.empty() ? "0" : res; + } +}; +``` + + + +## 无重叠区间 + +[LeetCode中文](https://leetcode-cn.com/problems/non-overlapping-intervals/) + +[LeetCode英文](https://leetcode.com/problems/non-overlapping-intervals/) + +### 解答 + +**C++代码** + +```c++ +class Solution { +public: + int eraseOverlapIntervals(vector>& intervals) { + int len = intervals.size(); + if(len <= 1) return 0; + sort(intervals.begin(),intervals.end(), + [](const vector& v1,const vector& v2) + {return v1[0] < v2[0] || (v1[0] == v2[0] && v1[1] < v2[1]);}); + int cnt = 0; + auto pre = intervals[0]; + for(int i = 1;i < len;i++) + { + int start = intervals[i][0]; + int end = intervals[i][1]; + if(start < pre[1]) + { + if(end <= pre[1]) + { + cnt++; + pre = intervals[i]; + } + else + { + cnt++; + } + } + else{ + pre = intervals[i]; + } + } + + return cnt; + } +}; +``` + + + +## 加油站 + +[LeetCode中文](https://leetcode-cn.com/problems/gas-station/) + +[LeetCode英文](https://leetcode.com/problems/gas-station/) + + + +### 解答 + +**C++代码** + +```c++ +class Solution { +public: + int canCompleteCircuit(vector& gas, vector& cost) { + int cur = 0,total = 0,start = 0; + for(int i = 0;i < gas.size();i++) + { + total += gas[i] - cost[i]; + cur += gas[i] - cost[i]; + if(cur < 0) + { + start = i + 1; + cur = 0; + } + } + + return total >= 0 ? start : -1; + } +}; +``` + From d0cdf0bc6e2ec8b7606b0ce0040c33f3f46c1abf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Wed, 1 Jun 2022 10:09:12 +0800 Subject: [PATCH 049/163] =?UTF-8?q?Update=20=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 --- "LeetCode/\344\272\214\345\217\211\346\240\221.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/LeetCode/\344\272\214\345\217\211\346\240\221.md" "b/LeetCode/\344\272\214\345\217\211\346\240\221.md" index 80820cd..767562d 100644 --- "a/LeetCode/\344\272\214\345\217\211\346\240\221.md" +++ "b/LeetCode/\344\272\214\345\217\211\346\240\221.md" @@ -27,7 +27,7 @@ * [二叉树的后序遍历](#二叉树的后序遍历)(`hard`) * **其他** * [对称二叉树](#对称二叉树) (`easy`) - * [二叉树的序列化与反序列化](#二叉树的序列化与反序列化) (`hard`) + * [二叉树的序列化与反序列化](#二叉树的序列化与反序列化) (`easy`) From fa76f0f3fc11772a84ae29d27580a64bc8a78987 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Wed, 1 Jun 2022 10:16:44 +0800 Subject: [PATCH 050/163] =?UTF-8?q?Update=20=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 --- "LeetCode/\344\272\214\345\217\211\346\240\221.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/LeetCode/\344\272\214\345\217\211\346\240\221.md" "b/LeetCode/\344\272\214\345\217\211\346\240\221.md" index 767562d..1a11358 100644 --- "a/LeetCode/\344\272\214\345\217\211\346\240\221.md" +++ "b/LeetCode/\344\272\214\345\217\211\346\240\221.md" @@ -24,10 +24,10 @@ * [平衡二叉树](#平衡二叉树) (`easy`) * [具有所有最深结点的最小子树](#具有所有最深结点的最小子树) (`medium`) * [二叉树中的最大路径和](#二叉树中的最大路径和) (`hard` `动态规划`) - * [二叉树的后序遍历](#二叉树的后序遍历)(`hard`) + * [二叉树的后序遍历](#二叉树的后序遍历)(`easy`) * **其他** * [对称二叉树](#对称二叉树) (`easy`) - * [二叉树的序列化与反序列化](#二叉树的序列化与反序列化) (`easy`) + * [二叉树的序列化与反序列化](#二叉树的序列化与反序列化) (`hard`) From dd5c622e26a183c08fc9653ab334449179dd9d8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Thu, 2 Jun 2022 15:48:56 +0800 Subject: [PATCH 051/163] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f6530ff..880cdab 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,7 @@ * [堆](https://github.com/xcg1995/Code/blob/master/LeetCode/堆.md) * [线段树](https://github.com/xcg1995/Code/blob/master/LeetCode/线段树.md) * [字典树](https://github.com/xcg1995/Code/blob/master/LeetCode/字典树.md) + * [单调栈](https://github.com/xcg1995/Code/blob/master/LeetCode/单调栈.md) * **算法** * [二分查找](https://github.com/xcg1995/Code/blob/master/LeetCode/二分查找.md) * [排序](https://github.com/xcg1995/Code/blob/master/LeetCode/排序.md) From b05abdc431e7d680075732e59fc81cb2138ee614 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Thu, 2 Jun 2022 15:49:29 +0800 Subject: [PATCH 052/163] =?UTF-8?q?Create=20=E5=8D=95=E8=B0=83=E6=A0=88.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\345\215\225\350\260\203\346\240\210.md" | 1 + 1 file changed, 1 insertion(+) create mode 100644 "LeetCode/\345\215\225\350\260\203\346\240\210.md" diff --git "a/LeetCode/\345\215\225\350\260\203\346\240\210.md" "b/LeetCode/\345\215\225\350\260\203\346\240\210.md" new file mode 100644 index 0000000..8b13789 --- /dev/null +++ "b/LeetCode/\345\215\225\350\260\203\346\240\210.md" @@ -0,0 +1 @@ + From aa8e8870950b9b14863a1332c2c1f99090ffcd6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Tue, 7 Jun 2022 11:00:01 +0800 Subject: [PATCH 053/163] =?UTF-8?q?Update=20=E4=BA=8C=E5=88=86=E6=9F=A5?= =?UTF-8?q?=E6=89=BE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\344\272\214\345\210\206\346\237\245\346\211\276.md" | 1 + 1 file changed, 1 insertion(+) diff --git "a/LeetCode/\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/LeetCode/\344\272\214\345\210\206\346\237\245\346\211\276.md" index 8ed14a1..56203ff 100644 --- "a/LeetCode/\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/LeetCode/\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -15,6 +15,7 @@ ## 博客总结 参考 [二分搜索法总结](#http://www.cnblogs.com/grandyang/p/6854825.html) +[二分查找边界问题总结](https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/solution/tu-jie-er-fen-zui-qing-xi-yi-dong-de-jia-ddvc/) ## x的平方根 From 608251b1b079b05464809492bb7923c29cf2d9ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Tue, 7 Jun 2022 11:01:07 +0800 Subject: [PATCH 054/163] =?UTF-8?q?Update=20=E4=BA=8C=E5=88=86=E6=9F=A5?= =?UTF-8?q?=E6=89=BE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\344\272\214\345\210\206\346\237\245\346\211\276.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/LeetCode/\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/LeetCode/\344\272\214\345\210\206\346\237\245\346\211\276.md" index 56203ff..5719940 100644 --- "a/LeetCode/\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/LeetCode/\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -14,7 +14,8 @@ ## 博客总结 -参考 [二分搜索法总结](#http://www.cnblogs.com/grandyang/p/6854825.html) +[二分搜索法总结](http://www.cnblogs.com/grandyang/p/6854825.html) + [二分查找边界问题总结](https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/solution/tu-jie-er-fen-zui-qing-xi-yi-dong-de-jia-ddvc/) ## x的平方根 From 29de10d1aba89164e31e2cbc202cdb1e7c0855da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Tue, 7 Jun 2022 11:38:22 +0800 Subject: [PATCH 055/163] =?UTF-8?q?Update=20=E4=BA=8C=E5=88=86=E6=9F=A5?= =?UTF-8?q?=E6=89=BE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...14\345\210\206\346\237\245\346\211\276.md" | 30 +++++++++---------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git "a/LeetCode/\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/LeetCode/\344\272\214\345\210\206\346\237\245\346\211\276.md" index 5719940..4dc3b0b 100644 --- "a/LeetCode/\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/LeetCode/\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -124,23 +124,21 @@ class Solution: class Solution { public: int findMin(vector& nums) { - int len = nums.size(); - if(len == 0) return -1; - int l = 0,r = len-1; - if(nums[l] < nums[r]) return nums[l]; - while(nums[l] > nums[r]) - { - if(r - l == 1) - { - return nums[r]; - } - - int m = l + (r - l)/2; - if(nums[m] > nums[r]) l = m; - else r = m; + if (nums.empty()) throw "nums is empty"; + int len = nums.size(); + if (nums[0] < nums[len - 1]) { + return nums.front(); + } + int l = 0, r = len - 1; + while (l < r) { + int m = (l + r) / 2; + if (nums[m] > nums[r]) { + l = m + 1; + } else { + r = m; } - - return nums[0]; + } + return nums[r]; } }; ``` From de2fb1948df8159c8310ec9a3bcdfa1ef5c5b63a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Tue, 7 Jun 2022 11:39:12 +0800 Subject: [PATCH 056/163] =?UTF-8?q?Update=20=E4=BA=8C=E5=88=86=E6=9F=A5?= =?UTF-8?q?=E6=89=BE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\344\272\214\345\210\206\346\237\245\346\211\276.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/LeetCode/\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/LeetCode/\344\272\214\345\210\206\346\237\245\346\211\276.md" index 4dc3b0b..94940a5 100644 --- "a/LeetCode/\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/LeetCode/\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -110,10 +110,10 @@ class Solution: 首先判断数组是否已经旋转,如果`nums[0] < num[len-1]`那么数组没有旋转,直接返回`nums[0]`;否则,数组旋转。 -二分查找:定义两个指针l和r分别指向数组两端,取`m = (r + l)/2`,找到中间那个数`nums[m]`和`nums[l]`和`nums[r]`比较: +二分查找:定义两个指针l和r分别指向数组两端,取`m = (r + l)/2`,找到中间那个数`nums[m]`和`nums[r]`比较: -1. 如果`nums[m] < nums[l]`,则在右半段搜索; -2. 如果`nums[m] > nums[l]`,则在左半段搜索; +1. 如果`nums[m] < nums[r]`,则在右半段搜索; +2. 如果`nums[m] > nums[r]`,则在左半段搜索; 直到l和r相邻,返回`nums[r]` From 9af0ed19cc04ace786bf6d31dbb31be494468036 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Tue, 7 Jun 2022 11:45:05 +0800 Subject: [PATCH 057/163] =?UTF-8?q?Update=20=E4=BA=8C=E5=88=86=E6=9F=A5?= =?UTF-8?q?=E6=89=BE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...14\345\210\206\346\237\245\346\211\276.md" | 50 +++++++------------ 1 file changed, 17 insertions(+), 33 deletions(-) diff --git "a/LeetCode/\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/LeetCode/\344\272\214\345\210\206\346\237\245\346\211\276.md" index 94940a5..36f2d60 100644 --- "a/LeetCode/\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/LeetCode/\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -180,7 +180,7 @@ public: ### 解答 -思路和 [寻找旋转排序数组中的最小值](#寻找旋转排序数组中的最小值) 一样,但是由于数组存在重复元素,会影响二分查找的效果,要特殊处理这种情况,当`nums[m] == num[l] && nums[m] == nums[r]`时,二分查找退化为遍历数组查找。 +思路和 [寻找旋转排序数组中的最小值](#寻找旋转排序数组中的最小值) 一样,但是由于数组存在重复元素,会影响二分查找的效果,要特殊处理这种情况,当`nums[m] == num[r]`时,r左移直到`nums[m] != nums[r]` - 时间复杂度:O(*log n*)~O(*n*) - 空间复杂度:O(1) @@ -188,40 +188,24 @@ public: ```c++ class Solution { public: - int normalSearch(vector& nums) - { - int len = nums.size(); - int res = nums[0]; - bool flag = false; - for(int i=1;i& nums) { - int len = nums.size(); - if(len == 0) return -1; - int l = 0,r = len-1; - if(nums[l] < nums[r]) return nums[l]; - while(l < r) - { - if(r - l == 1) return nums[r]; - - int m = l + (r - l)/2; - if(nums[m] == nums[l] && nums[m] == nums[r]) - { - return normalSearch(nums); - } - if(nums[m] > nums[r]) l = m; - else r = m; + if (nums.empty()) throw "nums is empty"; + int len = nums.size(); + if (nums[0] < nums[len - 1]) { + return nums.front(); + } + int l = 0, r = len - 1; + while (l < r) { + int m = (l + r) / 2; + if (nums[m] > nums[r]) { + l = m + 1; + } else if (nums[m] < nums[r]) { + r = m; + } else { + --r; } - - return nums[0]; + } + return nums[r]; } }; ``` From 83e583d00b204b18b5943aefba552aa03fa75993 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Tue, 7 Jun 2022 11:54:58 +0800 Subject: [PATCH 058/163] =?UTF-8?q?Update=20=E4=BA=8C=E5=88=86=E6=9F=A5?= =?UTF-8?q?=E6=89=BE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...14\345\210\206\346\237\245\346\211\276.md" | 87 +++++++++---------- 1 file changed, 41 insertions(+), 46 deletions(-) diff --git "a/LeetCode/\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/LeetCode/\344\272\214\345\210\206\346\237\245\346\211\276.md" index 36f2d60..86be27c 100644 --- "a/LeetCode/\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/LeetCode/\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -324,30 +324,28 @@ public: class Solution { public: int search(vector& nums, int target) { - int len = nums.size(); - int l = 0,r = len-1; - while(l <= r) - { - int m = (r + l)/2; - if(nums[m] == target) - return m; - else if(nums[m] > nums[r]) - { - if(target >= nums[l] && target < nums[m]) - r = m-1; - else - l = m+1; - } - else if(nums[m] <= nums[r]) - { - if(target > nums[m] && target <= nums[r]) - l = m+1; - else - r = m-1; - } + if (nums.empty()) return -1; + int l = 0, r = nums.size() - 1; + while (l < r) { + int m = (l + r) / 2; + if (target == nums[m]) { + return m; } - - return -1; + if (nums[m] > nums[r]) { + if (target >= nums[l] && target <= nums[m]) { + r = m; + } else { + l = m + 1; + } + } else { + if (target > nums[m] && target <= nums[r]) { + l = m + 1; + } else { + r = m; + } + } + } + return target == nums[r] ? r : -1; } }; ``` @@ -396,30 +394,27 @@ public: class Solution { public: bool search(vector& nums, int target) { - int len = nums.size(); - int l = 0,r = len-1; - while(l <= r) - { - int m = (r + l)/2; - if(nums[m] == target) return true; - else if(nums[m] > nums[r])//nums[m]位于左边有序段 - { - if(target >= nums[l] && target < nums[m]) - r = m-1; - else - l = m+1; - } - else if(nums[m] < nums[r])//nums[m]位于右边有序段 - { - if(target > nums[m] && target <= nums[r]) - l = m+1; - else - r = m-1; - } - else --r; + if (nums.empty()) return false; + int l = 0, r = nums.size() - 1; + while (l < r) { + int m = (l + r) / 2; + if (nums[m] > nums[r]) { + if (target >= nums[l] && target <= nums[m]) { + r = m; + } else { + l = m + 1; + } + } else if (nums[m] < nums[r]) { + if (target > nums[m] && target <= nums[r]) { + l = m + 1; + } else { + r = m; + } + } else { + --r; } - - return false; + } + return nums[r] == target; } }; ``` From 9a29f46890b0ce674d7673a7fdce826985b334a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Wed, 8 Jun 2022 15:15:01 +0800 Subject: [PATCH 059/163] =?UTF-8?q?Update=20=E9=93=BE=E8=A1=A8.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\351\223\276\350\241\250.md" | 84 +++++++++++--------------- 1 file changed, 35 insertions(+), 49 deletions(-) diff --git "a/LeetCode/\351\223\276\350\241\250.md" "b/LeetCode/\351\223\276\350\241\250.md" index f8ef0f5..6543591 100644 --- "a/LeetCode/\351\223\276\350\241\250.md" +++ "b/LeetCode/\351\223\276\350\241\250.md" @@ -1341,56 +1341,42 @@ public: > 参考**剑指Offer 第二版** 面试题22: 链表中倒数第k个节点 -* python代码 +* C++代码 -```python -# Definition for singly-linked list. -# class ListNode: -# def __init__(self, x): -# self.val = x -# self.next = None - -class Solution: - def removeNthFromEnd(self, head, n): - """ - :type head: ListNode - :type n: int - :rtype: ListNode - """ - if not head: - return None - - l = 0 - p = head - while p: - p = p.next - l += 1 - - if l < n: - return head - if l == 1: - return None - - """特殊情况:删除末尾元素""" - if n == 1: - p = head - while p.next.next: - p = p.next - #p.val = p.next.val - p.next = p.next.next - return head - - p1 = p2 = head - cnt = 1 - while p1.next and p2.next: - if cnt >= n: - p1 = p1.next - cnt += 1 - p2 = p2.next - - p1.val = p1.next.val - p1.next = p1.next.next - return head +```c++ +/** + * Definition for singly-linked list. + * struct ListNode { + * int val; + * ListNode *next; + * ListNode() : val(0), next(nullptr) {} + * ListNode(int x) : val(x), next(nullptr) {} + * ListNode(int x, ListNode *next) : val(x), next(next) {} + * }; + */ +class Solution { +public: + ListNode* removeNthFromEnd(ListNode* head, int n) { + if (!head) return head; + ListNode node(0), *pre = &node; + pre->next = head; + ListNode *slow = pre, *fast = pre; + for (int i = 1; i <= n; ++i) { + if (fast) { + fast = fast->next; + } else { + break; + } + } + if (!fast) return nullptr; + while (slow->next && fast->next) { + fast = fast->next; + slow = slow->next; + } + slow->next = slow->next->next; + return node.next; + } +}; ``` From 82cb310d75034ffefc346d62d948d85a77282544 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Wed, 8 Jun 2022 16:09:19 +0800 Subject: [PATCH 060/163] =?UTF-8?q?Update=20=E6=95=B0=E7=BB=84.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\346\225\260\347\273\204.md" | 56 +++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git "a/LeetCode/\346\225\260\347\273\204.md" "b/LeetCode/\346\225\260\347\273\204.md" index 8d30759..d46e2b6 100644 --- "a/LeetCode/\346\225\260\347\273\204.md" +++ "b/LeetCode/\346\225\260\347\273\204.md" @@ -21,6 +21,7 @@ * [存在重复元素](#存在重复元素) (`easy` `哈希`) * [两数之和](#两数之和) (`easy` `哈希`) * [求众数](#求众数) (`easy` `哈希`) + * [多数元素](#多数元素) (`medium` `摩尔投票`) * [有效的数独](#有效的数独) (`medium` `哈希`) * **其他** * [杨辉三角](#杨辉三角) (`easy` `迭代`) @@ -29,7 +30,7 @@ * [合并区间](#合并区间) (`medium` `排序`) * [下一个排列](#下一个排列) (`medium`) * [寻找重复数](#寻找重复数) (`medium` `交换`) - * [缺失的第一个正数](#缺失的第一个正数) (`hard` `交换`) + * [缺失的第一个正数](#缺失的第一个正数) (`hard` `交换`) # 数组类总结 @@ -2888,3 +2889,56 @@ class Solution: return out_list ``` +# 多数元素 + +[LeetCode中文](https://leetcode.cn/problems/majority-element-ii/) + +### 解答 + +摩尔投票法 +要求 > N / k为众数,则这样的数最多有k - 1个 因此维护两个候选变量cand1和cand2 两个阶段,抵消 + 计数 cand1和cand2的初始值任意,这里设为0 只要发现有计数为0,则马上更新新的cand 每考察到一个数,只有以下5种情况 + +是cand1,则计数器++ +是cand2,则计数器++ +都不是,且两个计数器都 > 0,则两个计数器-- +都不是,且count1是0,则让新的数成为cand1,且count1++ +都不是,且count2是0,则让新的数成为cand2,且count2++ +易错点 +本质上是三个一比 +当且仅当碰到的数既不是cand1也不是cand2,且两个计数器都 > 0时,计数器才会--,其他情况一律不减 +cand1和cand2可能一样,所以在计数阶段每个数只能算到一个候选人头上,即必须用if else语句 + + +```c++ +class Solution { +public: + vector majorityElement(vector& nums) { + vector res{}; + int res1, res2, cnt1, cnt2; + res1 = res2 = cnt1 = cnt2 = 0; + for (const auto& a : nums) { + if (a == res1) ++cnt1; + else if (a == res2) ++cnt2; + else if (cnt1 > 0 && cnt2 > 0) { + --cnt1; + --cnt2; + } else if (cnt1 == 0) { + res1 = a; + ++cnt1; + } else { + res2 = a; + ++cnt2; + } + } + cnt1 = 0, cnt2 = 0; + for (const auto& a : nums) { + if (a == res1) ++cnt1; + else if (a == res2) ++cnt2; + } + if (cnt1 > nums.size() / 3) res.push_back(res1); + if (cnt2 > nums.size() / 3) res.push_back(res2); + return res; + } +}; +``` + From 89399dcab29f50611437ce736359b5b95fe83ea2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Wed, 8 Jun 2022 20:47:39 +0800 Subject: [PATCH 061/163] =?UTF-8?q?Update=20=E5=8A=A8=E6=80=81=E8=A7=84?= =?UTF-8?q?=E5=88=92.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" index 801775e..2cedf06 100644 --- "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" +++ "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" @@ -17,7 +17,7 @@ * [最大回文子串](#最大回文子串) (`medium`) * [无重复字符的最长子串](#无重复字符的最长子串) (`medium` `hash` `滑动窗口`) * [戳气球](#戳气球) (`hard`) -* [最长等差数列](#最长等差数列) (`medium`) + * [最长等差数列](#最长等差数列) (`medium`) * [最长递增子序列的个数](#最长递增子序列的个数) (`medium`) From 72a81ccf84abd9d71654d7728fe75fc692cba32c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Thu, 9 Jun 2022 11:40:17 +0800 Subject: [PATCH 062/163] =?UTF-8?q?Update=20=E5=8A=A8=E6=80=81=E8=A7=84?= =?UTF-8?q?=E5=88=92.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...12\250\346\200\201\350\247\204\345\210\222.md" | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" index 2cedf06..203bfd8 100644 --- "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" +++ "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" @@ -19,6 +19,7 @@ * [戳气球](#戳气球) (`hard`) * [最长等差数列](#最长等差数列) (`medium`) * [最长递增子序列的个数](#最长递增子序列的个数) (`medium`) + * [接雨水](#接雨水) (`hard`) # 动态规划总结 @@ -1980,3 +1981,17 @@ class Solution: return sum(x for i, x in enumerate(dp_num) if dp_len[i] == max_len) ``` + +## 接雨水 + +[LeetCode中文](https://leetcode.cn/problems/trapping-rain-water) + + +### 解答 + +[题解](https://leetcode.cn/problems/trapping-rain-water/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by-w-8/) + +```c++ + +``` + From ac793107fb3518fe5c71178f160f641d8c620b04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Thu, 9 Jun 2022 12:04:50 +0800 Subject: [PATCH 063/163] =?UTF-8?q?Update=20=E5=8A=A8=E6=80=81=E8=A7=84?= =?UTF-8?q?=E5=88=92.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...50\346\200\201\350\247\204\345\210\222.md" | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" index 203bfd8..4b9abcf 100644 --- "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" +++ "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" @@ -1992,6 +1992,25 @@ class Solution: [题解](https://leetcode.cn/problems/trapping-rain-water/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by-w-8/) ```c++ - +class Solution { +public: + int trap(vector& height) { + if (height.size() < 3) return 0; + int len = height.size(); + vector left_max(len),right_max(len); + for (int i = 1; i < len; ++i) { + left_max[i] = max(height[i - 1], left_max[i - 1]); + } + for (int j = len -2; j >= 0; --j) { + right_max[j] = max(right_max[j + 1], height[j + 1]); + } + int res = 0; + for (int i = 1; i < height.size() - 1; ++i) { + int a = min(left_max[i], right_max[i]); + if (a > height[i]) res += a - height[i]; + } + return res; + } +}; ``` From cb4fe218966de8e2b501c00e2fa24c2e502d3844 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Wed, 15 Jun 2022 22:28:36 +0800 Subject: [PATCH 064/163] =?UTF-8?q?Update=20=E8=AE=BE=E8=AE=A1.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\350\256\276\350\256\241.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/LeetCode/\350\256\276\350\256\241.md" "b/LeetCode/\350\256\276\350\256\241.md" index 2a5880f..84d8fe9 100644 --- "a/LeetCode/\350\256\276\350\256\241.md" +++ "b/LeetCode/\350\256\276\350\256\241.md" @@ -1,6 +1,6 @@ * **设计类总结** * [常数时间插入、删除和获取随机元素](#常数时间插入删除和获取随机元素) (`medium` `哈希`) - * [LRU缓存机制](#LRU缓存机制) (`hard` `系统设计` `哈希`) + * [LRU缓存机制](#LRU缓存机制) (`medium` `系统设计` `哈希`) # 设计类总结 From 0b2d3103d7319cc0f449d05e89f91cc50399c6bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Fri, 17 Jun 2022 17:51:47 +0800 Subject: [PATCH 065/163] =?UTF-8?q?Update=20=E6=8E=92=E5=BA=8F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\346\216\222\345\272\217.md" | 74 ++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git "a/LeetCode/\346\216\222\345\272\217.md" "b/LeetCode/\346\216\222\345\272\217.md" index d6aebd9..aea182c 100644 --- "a/LeetCode/\346\216\222\345\272\217.md" +++ "b/LeetCode/\346\216\222\345\272\217.md" @@ -286,6 +286,80 @@ public: }; ``` +3. 归并排序非递归 + +```c++ +/** + * Definition for singly-linked list. + * struct ListNode { + * int val; + * ListNode *next; + * ListNode() : val(0), next(nullptr) {} + * ListNode(int x) : val(x), next(nullptr) {} + * ListNode(int x, ListNode *next) : val(x), next(next) {} + * }; + */ + +class Solution { +public: + ListNode* mergeSort(ListNode* head) { + if (!head || !head->next) return head; + ListNode *slow = head, *fast = head; + int len = 0; + while (slow) { + slow = slow->next; + ++len; + } + slow = head; + ListNode node(0), *p = &node; + ListNode* tmp; + for (int step = 1; step <= len; step *= 2) { + slow = fast = head; + ListNode *s_end, *f_end; + p = &node; + while (slow && fast) { + fast = slow; + for (int j = 0; j < step && fast; ++j) { + fast = fast->next; + } + s_end = f_end = fast; + for (int j = 0; j < step && f_end; ++j) { + f_end = f_end->next; + } + while (slow != s_end && fast != f_end) { + if (slow->val < fast->val) { + p->next = slow; + p = p->next; + slow = slow->next; + } else { + p->next = fast; + p = p->next; + fast = fast->next; + } + } + while (slow != s_end) { + p->next = slow; + p = p->next; + slow = slow->next; + } + while (fast != f_end) { + p->next = fast; + p = p->next; + fast = fast->next; + } + p->next = f_end; + slow = f_end; + } + } + return node.next; + } + + ListNode* sortList(ListNode* head) { + return mergeSort(head); + } +}; +``` + ## 数组中的第K个最大元素 From 64203dbe45c8839c5449a681c8f2dff8ea8ecdf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Fri, 17 Jun 2022 17:53:27 +0800 Subject: [PATCH 066/163] =?UTF-8?q?Update=20=E6=8E=92=E5=BA=8F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\346\216\222\345\272\217.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/LeetCode/\346\216\222\345\272\217.md" "b/LeetCode/\346\216\222\345\272\217.md" index aea182c..3147732 100644 --- "a/LeetCode/\346\216\222\345\272\217.md" +++ "b/LeetCode/\346\216\222\345\272\217.md" @@ -286,7 +286,7 @@ public: }; ``` -3. 归并排序非递归 +#### 方法3 归并排序非递归 ```c++ /** From 2c72cf1e0329772874fc4f29017a3c66c133532a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Tue, 22 Aug 2023 21:37:08 +0800 Subject: [PATCH 067/163] =?UTF-8?q?Update=20=E8=B4=AA=E5=BF=83.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\350\264\252\345\277\203.md" | 28 ++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git "a/LeetCode/\350\264\252\345\277\203.md" "b/LeetCode/\350\264\252\345\277\203.md" index dcd6176..3086482 100644 --- "a/LeetCode/\350\264\252\345\277\203.md" +++ "b/LeetCode/\350\264\252\345\277\203.md" @@ -14,10 +14,38 @@ * [移掉K位数字](#移掉K位数字) (`medium`) * [无重叠区间](#无重叠区间) (`medium`) * [加油站](#加油站) (`medium`) + * [判断一个括号字符串是否有效](#判断一个括号字符串是否有效) (`medium`) # 贪心总结 +## 判断一个括号字符串是否有效 + +[LeetCode中文](https://leetcode.cn/problems/check-if-a-parentheses-string-can-be-valid/description/) + +```c++ +class Solution { +public: + bool canBeValid(string s, string locked) { + int n=s.size(),l=0,r=0; + if(n%2==1) return false; + for(int i=0;i=0;i--){ + if(locked[i]=='1'&&s[i]=='('){ + l++; + if(n-i-l Date: Tue, 22 Aug 2023 21:38:12 +0800 Subject: [PATCH 068/163] =?UTF-8?q?Update=20=E8=B4=AA=E5=BF=83.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\350\264\252\345\277\203.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/LeetCode/\350\264\252\345\277\203.md" "b/LeetCode/\350\264\252\345\277\203.md" index 3086482..2f9489c 100644 --- "a/LeetCode/\350\264\252\345\277\203.md" +++ "b/LeetCode/\350\264\252\345\277\203.md" @@ -23,6 +23,8 @@ [LeetCode中文](https://leetcode.cn/problems/check-if-a-parentheses-string-can-be-valid/description/) +题解: https://leetcode.cn/problems/check-if-a-parentheses-string-can-be-valid/solutions/1176807/qian-hou-ge-bian-li-yi-ci-fen-bie-pan-du-w5nu/ + ```c++ class Solution { public: From 7ad5ebe2620be01e9752afe1b398813813d97d33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Tue, 22 Aug 2023 21:38:49 +0800 Subject: [PATCH 069/163] =?UTF-8?q?Update=20=E8=B4=AA=E5=BF=83.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\350\264\252\345\277\203.md" | 27 +++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git "a/LeetCode/\350\264\252\345\277\203.md" "b/LeetCode/\350\264\252\345\277\203.md" index 2f9489c..ec2049c 100644 --- "a/LeetCode/\350\264\252\345\277\203.md" +++ "b/LeetCode/\350\264\252\345\277\203.md" @@ -29,21 +29,22 @@ class Solution { public: bool canBeValid(string s, string locked) { - int n=s.size(),l=0,r=0; - if(n%2==1) return false; - for(int i=0;i=0;i--){ - if(locked[i]=='1'&&s[i]=='('){ - l++; - if(n-i-l= 0; --i) { + if (s[i] == '(' && locked[i] == '1') { + ++l; + if (n - i < 2 * l) return false; } - return true; + } + return true; } }; ``` From 776ca802c0eee82990a1dc625b6864a7e1fe06bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Tue, 22 Aug 2023 22:30:57 +0800 Subject: [PATCH 070/163] =?UTF-8?q?Update=20=E6=A0=88=E5=92=8C=E9=98=9F?= =?UTF-8?q?=E5=88=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...10\345\222\214\351\230\237\345\210\227.md" | 44 ++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git "a/LeetCode/\346\240\210\345\222\214\351\230\237\345\210\227.md" "b/LeetCode/\346\240\210\345\222\214\351\230\237\345\210\227.md" index 4978619..4de3f3f 100644 --- "a/LeetCode/\346\240\210\345\222\214\351\230\237\345\210\227.md" +++ "b/LeetCode/\346\240\210\345\222\214\351\230\237\345\210\227.md" @@ -99,6 +99,48 @@ private: */ ``` +**优化**:只使用一个栈 + +思路:[解答](https://leetcode.cn/problems/min-stack/solutions/42521/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by-38/) 中的解答二 + +```c++ +class MinStack { +public: + MinStack() { + min_element = INT_MAX; + } + + void push(int val) { + if (val <= min_element) { + sta.push(min_element); + min_element = val; + } + sta.push(val); + } + + void pop() { + if (sta.top() == min_element) { + sta.pop(); + min_element = sta.top(); + } + sta.pop(); + } + + int top() { + return sta.top(); + } + + int getMin() { + return min_element; + } + +private: + stack sta; + int min_element; +}; + +``` + ## 有效的括号 @@ -772,4 +814,4 @@ public: return res; } }; -``` \ No newline at end of file +``` From 4775093783086e1ef68cbe8273e77a7896559104 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Wed, 23 Aug 2023 17:42:29 +0800 Subject: [PATCH 071/163] =?UTF-8?q?Update=20=E9=93=BE=E8=A1=A8.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\351\223\276\350\241\250.md" | 46 +++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git "a/LeetCode/\351\223\276\350\241\250.md" "b/LeetCode/\351\223\276\350\241\250.md" index 6543591..377ae3d 100644 --- "a/LeetCode/\351\223\276\350\241\250.md" +++ "b/LeetCode/\351\223\276\350\241\250.md" @@ -1391,7 +1391,7 @@ public: 要求返回这个链表的深度拷贝。 -### 解答 +### 解法1 > 参考**剑指Offer 第二版** 面试题35:复杂链表的复制 @@ -1459,3 +1459,47 @@ public: } }; ``` +### 解法2 + +哈希表 + +```c++ +/* +// Definition for a Node. +class Node { +public: + int val; + Node* next; + Node* random; + + Node(int _val) { + val = _val; + next = NULL; + random = NULL; + } +}; +*/ + +class Solution { +public: + Node* copyRandomList(Node* head) { + unordered_map mp; + Node* cur = head; + Node node(0); + Node* dummy = &node; + while (cur) { + Node* tmp = new Node(cur->val); + dummy->next = tmp; + dummy = dummy->next; + mp.insert({cur, tmp}); + cur = cur->next; + } + cur = head; + while (cur) { + mp[cur]->random = mp[cur->random]; + cur = cur->next; + } + return node.next; + } +}; +``` From e32b9b04d8f2dda1ec13fd47db9c73fa27795a62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Wed, 23 Aug 2023 17:59:05 +0800 Subject: [PATCH 072/163] =?UTF-8?q?Update=20=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 --- .../\345\255\227\347\254\246\344\270\262.md" | 39 ++++++++++++++++++- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git "a/LeetCode/\345\255\227\347\254\246\344\270\262.md" "b/LeetCode/\345\255\227\347\254\246\344\270\262.md" index c39b727..65cdcf5 100644 --- "a/LeetCode/\345\255\227\347\254\246\344\270\262.md" +++ "b/LeetCode/\345\255\227\347\254\246\344\270\262.md" @@ -911,7 +911,7 @@ public: * 所有输入均为小写字母。 * 不考虑答案输出的顺序。 -### 解答 +### 解法1 利用hash表,具体思路: @@ -921,7 +921,7 @@ public: 设`strs`中字符串元素的平均长度`k`,`strs`的长度`n`,那么 -* 时间复杂度:O(*n log k*) +* 时间复杂度:O(*n klog k*) * 空间复杂度:O(*nk*) ```c++ @@ -952,6 +952,41 @@ public: }; ``` +### 解法2 + +因为字母都是小写字母,可以利用计数来排序 + +时间复杂度:O(nk) + +```c++ +class Solution { +public: + vector> groupAnagrams(vector& strs) { + unordered_map> mp; + for (string s : strs) { + mp[strSort(s)].push_back(s); + } + vector> anagrams; + for (auto p : mp) { + anagrams.push_back(p.second); + } + return anagrams; + } +private: + string strSort(string s) { + int counter[26] = {0}; + for (char c : s) { + counter[c - 'a']++; + } + string t; + for (int c = 0; c < 26; c++) { + t += string(counter[c], c + 'a'); + } + return t; + } +}; +``` + ## 字符串相乘 From 76476fdd6fa420cf3f77fa2a59a76003c65df9fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Mon, 28 Aug 2023 23:01:14 +0800 Subject: [PATCH 073/163] =?UTF-8?q?Update=20=E5=8A=A8=E6=80=81=E8=A7=84?= =?UTF-8?q?=E5=88=92.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...50\346\200\201\350\247\204\345\210\222.md" | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" index 4b9abcf..e016052 100644 --- "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" +++ "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" @@ -20,9 +20,59 @@ * [最长等差数列](#最长等差数列) (`medium`) * [最长递增子序列的个数](#最长递增子序列的个数) (`medium`) * [接雨水](#接雨水) (`hard`) + * [打家劫舍III](#打家劫舍III) # 动态规划总结 +## 打家劫舍III +[LeetCode中文](https://leetcode.cn/problems/house-robber-iii/description/) + +解法:树形动态规划 + 记忆化搜索 + +题解: https://leetcode.cn/problems/house-robber-iii/solutions/361038/da-jia-jie-she-iii-by-leetcode-solution/ + +```c++ +/** + * Definition for a binary tree node. + * struct TreeNode { + * int val; + * TreeNode *left; + * TreeNode *right; + * TreeNode() : val(0), left(nullptr), right(nullptr) {} + * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} + * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} + * }; + */ +class Solution { +public: + int rob(TreeNode* root) { + return max(pickRecursive(root), unpickRecursive(root)); + } + int pickRecursive(TreeNode* root) { + if (!root) return 0; + if (pick_mp.find(root) != pick_mp.end()) { + return pick_mp[root]; + } + int res = root->val + unpickRecursive(root->left) + unpickRecursive(root->right); + pick_mp[root] = res; + return res; + } + int unpickRecursive(TreeNode* root) { + if (!root) return 0; + if (unpicked_mp.find(root) != unpicked_mp.end()) { + return unpicked_mp[root]; + } + int res = max(pickRecursive(root->left), unpickRecursive(root->left)) + max(pickRecursive(root->right), unpickRecursive(root->right)); + unpicked_mp[root] = res; + return res; + } + +private: + unordered_map pick_mp; + unordered_map unpicked_mp; +}; +``` + ## 爬楼梯 [LeetCode中文](https://leetcode-cn.com/problems/climbing-stairs) From 543cd3f1114ffec5a9e0874abeb04cea8456fe03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Mon, 28 Aug 2023 23:03:59 +0800 Subject: [PATCH 074/163] =?UTF-8?q?Update=20=E5=9B=9E=E6=BA=AF.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\345\233\236\346\272\257.md" | 43 ++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git "a/LeetCode/\345\233\236\346\272\257.md" "b/LeetCode/\345\233\236\346\272\257.md" index fd91967..10f71c4 100644 --- "a/LeetCode/\345\233\236\346\272\257.md" +++ "b/LeetCode/\345\233\236\346\272\257.md" @@ -8,11 +8,54 @@ * [累加数](#累加数) (`medium`) * [将数组拆分成斐波那契序列](#将数组拆分成斐波那契序列) (`medium` `贪心`) * [解数独](#解数独) (`hard` `哈希`) + * [路径总和III](#路径总和III) (`medium` `回溯` `哈希`) # 回溯法总结 +## 路径总和 + +[LeetCode中文](https://leetcode.cn/problems/path-sum-iii/description/) + +解答:https://leetcode.cn/problems/path-sum-iii/solutions/596361/dui-qian-zhui-he-jie-fa-de-yi-dian-jie-s-dey6/ + +```c++ +/** + * Definition for a binary tree node. + * struct TreeNode { + * int val; + * TreeNode *left; + * TreeNode *right; + * TreeNode() : val(0), left(nullptr), right(nullptr) {} + * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} + * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} + * }; + */ +class Solution { +public: + int pathSum(TreeNode* root, int targetSum) { + unordered_map mp; // key: 前缀和 value: 前缀和等于key的节点数量 + long prefix_sum = 0; + return pathSumImpl(root, targetSum, mp, prefix_sum); + } + int pathSumImpl(TreeNode* root, int target, unordered_map& mp, long prefix_sum) { + if (root == nullptr) return 0; + int res = 0; + prefix_sum += root->val; + if (prefix_sum == target) res += 1; + if (mp.find(prefix_sum - target) != mp.end()) { + res += mp[prefix_sum - target]; + } + mp[prefix_sum]++; + res += pathSumImpl(root->left, target, mp, prefix_sum); + res += pathSumImpl(root->right, target, mp, prefix_sum); + mp[prefix_sum]--; + return res; + } +}; +``` + ## 子集 [LeetCode中文](https://leetcode-cn.com/problems/subsets/) From 5cc2d2d82eb7905c68fa3fc3501f17d080e563fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Mon, 28 Aug 2023 23:04:20 +0800 Subject: [PATCH 075/163] =?UTF-8?q?Update=20=E5=9B=9E=E6=BA=AF.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\345\233\236\346\272\257.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/LeetCode/\345\233\236\346\272\257.md" "b/LeetCode/\345\233\236\346\272\257.md" index 10f71c4..dcb423d 100644 --- "a/LeetCode/\345\233\236\346\272\257.md" +++ "b/LeetCode/\345\233\236\346\272\257.md" @@ -14,7 +14,7 @@ # 回溯法总结 -## 路径总和 +## 路径总和III [LeetCode中文](https://leetcode.cn/problems/path-sum-iii/description/) From b812f71e844407c841249a381e8c1122d16874ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Mon, 28 Aug 2023 23:04:48 +0800 Subject: [PATCH 076/163] =?UTF-8?q?Update=20=E5=9B=9E=E6=BA=AF.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\345\233\236\346\272\257.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/LeetCode/\345\233\236\346\272\257.md" "b/LeetCode/\345\233\236\346\272\257.md" index dcb423d..7296491 100644 --- "a/LeetCode/\345\233\236\346\272\257.md" +++ "b/LeetCode/\345\233\236\346\272\257.md" @@ -18,7 +18,8 @@ [LeetCode中文](https://leetcode.cn/problems/path-sum-iii/description/) -解答:https://leetcode.cn/problems/path-sum-iii/solutions/596361/dui-qian-zhui-he-jie-fa-de-yi-dian-jie-s-dey6/ +解答:记忆化搜索 + 回溯 +https://leetcode.cn/problems/path-sum-iii/solutions/596361/dui-qian-zhui-he-jie-fa-de-yi-dian-jie-s-dey6/ ```c++ /** From b7cb06bc5d22eee334a634e94c204af1e9a52f95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Mon, 28 Aug 2023 23:05:33 +0800 Subject: [PATCH 077/163] =?UTF-8?q?Update=20=E5=8A=A8=E6=80=81=E8=A7=84?= =?UTF-8?q?=E5=88=92.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" index e016052..9f72820 100644 --- "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" +++ "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" @@ -20,7 +20,7 @@ * [最长等差数列](#最长等差数列) (`medium`) * [最长递增子序列的个数](#最长递增子序列的个数) (`medium`) * [接雨水](#接雨水) (`hard`) - * [打家劫舍III](#打家劫舍III) + * [打家劫舍III](#打家劫舍III) (`medium` `树形动态规划`) # 动态规划总结 From 421ffab03eac0189efbb69da985c2d26ee7e8f32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Mon, 28 Aug 2023 23:09:57 +0800 Subject: [PATCH 078/163] =?UTF-8?q?Update=20=E5=8A=A8=E6=80=81=E8=A7=84?= =?UTF-8?q?=E5=88=92.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" index 9f72820..f7f5960 100644 --- "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" +++ "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" @@ -31,6 +31,8 @@ 题解: https://leetcode.cn/problems/house-robber-iii/solutions/361038/da-jia-jie-she-iii-by-leetcode-solution/ +打家劫舍系列扩展:https://leetcode.cn/problems/house-robber-iii/solutions/67467/tong-yong-si-lu-tuan-mie-da-jia-jie-she-wen-ti-b-2/ + ```c++ /** * Definition for a binary tree node. From f8bc0cb8c8ea695b20e58ee91adabdbb9cdbee9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Thu, 31 Aug 2023 23:48:52 +0800 Subject: [PATCH 079/163] =?UTF-8?q?Update=20=E5=8A=A8=E6=80=81=E8=A7=84?= =?UTF-8?q?=E5=88=92.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...50\346\200\201\350\247\204\345\210\222.md" | 77 ++++++++++++++++++- 1 file changed, 75 insertions(+), 2 deletions(-) diff --git "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" index f7f5960..869ad40 100644 --- "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" +++ "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" @@ -13,7 +13,7 @@ * [递增的三元子序列](#递增的三元子序列) (`medium` `贪心`) * [最大正方形](#最大正方形) (`medium`) * [摆动序列](#摆动序列) (`medium` `贪心`) - * [零钱兑换](#零钱兑换) (`medium` `背包问题`) + * [零钱兑换](#零钱兑换) (`medium` `完全背包`) * [最大回文子串](#最大回文子串) (`medium`) * [无重复字符的最长子串](#无重复字符的最长子串) (`medium` `hash` `滑动窗口`) * [戳气球](#戳气球) (`hard`) @@ -21,9 +21,82 @@ * [最长递增子序列的个数](#最长递增子序列的个数) (`medium`) * [接雨水](#接雨水) (`hard`) * [打家劫舍III](#打家劫舍III) (`medium` `树形动态规划`) + * [分割等和子集](#分割等和子集) (`medium` `01背包`) - # 动态规划总结 +## 分割等和子集 + +[LeetCode中文](https://leetcode.cn/problems/partition-equal-subset-sum/description/) + +解法:01背包问题 +题意等价于从数组中找出一些数字的和等于数组中所有数字之和的一半,设为target +设dp[i][j]是从[0, i]中选数字之和是否能组成j(bool类型),状态转移方程: + +dp[i][j] = dp[i - 1][j] || dp[i - 1][j - nums[i]] (nums[i) < j) +dp[i][j] = true (nums[i] == j) +dp[i][j] = dp[i - 1][j] (nums[i) > j) + +初始条件: +dp[i][0] = true (i = 0 ~ nums.size() - 1) +dp[nums[0]][0] = true + +二维数组代码: +```c++ +class Solution { +public: + bool canPartition(vector& nums) { + if (nums.size() == 0) return true; + if (nums.size() == 1) return false; + int sum = accumulate(nums.begin(), nums.end(), 0); + if (sum % 2 == 1) return false; + int target = sum / 2; + int len = nums.size(); + vector> dp(len, vector(target + 1, false)); + for (int i = 0; i < len; ++i) { + dp[i][0] = true; + } + if (nums[0] < target) dp[0][nums[0]] = true; + for (int i = 1; i < len; ++i) { + for (int j = 1; j <= target; ++j) { + if (j == nums[i]) dp[i][j] = true; + else if (j > nums[i]) { + dp[i][j] = dp[i - 1][j] || dp[i - 1][j - nums[i]]; + } else { + dp[i][j] = dp[i - 1][j]; + } + } + } + return dp[len - 1][target]; + } +}; +``` + +时间和空间优化后,一维数组代码: + +```c++ +class Solution { +public: + bool canPartition(vector& nums) { + if (nums.size() == 0) return true; + if (nums.size() == 1) return false; + int sum = accumulate(nums.begin(), nums.end(), 0); + if (sum % 2 == 1) return false; + int target = sum / 2; + if (*max_element(nums.begin(), nums.end()) > target) return false; + int len = nums.size(); + vector dp(target + 1, false); + if (nums[0] < target) dp[nums[0]] = true; + dp[0] = true; + for (int i = 1; i < len; ++i) { + for (int j = target; j >= 0; --j) { + if (nums[i] <= j) dp[j] = dp[j] || dp[j - nums[i]]; + } + } + return dp[target]; + } +}; +``` + ## 打家劫舍III [LeetCode中文](https://leetcode.cn/problems/house-robber-iii/description/) From e99b8aef22d5e4209b89295f54f06a2fdf2337c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Thu, 31 Aug 2023 23:50:12 +0800 Subject: [PATCH 080/163] =?UTF-8?q?Update=20=E5=8A=A8=E6=80=81=E8=A7=84?= =?UTF-8?q?=E5=88=92.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" index 869ad40..7b6fe32 100644 --- "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" +++ "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" @@ -40,6 +40,8 @@ dp[i][j] = dp[i - 1][j] (nums[i) > j) dp[i][0] = true (i = 0 ~ nums.size() - 1) dp[nums[0]][0] = true +**扩展**:更多背包问题参考 [背包九讲](https://zhuanlan.zhihu.com/p/139368825) + 二维数组代码: ```c++ class Solution { From 5d00de441dcee13f580c3dd5660aae180f4f1236 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Thu, 31 Aug 2023 23:54:32 +0800 Subject: [PATCH 081/163] =?UTF-8?q?Update=20=E5=8A=A8=E6=80=81=E8=A7=84?= =?UTF-8?q?=E5=88=92.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" index 7b6fe32..9b03d96 100644 --- "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" +++ "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" @@ -1093,7 +1093,7 @@ public: ``` dp1[i] = max{dp2[j]+1 , 0 =< j <= i-1 且 nums[i] > nums[j]} -dp2[i] = max{dp1[j]+1 , 0 =< j <= i-1 且 nums[i] > nums[j]} +dp2[i] = max{dp1[j]+1 , 0 =< j <= i-1 且 nums[i] < nums[j]} ``` 遍历结束之后,整个数组的最长摆动子序列就是`max(dp1.back(),dp2.back())`。 From 60d4e75db532b7d451814532cb95b6b3076171d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Fri, 1 Sep 2023 20:07:58 +0800 Subject: [PATCH 082/163] =?UTF-8?q?Update=20=E6=95=B0=E7=BB=84.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\346\225\260\347\273\204.md" | 35 ++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git "a/LeetCode/\346\225\260\347\273\204.md" "b/LeetCode/\346\225\260\347\273\204.md" index d46e2b6..2fd8b66 100644 --- "a/LeetCode/\346\225\260\347\273\204.md" +++ "b/LeetCode/\346\225\260\347\273\204.md" @@ -31,10 +31,45 @@ * [下一个排列](#下一个排列) (`medium`) * [寻找重复数](#寻找重复数) (`medium` `交换`) * [缺失的第一个正数](#缺失的第一个正数) (`hard` `交换`) + * [数组中重复的数字](#数组中重复的数字) (`medium` `交换`) # 数组类总结 +## 数组中重复的数字 + +[LeetCode中文](https://leetcode.cn/problems/find-all-duplicates-in-an-array/description/) + +题解:遍历数组交换 + 标记重复的数字 + +https://leetcode.cn/problems/find-all-duplicates-in-an-array/solutions/1476879/by-ac_oier-0m3c/ + +```c++ +class Solution { +public: + vector findDuplicates(vector& nums) { + vector res; + int i = 0; + while (i < nums.size()) { + if (nums[i] == 0 || nums[i] == i + 1) { + ++i; + continue; + } + else if (nums[nums[i] - 1] == nums[i]) { + res.push_back(nums[i]); + nums[i] = 0; + ++i; + } else { + int tmp = nums[nums[i] - 1]; + nums[nums[i] - 1] = nums[i]; + nums[i] = tmp; + } + } + return res; + } +}; +``` + ## 两个数组的交集 [LeetCode中文](https://leetcode-cn.com/problems/intersection-of-two-arrays/) From 4041c157ea2e79880357d76feef14942902f60d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Wed, 13 Sep 2023 17:13:56 +0800 Subject: [PATCH 083/163] =?UTF-8?q?Update=20=E5=9B=BE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\345\233\276.md" | 46 ++++++++++++++++---------------------- 1 file changed, 19 insertions(+), 27 deletions(-) diff --git "a/LeetCode/\345\233\276.md" "b/LeetCode/\345\233\276.md" index f9d94c8..9710686 100644 --- "a/LeetCode/\345\233\276.md" +++ "b/LeetCode/\345\233\276.md" @@ -64,42 +64,34 @@ ```c++ class Solution { public: - bool canFinish(int numCourses, vector>& prerequisites) { - vector> graph(numCourses,vector()); - vector degree(numCourses,0); - for(auto a : prerequisites) - { - int from = a.second; - int to = a.first; + bool canFinish(int numCourses, vector>& prerequisites) { + vector> graph(numCourses, vector()); + vector degree(numCourses, 0); + for (const auto& vec : prerequisites) { + int from = vec[1]; + int to = vec[0]; graph[from].push_back(to); - degree[to]++; + ++degree[to]; } - queue que; - for(int i=0;i= numCourses) return true; } - - if(cnt == numCourses) return true; - return false; } }; From db7f05f00b62216008fa27d8f70324e7247bbe77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Thu, 21 Sep 2023 07:06:19 -0500 Subject: [PATCH 084/163] =?UTF-8?q?Update=20=E5=9B=9E=E6=BA=AF.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\345\233\236\346\272\257.md" | 38 ++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git "a/LeetCode/\345\233\236\346\272\257.md" "b/LeetCode/\345\233\236\346\272\257.md" index 7296491..18cefed 100644 --- "a/LeetCode/\345\233\236\346\272\257.md" +++ "b/LeetCode/\345\233\236\346\272\257.md" @@ -9,11 +9,49 @@ * [将数组拆分成斐波那契序列](#将数组拆分成斐波那契序列) (`medium` `贪心`) * [解数独](#解数独) (`hard` `哈希`) * [路径总和III](#路径总和III) (`medium` `回溯` `哈希`) + * [去除重复字母](#取出重复字母) (`贪心` `哈希`) # 回溯法总结 +## 去除重复字母 + +[LeetCode中文](https://leetcode.cn/problems/remove-duplicate-letters/description/) + +利用字母的相对大小比较来选择是否丢弃字母,贪心思路比较巧妙 + +https://leetcode.cn/problems/remove-duplicate-letters/solutions/290200/yi-zhao-chi-bian-li-kou-si-dao-ti-ma-ma-zai-ye-b-4/ + +```c++ +class Solution { +public: + string removeDuplicateLetters(string s) { + string res; + unordered_set st; + unordered_map mp; + for (const char& ch : s) { + ++mp[ch]; + } + for (const char ch : s) { + if (st.find(ch) != st.end()) { + --mp[ch]; + continue; + } + while (!res.empty() && res.back() > ch && mp[res.back()] > 1) { + char top = res.back(); + res.pop_back(); + --mp[top]; + st.erase(top); + } + res.push_back(ch); + st.insert(ch); + } + return res; + } +}; +``` + ## 路径总和III [LeetCode中文](https://leetcode.cn/problems/path-sum-iii/description/) From 445b15110bc6ad77c896e96f104b0406157b2c4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Thu, 21 Sep 2023 07:07:14 -0500 Subject: [PATCH 085/163] =?UTF-8?q?Update=20=E5=9B=9E=E6=BA=AF.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\345\233\236\346\272\257.md" | 38 -------------------------- 1 file changed, 38 deletions(-) diff --git "a/LeetCode/\345\233\236\346\272\257.md" "b/LeetCode/\345\233\236\346\272\257.md" index 18cefed..7296491 100644 --- "a/LeetCode/\345\233\236\346\272\257.md" +++ "b/LeetCode/\345\233\236\346\272\257.md" @@ -9,49 +9,11 @@ * [将数组拆分成斐波那契序列](#将数组拆分成斐波那契序列) (`medium` `贪心`) * [解数独](#解数独) (`hard` `哈希`) * [路径总和III](#路径总和III) (`medium` `回溯` `哈希`) - * [去除重复字母](#取出重复字母) (`贪心` `哈希`) # 回溯法总结 -## 去除重复字母 - -[LeetCode中文](https://leetcode.cn/problems/remove-duplicate-letters/description/) - -利用字母的相对大小比较来选择是否丢弃字母,贪心思路比较巧妙 - -https://leetcode.cn/problems/remove-duplicate-letters/solutions/290200/yi-zhao-chi-bian-li-kou-si-dao-ti-ma-ma-zai-ye-b-4/ - -```c++ -class Solution { -public: - string removeDuplicateLetters(string s) { - string res; - unordered_set st; - unordered_map mp; - for (const char& ch : s) { - ++mp[ch]; - } - for (const char ch : s) { - if (st.find(ch) != st.end()) { - --mp[ch]; - continue; - } - while (!res.empty() && res.back() > ch && mp[res.back()] > 1) { - char top = res.back(); - res.pop_back(); - --mp[top]; - st.erase(top); - } - res.push_back(ch); - st.insert(ch); - } - return res; - } -}; -``` - ## 路径总和III [LeetCode中文](https://leetcode.cn/problems/path-sum-iii/description/) From cf26150ddba0bd7b13e690ee1acf7510778282f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Thu, 21 Sep 2023 07:08:14 -0500 Subject: [PATCH 086/163] =?UTF-8?q?Update=20=E8=B4=AA=E5=BF=83.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\350\264\252\345\277\203.md" | 40 +++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git "a/LeetCode/\350\264\252\345\277\203.md" "b/LeetCode/\350\264\252\345\277\203.md" index ec2049c..3685f94 100644 --- "a/LeetCode/\350\264\252\345\277\203.md" +++ "b/LeetCode/\350\264\252\345\277\203.md" @@ -15,10 +15,48 @@ * [无重叠区间](#无重叠区间) (`medium`) * [加油站](#加油站) (`medium`) * [判断一个括号字符串是否有效](#判断一个括号字符串是否有效) (`medium`) - + * [去除重复字母](#取出重复字母) (`贪心` `哈希`) # 贪心总结 + +## 去除重复字母 + +[LeetCode中文](https://leetcode.cn/problems/remove-duplicate-letters/description/) + +利用字母的相对大小比较来选择是否丢弃字母,贪心思路比较巧妙 + +https://leetcode.cn/problems/remove-duplicate-letters/solutions/290200/yi-zhao-chi-bian-li-kou-si-dao-ti-ma-ma-zai-ye-b-4/ + +```c++ +class Solution { +public: + string removeDuplicateLetters(string s) { + string res; + unordered_set st; + unordered_map mp; + for (const char& ch : s) { + ++mp[ch]; + } + for (const char ch : s) { + if (st.find(ch) != st.end()) { + --mp[ch]; + continue; + } + while (!res.empty() && res.back() > ch && mp[res.back()] > 1) { + char top = res.back(); + res.pop_back(); + --mp[top]; + st.erase(top); + } + res.push_back(ch); + st.insert(ch); + } + return res; + } +}; +``` + ## 判断一个括号字符串是否有效 [LeetCode中文](https://leetcode.cn/problems/check-if-a-parentheses-string-can-be-valid/description/) From fc9ed642494d5c1bed3fe9dcecc4cd536e60bcb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Thu, 21 Sep 2023 07:08:54 -0500 Subject: [PATCH 087/163] =?UTF-8?q?Update=20=E8=B4=AA=E5=BF=83.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\350\264\252\345\277\203.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/LeetCode/\350\264\252\345\277\203.md" "b/LeetCode/\350\264\252\345\277\203.md" index 3685f94..05c2d78 100644 --- "a/LeetCode/\350\264\252\345\277\203.md" +++ "b/LeetCode/\350\264\252\345\277\203.md" @@ -15,7 +15,7 @@ * [无重叠区间](#无重叠区间) (`medium`) * [加油站](#加油站) (`medium`) * [判断一个括号字符串是否有效](#判断一个括号字符串是否有效) (`medium`) - * [去除重复字母](#取出重复字母) (`贪心` `哈希`) + * [去除重复字母](#去除重复字母) (`贪心` `哈希`) # 贪心总结 From c10954cbf26251b791f628bf102c3b378e5ac028 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Fri, 22 Sep 2023 06:18:34 -0500 Subject: [PATCH 088/163] =?UTF-8?q?Update=20=E6=A0=88=E5=92=8C=E9=98=9F?= =?UTF-8?q?=E5=88=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...10\345\222\214\351\230\237\345\210\227.md" | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git "a/LeetCode/\346\240\210\345\222\214\351\230\237\345\210\227.md" "b/LeetCode/\346\240\210\345\222\214\351\230\237\345\210\227.md" index 4de3f3f..d515dab 100644 --- "a/LeetCode/\346\240\210\345\222\214\351\230\237\345\210\227.md" +++ "b/LeetCode/\346\240\210\345\222\214\351\230\237\345\210\227.md" @@ -4,12 +4,67 @@ * [有效的括号](#有效的括号) (`easy`) * [逆波兰表达式求值](#逆波兰表达式求值) (`medium`) * [简化路径](#简化路径) (`medium`) + * [基本计算器II](#基本计算器II) (`medium`) * **队列** * [设计循环队列](#设计循环队列) (`medium`) * [设计循环双端队列](#设计循环双端队列) (`medium`) * [滑动窗口最大值](#滑动窗口最大值) (`hard` `滑动窗口` `双向队列`) # 栈和队列总结 + +# 基本计算器II + +[LeetCode中文](https://leetcode.cn/problems/basic-calculator-ii/description/) + +题解:https://leetcode.cn/problems/basic-calculator-ii/solutions/648647/ji-ben-ji-suan-qi-ii-by-leetcode-solutio-cm28/ + +```c++ +class Solution { +public: + int calculate(string s) { + stack sta; + char flag = '$'; + int num = 0; + for (char ch : s) { + if (ch == ' ') continue; + else if (ch >= '0' && ch <= '9') { + num = num * 10 + (ch - '0'); + } else { + if (flag == '-') { + num = -1 * num; + } else if (flag == '*') { + num = sta.top() * num; + sta.pop(); + } else if (flag == '/') { + num = sta.top() / num; + sta.pop(); + } + flag = ch; + sta.push(num); + num = 0; + } + } + if (flag == '-') { + num = -1 * num; + } else if (flag == '*') { + num = sta.top() * num; + sta.pop(); + } else if (flag == '/') { + num = sta.top() / num; + sta.pop(); + } + sta.push(num); + + int res = 0; + while (!sta.empty()) { + res += sta.top(); + sta.pop(); + } + return res; + } +}; +``` + ## 最小栈 [LeetCode中文](https://leetcode-cn.com/problems/min-stack/) From 673e79baeddcaab703cafd44b95472fc40efd231 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Mon, 9 Oct 2023 10:49:37 +0800 Subject: [PATCH 089/163] =?UTF-8?q?Update=20=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 --- .../\345\255\227\347\254\246\344\270\262.md" | 138 +++++++++++++++++- 1 file changed, 136 insertions(+), 2 deletions(-) diff --git "a/LeetCode/\345\255\227\347\254\246\344\270\262.md" "b/LeetCode/\345\255\227\347\254\246\344\270\262.md" index 65cdcf5..0e4031b 100644 --- "a/LeetCode/\345\255\227\347\254\246\344\270\262.md" +++ "b/LeetCode/\345\255\227\347\254\246\344\270\262.md" @@ -13,10 +13,144 @@ * [字母异位词分组](#字母异位词分组) (`medium` `哈希`) * [字符串相乘](#字符串相乘) (`medium` `数学`) * [字符串转整数(atoi)](#字符串转整数atoi) (`medium` `数学`) - * [字符串的排列](#字符串的排列) (`medium` `哈希` `滑动窗口`) - * [最小覆盖子串](#最小覆盖子串) (`hard` `滑动窗口` `哈希`) + * **滑动窗口** + * [字符串的排列](#字符串的排列) (`medium` `哈希`) + * [最小覆盖子串](#最小覆盖子串) (`hard` `哈希`) + * [找到字符串中所有字母异位词](#找到字符串中所有字母异位词) (`medium` `hash`) + * [串联所有单词的子串](#串联所有单词的子串) (`hard` `hash`) # 字符串类总结 + +## 串联所有单词的子串 +[LeetCode中文](https://leetcode.cn/problems/find-all-anagrams-in-a-string/description/) + +题解:滑动窗口进阶 +https://leetcode.cn/problems/substring-with-concatenation-of-all-words/solutions/1616997/chuan-lian-suo-you-dan-ci-de-zi-chuan-by-244a/ + +题解中的时间复杂度分析有误,应该是o(n) (n为字符串s的长度) + +```c++ +class Solution { +public: + vector findSubstring(string s, vector& words) { + vector res; + if (words.empty()) return res; + int w_len = words[0].size(), n = words.size(), len = s.size(); + unordered_map mp; + unordered_map mp2; + for (const auto& word : words) { + ++mp[word]; + } + for (int i = 0; i <= len - w_len; ++i) { + mp2[i] = s.substr(i, w_len); + } + for (int i = 0; i < w_len && i <= len - w_len * n; ++i) { + unordered_map mp1; + int l = i; + int r = i; + int valid = 0; + while (r <= len - w_len) { + auto tmp = mp2[r]; + if (mp.find(tmp) == mp.end()) { + l = r + w_len; + r = l; + mp1.clear(); + valid = 0; + continue; + } else { + ++mp1[tmp]; + if (mp1[tmp] == mp[tmp]) { + ++valid; + } + if (mp1[tmp] > mp[tmp]) { + r += w_len; + while (l < r && mp1[tmp] > mp[tmp]) { + const auto& tmp1 = mp2[l]; + if (tmp1 != tmp && mp[tmp1] == mp1[tmp1]) { + --valid; + } + --mp1[tmp1]; + // if (tmp == tmp1 && mp[tmp1] == mp1[tmp1]) { + // ++valid; + // } + if (mp1[tmp1] == 0) { + mp1.erase(tmp1); + } + l += w_len; + } + continue; + } + } + r += w_len; + while (r - l == w_len * n) { + if (valid == mp.size()) { + res.push_back(l); + } + const auto& tmp1 = mp2[l]; + if (mp.find(tmp1) != mp.end() && mp[tmp1] == mp1[tmp1]) { + --valid; + } + --mp1[tmp1]; + if (mp1[tmp1] == 0) { + mp1.erase(tmp1); + } + l += w_len; + } + } + } + return res; + } + unordered_map mp; + unordered_map mp1; +}; +``` + + +## 找到字符串中所有字母异位词 +[LeetCode中文](https://leetcode.cn/problems/find-all-anagrams-in-a-string/description/) + +题解:滑动窗口通用题解 https://leetcode.cn/problems/find-all-anagrams-in-a-string/solutions/9749/hua-dong-chuang-kou-tong-yong-si-xiang-jie-jue-zi-/ + +```c++ +class Solution { +public: + vector findAnagrams(string s, string p) { + unordered_map window, need; + for (const char& ch : p) { + need[ch]++; + } + int l = 0, r = 0; + int valid = 0; + vector res; + while (r < s.size()) { + char c = s[r]; + if (need.find(c) != need.end()) { + window[c]++; + if (need[c] == window[c]) { + valid++; + } + } + while (r - l + 1 > p.size()) { + char a = s[l]; + if (need.find(a) != need.end()) { + if (window[a] == need[a]) { + valid--; + } + window[a]--; + } + l++; + } + if (valid == need.size()) { + res.push_back(l); + } + ++r; + } + return res; + } +}; +``` + + ## 机器能否返回原点 [LeetCode中文](https://leetcode-cn.com/problems/robot-return-to-origin) From faa77c90e0ac30d1b56088b99dfee88d39458b8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Mon, 9 Oct 2023 17:05:23 +0800 Subject: [PATCH 090/163] =?UTF-8?q?Update=20=E6=A0=88=E5=92=8C=E9=98=9F?= =?UTF-8?q?=E5=88=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...10\345\222\214\351\230\237\345\210\227.md" | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git "a/LeetCode/\346\240\210\345\222\214\351\230\237\345\210\227.md" "b/LeetCode/\346\240\210\345\222\214\351\230\237\345\210\227.md" index d515dab..794261d 100644 --- "a/LeetCode/\346\240\210\345\222\214\351\230\237\345\210\227.md" +++ "b/LeetCode/\346\240\210\345\222\214\351\230\237\345\210\227.md" @@ -5,6 +5,7 @@ * [逆波兰表达式求值](#逆波兰表达式求值) (`medium`) * [简化路径](#简化路径) (`medium`) * [基本计算器II](#基本计算器II) (`medium`) + * [基本计算器III](#基本计算器III) * **队列** * [设计循环队列](#设计循环队列) (`medium`) * [设计循环双端队列](#设计循环双端队列) (`medium`) @@ -12,6 +13,87 @@ # 栈和队列总结 +# 基本计算器III + +[LeetCode中文](https://leetcode.cn/problems/basic-calculator-iii/description/) + +通用解法:https://leetcode.cn/problems/basic-calculator/solutions/646865/shuang-zhan-jie-jue-tong-yong-biao-da-sh-olym/ + +```c++ +class Solution { +public: + int calculate(string s) { + mp['+'] = 1; + mp['-'] = 1; + mp['*'] = 2; + mp['/'] = 2; + stack ops; + ops.push('('); + stack nums; + int num = 0; + int len = s.size(); + for (int i = 0; i < len; ++i) { + char ch = s[i]; + if (ch == ' ') { + continue; + } else if (ch == '(') { + ops.push(ch); + } else if (isNum(ch)) { + num = 0; + while (i < len && isNum(s[i])) { + num = num * 10 + (s[i] - '0'); + ++i; + } + nums.push(num); + --i; + } else { + calc(ops, nums, ch); + if (ch != ')') { + ops.push(ch); + } + } + } + calc(ops, nums, ')'); + return nums.empty() ? 0 : nums.top(); + } + bool isNum(char ch) { + return ch >= '0' && ch <= '9'; + } + void calc(stack& ops, stack& nums, char ch) { + if (nums.size() < 2) return; + if (ops.empty()) return; + while (!ops.empty() && ops.top() != '(' && nums.size() >= 2 && (ch == ')' || mp[ops.top()] >= mp[ch])) { + int num2 = nums.top(); + nums.pop(); + int num1 = nums.top(); + nums.pop(); + char op = ops.top(); + ops.pop(); + nums.push(getByOp(num1, num2, op)); + } + if (ch == ')' && !ops.empty() && ops.top() == '(') { + ops.pop(); + } + } + int getByOp(int num1, int num2, char op) { + int num = 0; + if (op == '+') { + num = num1 + num2; + } else if (op == '-') { + num = num1 - num2; + } else if (op == '*') { + num = num1 * num2; + } else { + num = num1 / num2; + } + return num; + } + +private: + unordered_map mp; +}; +``` + # 基本计算器II [LeetCode中文](https://leetcode.cn/problems/basic-calculator-ii/description/) From 98568bfddb2cb78a3a29f638446e3f1fe5386f31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Mon, 9 Oct 2023 17:05:40 +0800 Subject: [PATCH 091/163] =?UTF-8?q?Update=20=E6=A0=88=E5=92=8C=E9=98=9F?= =?UTF-8?q?=E5=88=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\346\240\210\345\222\214\351\230\237\345\210\227.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/LeetCode/\346\240\210\345\222\214\351\230\237\345\210\227.md" "b/LeetCode/\346\240\210\345\222\214\351\230\237\345\210\227.md" index 794261d..e830438 100644 --- "a/LeetCode/\346\240\210\345\222\214\351\230\237\345\210\227.md" +++ "b/LeetCode/\346\240\210\345\222\214\351\230\237\345\210\227.md" @@ -5,7 +5,7 @@ * [逆波兰表达式求值](#逆波兰表达式求值) (`medium`) * [简化路径](#简化路径) (`medium`) * [基本计算器II](#基本计算器II) (`medium`) - * [基本计算器III](#基本计算器III) + * [基本计算器III](#基本计算器III) (`hard`) * **队列** * [设计循环队列](#设计循环队列) (`medium`) * [设计循环双端队列](#设计循环双端队列) (`medium`) From 375f737586116b5861eedb8d6c17b952311feb4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Wed, 11 Oct 2023 17:20:27 +0800 Subject: [PATCH 092/163] =?UTF-8?q?Create=20=E5=88=86=E6=B2=BB.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\345\210\206\346\262\273.md" | 57 ++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 "LeetCode/\345\210\206\346\262\273.md" diff --git "a/LeetCode/\345\210\206\346\262\273.md" "b/LeetCode/\345\210\206\346\262\273.md" new file mode 100644 index 0000000..e4dc264 --- /dev/null +++ "b/LeetCode/\345\210\206\346\262\273.md" @@ -0,0 +1,57 @@ +**分治算法** + * [为运算表达式设计优先级](#为运算表达式设计优先级) + +# 分治算法 + +## 为运算表达式设计优先级 + +[LeetCode中文](https://leetcode.cn/problems/different-ways-to-add-parentheses/description/) + +解法:分治,子问题是 `num1 op num2` + +**方法1: 递归** + +```c++ +class Solution { +public: + vector diffWaysToCompute(string expression) { + return recursive(expression, 0, expression.size() - 1); + } + vector recursive(const string& exp, int l, int r) { + vector res; + if (r - l <= 1) { + if (res.empty()) { + int i = l; + int tmp = 0; + while (i <= r) { + tmp = tmp * 10 + (exp[i] - '0'); + ++i; + } + res.push_back(tmp); + } + return res; + } + for (int i = l; i <= r; ++i) { + char op = exp[i]; + if (op == '+' || op == '-' || op == '*') { + const vector& left = recursive(exp, l, i - 1); + const vector& right = recursive(exp, i + 1, r); + for (const int a : left) { + for (const int b : right) { + int val; + if (op == '+') { + val = a + b; + } else if (op == '-') { + val = a - b; + } else { + val = a * b; + } + res.push_back(val); + } + } + } + } + return res; + } +}; +``` From 4d9bac7d4f32b514787142c33811a2d4e49c3712 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Wed, 11 Oct 2023 17:22:36 +0800 Subject: [PATCH 093/163] =?UTF-8?q?Create=20=E8=AE=B0=E5=BF=86=E5=8C=96?= =?UTF-8?q?=E6=90=9C=E7=B4=A2.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...06\345\214\226\346\220\234\347\264\242.md" | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 "LeetCode/\350\256\260\345\277\206\345\214\226\346\220\234\347\264\242.md" diff --git "a/LeetCode/\350\256\260\345\277\206\345\214\226\346\220\234\347\264\242.md" "b/LeetCode/\350\256\260\345\277\206\345\214\226\346\220\234\347\264\242.md" new file mode 100644 index 0000000..632e47e --- /dev/null +++ "b/LeetCode/\350\256\260\345\277\206\345\214\226\346\220\234\347\264\242.md" @@ -0,0 +1,55 @@ +**记忆化搜索** + * [打家劫舍III](#打家劫舍III) + +# 记忆化搜索 + +## 打家劫舍III +[LeetCode中文](https://leetcode.cn/problems/house-robber-iii/description/) + +解法:树形动态规划 + 记忆化搜索 + +题解: https://leetcode.cn/problems/house-robber-iii/solutions/361038/da-jia-jie-she-iii-by-leetcode-solution/ + +打家劫舍系列扩展:https://leetcode.cn/problems/house-robber-iii/solutions/67467/tong-yong-si-lu-tuan-mie-da-jia-jie-she-wen-ti-b-2/ + +```c++ +/** + * Definition for a binary tree node. + * struct TreeNode { + * int val; + * TreeNode *left; + * TreeNode *right; + * TreeNode() : val(0), left(nullptr), right(nullptr) {} + * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} + * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} + * }; + */ +class Solution { +public: + int rob(TreeNode* root) { + return max(pickRecursive(root), unpickRecursive(root)); + } + int pickRecursive(TreeNode* root) { + if (!root) return 0; + if (pick_mp.find(root) != pick_mp.end()) { + return pick_mp[root]; + } + int res = root->val + unpickRecursive(root->left) + unpickRecursive(root->right); + pick_mp[root] = res; + return res; + } + int unpickRecursive(TreeNode* root) { + if (!root) return 0; + if (unpicked_mp.find(root) != unpicked_mp.end()) { + return unpicked_mp[root]; + } + int res = max(pickRecursive(root->left), unpickRecursive(root->left)) + max(pickRecursive(root->right), unpickRecursive(root->right)); + unpicked_mp[root] = res; + return res; + } + +private: + unordered_map pick_mp; + unordered_map unpicked_mp; +}; +``` From 3ce642226e015a1484aabbc2e3523e98d94732ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Wed, 11 Oct 2023 17:23:07 +0800 Subject: [PATCH 094/163] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 880cdab..9c83052 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,8 @@ * [二分查找](https://github.com/xcg1995/Code/blob/master/LeetCode/二分查找.md) * [排序](https://github.com/xcg1995/Code/blob/master/LeetCode/排序.md) * [动态规划](https://github.com/xcg1995/Code/blob/master/LeetCode/动态规划.md) + * [分治](https://github.com/Miller-Xie/Code/blob/master/LeetCode/%E5%88%86%E6%B2%BB.md) + * [记忆化搜索](https://github.com/Miller-Xie/Code/blob/master/LeetCode/%E8%AE%B0%E5%BF%86%E5%8C%96%E6%90%9C%E7%B4%A2.md) * [贪心](https://github.com/xcg1995/Code/blob/master/LeetCode/贪心.md) * [回溯](https://github.com/xcg1995/Code/blob/master/LeetCode/回溯.md) * [位运算](https://github.com/Making-It/Code/blob/master/LeetCode/位运算.md) From 2a948ea616a42a21c3af8500b9893d45d9596477 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Wed, 11 Oct 2023 17:23:58 +0800 Subject: [PATCH 095/163] =?UTF-8?q?Update=20=E5=88=86=E6=B2=BB.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\345\210\206\346\262\273.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/LeetCode/\345\210\206\346\262\273.md" "b/LeetCode/\345\210\206\346\262\273.md" index e4dc264..e2d85ec 100644 --- "a/LeetCode/\345\210\206\346\262\273.md" +++ "b/LeetCode/\345\210\206\346\262\273.md" @@ -1,5 +1,5 @@ **分治算法** - * [为运算表达式设计优先级](#为运算表达式设计优先级) + * [为运算表达式设计优先级](#为运算表达式设计优先级) (`medium`) # 分治算法 From 764e57de9f05400de6ceb07a14516b80176e404f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Wed, 11 Oct 2023 17:24:15 +0800 Subject: [PATCH 096/163] =?UTF-8?q?Update=20=E5=8A=A8=E6=80=81=E8=A7=84?= =?UTF-8?q?=E5=88=92.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...50\346\200\201\350\247\204\345\210\222.md" | 52 ------------------- 1 file changed, 52 deletions(-) diff --git "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" index 9b03d96..7b3c8d1 100644 --- "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" +++ "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" @@ -20,7 +20,6 @@ * [最长等差数列](#最长等差数列) (`medium`) * [最长递增子序列的个数](#最长递增子序列的个数) (`medium`) * [接雨水](#接雨水) (`hard`) - * [打家劫舍III](#打家劫舍III) (`medium` `树形动态规划`) * [分割等和子集](#分割等和子集) (`medium` `01背包`) # 动态规划总结 @@ -99,57 +98,6 @@ public: }; ``` -## 打家劫舍III -[LeetCode中文](https://leetcode.cn/problems/house-robber-iii/description/) - -解法:树形动态规划 + 记忆化搜索 - -题解: https://leetcode.cn/problems/house-robber-iii/solutions/361038/da-jia-jie-she-iii-by-leetcode-solution/ - -打家劫舍系列扩展:https://leetcode.cn/problems/house-robber-iii/solutions/67467/tong-yong-si-lu-tuan-mie-da-jia-jie-she-wen-ti-b-2/ - -```c++ -/** - * Definition for a binary tree node. - * struct TreeNode { - * int val; - * TreeNode *left; - * TreeNode *right; - * TreeNode() : val(0), left(nullptr), right(nullptr) {} - * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} - * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} - * }; - */ -class Solution { -public: - int rob(TreeNode* root) { - return max(pickRecursive(root), unpickRecursive(root)); - } - int pickRecursive(TreeNode* root) { - if (!root) return 0; - if (pick_mp.find(root) != pick_mp.end()) { - return pick_mp[root]; - } - int res = root->val + unpickRecursive(root->left) + unpickRecursive(root->right); - pick_mp[root] = res; - return res; - } - int unpickRecursive(TreeNode* root) { - if (!root) return 0; - if (unpicked_mp.find(root) != unpicked_mp.end()) { - return unpicked_mp[root]; - } - int res = max(pickRecursive(root->left), unpickRecursive(root->left)) + max(pickRecursive(root->right), unpickRecursive(root->right)); - unpicked_mp[root] = res; - return res; - } - -private: - unordered_map pick_mp; - unordered_map unpicked_mp; -}; -``` - ## 爬楼梯 [LeetCode中文](https://leetcode-cn.com/problems/climbing-stairs) From 47723c352f99b035a85219cade9596781033e76b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Wed, 11 Oct 2023 17:35:32 +0800 Subject: [PATCH 097/163] =?UTF-8?q?Update=20=E8=AE=B0=E5=BF=86=E5=8C=96?= =?UTF-8?q?=E6=90=9C=E7=B4=A2.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...06\345\214\226\346\220\234\347\264\242.md" | 45 ++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git "a/LeetCode/\350\256\260\345\277\206\345\214\226\346\220\234\347\264\242.md" "b/LeetCode/\350\256\260\345\277\206\345\214\226\346\220\234\347\264\242.md" index 632e47e..e688cdb 100644 --- "a/LeetCode/\350\256\260\345\277\206\345\214\226\346\220\234\347\264\242.md" +++ "b/LeetCode/\350\256\260\345\277\206\345\214\226\346\220\234\347\264\242.md" @@ -1,9 +1,52 @@ **记忆化搜索** - * [打家劫舍III](#打家劫舍III) + * [打家劫舍III](#打家劫舍III) (`medium` `树形动态规划`) + * [路径总和III](#路径总和III) (`medium` `前缀和`) # 记忆化搜索 +## 路径总和III + +[LeetCode中文](https://leetcode.cn/problems/path-sum-iii/) + + +```c++ +/** + * Definition for a binary tree node. + * struct TreeNode { + * int val; + * TreeNode *left; + * TreeNode *right; + * TreeNode() : val(0), left(nullptr), right(nullptr) {} + * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} + * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} + * }; + */ +class Solution { +public: + int pathSum(TreeNode* root, int targetSum) { + unordered_map mp; // key: 前缀和 value: 前缀和等于key的节点数量 + long prefix_sum = 0; + return pathSumImpl(root, targetSum, mp, prefix_sum); + } + int pathSumImpl(TreeNode* root, int target, unordered_map& mp, long prefix_sum) { + if (root == nullptr) return 0; + int res = 0; + prefix_sum += root->val; + if (prefix_sum == target) res += 1; + if (mp.find(prefix_sum - target) != mp.end()) { + res += mp[prefix_sum - target]; + } + mp[prefix_sum]++; + res += pathSumImpl(root->left, target, mp, prefix_sum); + res += pathSumImpl(root->right, target, mp, prefix_sum); + mp[prefix_sum]--; + return res; + } +}; +``` + ## 打家劫舍III + [LeetCode中文](https://leetcode.cn/problems/house-robber-iii/description/) 解法:树形动态规划 + 记忆化搜索 From a0fd4afb8c636c93389f90490e785037f746fea1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Wed, 18 Oct 2023 17:54:07 +0800 Subject: [PATCH 098/163] =?UTF-8?q?Update=20=E5=88=86=E6=B2=BB.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\345\210\206\346\262\273.md" | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git "a/LeetCode/\345\210\206\346\262\273.md" "b/LeetCode/\345\210\206\346\262\273.md" index e2d85ec..ae89080 100644 --- "a/LeetCode/\345\210\206\346\262\273.md" +++ "b/LeetCode/\345\210\206\346\262\273.md" @@ -1,8 +1,16 @@ **分治算法** * [为运算表达式设计优先级](#为运算表达式设计优先级) (`medium`) + * [至少有K个重复字符的最长子串](#至少有K个重复字符的最长子串) (`medium` `递归`) # 分治算法 +## 至少有K个重复字符的最长子串 + +[LeetCode中文](https://leetcode.cn/problems/longest-substring-with-at-least-k-repeating-characters/description/) + + + + ## 为运算表达式设计优先级 [LeetCode中文](https://leetcode.cn/problems/different-ways-to-add-parentheses/description/) From 65cf4bd5cb4e79abc4f236521d2b992f05efaf85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Wed, 18 Oct 2023 18:57:12 +0800 Subject: [PATCH 099/163] =?UTF-8?q?Update=20=E5=88=86=E6=B2=BB.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\345\210\206\346\262\273.md" | 49 ++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git "a/LeetCode/\345\210\206\346\262\273.md" "b/LeetCode/\345\210\206\346\262\273.md" index ae89080..3fe11f5 100644 --- "a/LeetCode/\345\210\206\346\262\273.md" +++ "b/LeetCode/\345\210\206\346\262\273.md" @@ -8,7 +8,56 @@ [LeetCode中文](https://leetcode.cn/problems/longest-substring-with-at-least-k-repeating-characters/description/) +解法:分治思想,递归解决子问题 +https://leetcode.cn/problems/longest-substring-with-at-least-k-repeating-characters/solutions/623432/zhi-shao-you-kge-zhong-fu-zi-fu-de-zui-c-o6ww/ +时间复杂度:O(n * 26) + +```c++ +class Solution { +public: + int longestSubstring(string s, int k) { + return dfs(s, 0, s.size() - 1, k); + } + int dfs(const string& s, int l, int r, int k) { + if (r - l + 1 < k) return 0; + vector mp(26, 0); + for (int i = l; i <= r; ++i) { + ++mp[s[i] - 'a']; + } + char ch = 0; + for (int i = 0; i < 26; ++i) { + if (mp[i] > 0 && mp[i] < k) { + ch = 'a' + i; + break; + } + } + if (ch == 0) { + return r - l + 1; + } + while (l <= r && s[l] == ch) { + ++l; + } + int idx = l; + int res = 0; + while (idx <= r) { + if (s[idx] == ch) { + res = max(res, dfs(s, l, idx - 1, k)); + while (idx <= r && s[idx] == ch) { + ++idx; + } + l = idx; + } else { + if (idx == r) { + res = max(res, dfs(s, l, idx, k)); + } + ++idx; + } + } + return res; + } +}; +``` ## 为运算表达式设计优先级 From 295d791cdee27c6580a06e90335bddffccf045a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Wed, 18 Oct 2023 18:57:28 +0800 Subject: [PATCH 100/163] =?UTF-8?q?Update=20=E5=88=86=E6=B2=BB.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\345\210\206\346\262\273.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/LeetCode/\345\210\206\346\262\273.md" "b/LeetCode/\345\210\206\346\262\273.md" index 3fe11f5..5a6a8ab 100644 --- "a/LeetCode/\345\210\206\346\262\273.md" +++ "b/LeetCode/\345\210\206\346\262\273.md" @@ -8,7 +8,8 @@ [LeetCode中文](https://leetcode.cn/problems/longest-substring-with-at-least-k-repeating-characters/description/) -解法:分治思想,递归解决子问题 +**解法**:分治思想,递归解决子问题 + https://leetcode.cn/problems/longest-substring-with-at-least-k-repeating-characters/solutions/623432/zhi-shao-you-kge-zhong-fu-zi-fu-de-zui-c-o6ww/ 时间复杂度:O(n * 26) From 573e272a51aa1a77f8f8e0ec332c44c0c3452b56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Wed, 18 Oct 2023 19:30:40 +0800 Subject: [PATCH 101/163] =?UTF-8?q?Update=20=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 --- "LeetCode/\345\255\227\347\254\246\344\270\262.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/LeetCode/\345\255\227\347\254\246\344\270\262.md" "b/LeetCode/\345\255\227\347\254\246\344\270\262.md" index 0e4031b..a4114a3 100644 --- "a/LeetCode/\345\255\227\347\254\246\344\270\262.md" +++ "b/LeetCode/\345\255\227\347\254\246\344\270\262.md" @@ -22,7 +22,7 @@ # 字符串类总结 ## 串联所有单词的子串 -[LeetCode中文](https://leetcode.cn/problems/find-all-anagrams-in-a-string/description/) +[LeetCode中文](https://leetcode.cn/problems/substring-with-concatenation-of-all-words/description/) 题解:滑动窗口进阶 https://leetcode.cn/problems/substring-with-concatenation-of-all-words/solutions/1616997/chuan-lian-suo-you-dan-ci-de-zi-chuan-by-244a/ From a3bcafe354677b2b8c4f9981c97160d69f95f03f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Thu, 19 Oct 2023 17:14:11 +0800 Subject: [PATCH 102/163] =?UTF-8?q?Update=20=E6=8E=92=E5=BA=8F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\346\216\222\345\272\217.md" | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git "a/LeetCode/\346\216\222\345\272\217.md" "b/LeetCode/\346\216\222\345\272\217.md" index 3147732..4fac337 100644 --- "a/LeetCode/\346\216\222\345\272\217.md" +++ "b/LeetCode/\346\216\222\345\272\217.md" @@ -4,9 +4,19 @@ * [数组中的第K个最大元素](#数组中的第K个最大元素) (`medium` `快速排序` `堆`) * [前K个高频元素](#前K个高频元素) (`medium` `桶排序` `堆`) * [最大间距](#最大间距) (`hard` `桶排序`) + * [摆动排序II](#摆动排序II) (`medium` `快速选择`) # 排序总结 + +## 摆动排序II + +[LeetCode中文](https://leetcode.cn/problems/wiggle-sort-ii/description/) + +**题解**:快速选择 + 数组反序穿插 + +详见:https://leetcode.cn/problems/wiggle-sort-ii/solutions/45144/yi-bu-yi-bu-jiang-shi-jian-fu-za-du-cong-onlognjia/ + ## 颜色分类 [LeetCode中文](https://leetcode-cn.com/problems/sort-colors) From 4c800aa3ec366a6d80a187a44f432e38733258f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Thu, 19 Oct 2023 17:54:33 +0800 Subject: [PATCH 103/163] =?UTF-8?q?Update=20=E5=8A=A8=E6=80=81=E8=A7=84?= =?UTF-8?q?=E5=88=92.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...50\346\200\201\350\247\204\345\210\222.md" | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" index 7b3c8d1..3888717 100644 --- "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" +++ "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" @@ -3,6 +3,7 @@ * [爬楼梯](#爬楼梯) (`easy`) * [买卖股票的最佳时机](#买卖股票的最佳时机) (`easy`) * [买卖股票的最佳时机III](#买卖股票的最佳时机III) (`hard` `分治`) + * [买卖股票的最佳时机含冷冻期](#买卖股票的最佳时机含冷冻期) (`medium` `状态dp`) * [最大子序和](#最大子序和) (`easy`) * [打家劫舍](#打家劫舍) (`easy`) * [最小路径和](#最小路径和) (`medium`) @@ -23,6 +24,42 @@ * [分割等和子集](#分割等和子集) (`medium` `01背包`) # 动态规划总结 + +## 买卖股票的最佳时机含冷冻期 + +[LeetCode中文](https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-cooldown/) + +题解:同一天的股票情况分三种: +* dp[i][0]: 今天不持有,没有卖出 +* dp[i][1]: 今天不持有,且卖出 +* dp[i][2]: 今天持有(1. 今天买入 2. 今天没买入,之前就持有) + +动态转移方程: + +dp[i][0] = max(dp[i - 1][0], dp[i - 1][1]); +dp[i][1] = dp[i - 1][2] + prices[i]; +dp[i][2] = max(dp[i - 1][0] - prices[i], dp[i - 1][2]); + +```c++ +class Solution { +public: + int maxProfit(vector& prices) { + if (prices.empty()) return 0; + int n = prices.size(); + vector> dp(n, vector(3)); + dp[0][0] = 0; // 今天不持有,没有卖出 + dp[0][1] = 0; // 今天不持有,且卖出 + dp[0][2] = -1 * prices[0]; // 今天持有(1. 今天买入 2. 今天没买入,之前就持有) + for (int i = 1; i < n; ++i) { + dp[i][0] = max(dp[i - 1][0], dp[i - 1][1]); + dp[i][1] = dp[i - 1][2] + prices[i]; + dp[i][2] = max(dp[i - 1][0] - prices[i], dp[i - 1][2]); + } + return max(dp[n - 1][0], dp[n - 1][1]); + } +}; +``` + ## 分割等和子集 [LeetCode中文](https://leetcode.cn/problems/partition-equal-subset-sum/description/) From 907e5ede010e8d350d99134d56bd78a285bb638a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Thu, 19 Oct 2023 17:54:58 +0800 Subject: [PATCH 104/163] =?UTF-8?q?Update=20=E5=8A=A8=E6=80=81=E8=A7=84?= =?UTF-8?q?=E5=88=92.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" index 3888717..dff1a1e 100644 --- "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" +++ "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" @@ -36,9 +36,11 @@ 动态转移方程: +``` dp[i][0] = max(dp[i - 1][0], dp[i - 1][1]); dp[i][1] = dp[i - 1][2] + prices[i]; dp[i][2] = max(dp[i - 1][0] - prices[i], dp[i - 1][2]); +``` ```c++ class Solution { From 53f52c31517aedf073589ad625f8096e0ae9c1f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Wed, 25 Oct 2023 17:47:36 +0800 Subject: [PATCH 105/163] =?UTF-8?q?Update=20=E5=8D=95=E8=B0=83=E6=A0=88.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\345\215\225\350\260\203\346\240\210.md" | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git "a/LeetCode/\345\215\225\350\260\203\346\240\210.md" "b/LeetCode/\345\215\225\350\260\203\346\240\210.md" index 8b13789..354a97c 100644 --- "a/LeetCode/\345\215\225\350\260\203\346\240\210.md" +++ "b/LeetCode/\345\215\225\350\260\203\346\240\210.md" @@ -1 +1,78 @@ +* **单调栈总结** + * [每日温度](#每日温度) + * [柱状图中最大的矩形](#柱状图中最大的矩形) + * [去除重复字母](https://github.com/Miller-Xie/Code/blob/master/LeetCode/%E8%B4%AA%E5%BF%83.md#%E5%8E%BB%E9%99%A4%E9%87%8D%E5%A4%8D%E5%AD%97%E6%AF%8D) + +# 单调栈总结 + +## 每日温度 + +[LeetCode中文](https://leetcode.cn/problems/daily-temperatures/) + +解法: 最基本的单调栈实现 + +```c++ +class Solution { +public: + vector dailyTemperatures(const vector& temperatures) { + stack> sta; + int n = temperatures.size(); + vector res(n, 0); + for (int i = n - 1; i >= 0; --i) { + int cur = temperatures[i]; + while (!sta.empty() && cur >= sta.top().second) { + sta.pop(); + } + if (sta.empty()) res[i] = 0; + else res[i] = sta.top().first - i; + sta.push({i, cur}); + } + return res; + } +}; +``` + +## 柱状图中最大的矩形 + +[LeetCode中文](https://leetcode.cn/problems/largest-rectangle-in-histogram/) + +解法:利用单调栈,求出左边和右边最后一个>=当前元素的位置,然后重新遍历的时候,计算每个元素形成的最大巨星面积 + +```c++ +class Solution { +public: + int largestRectangleArea(vector& heights) { + stack sta, sta1; + int len = heights.size(); + vector left_mp(len), right_mp(len); + for (int i = 0; i < len; ++i) { + while (!sta.empty() && heights[i] <= heights[sta.top()]) { + sta.pop(); + } + if (sta.empty()) { + left_mp[i] = 0; + } else { + left_mp[i] = sta.top() + 1; + } + sta.push(i); + } + for (int i = len - 1; i >= 0; --i) { + while (!sta1.empty() && heights[i] <= heights[sta1.top()]) { + sta1.pop(); + } + if (sta1.empty()) { + right_mp[i] = len - 1; + } else { + right_mp[i] = sta1.top() - 1; + } + sta1.push(i); + } + int res = 0; + for (int i = 0; i < len; ++i) { + res = max(res, (right_mp[i] - left_mp[i] + 1) * heights[i]); + } + return res; + } +}; +``` From 436f652eaf82baa9782d12f766abc5a584e614a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Wed, 25 Oct 2023 17:48:31 +0800 Subject: [PATCH 106/163] =?UTF-8?q?Update=20=E5=8D=95=E8=B0=83=E6=A0=88.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\345\215\225\350\260\203\346\240\210.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/LeetCode/\345\215\225\350\260\203\346\240\210.md" "b/LeetCode/\345\215\225\350\260\203\346\240\210.md" index 354a97c..84d654b 100644 --- "a/LeetCode/\345\215\225\350\260\203\346\240\210.md" +++ "b/LeetCode/\345\215\225\350\260\203\346\240\210.md" @@ -1,7 +1,7 @@ * **单调栈总结** - * [每日温度](#每日温度) - * [柱状图中最大的矩形](#柱状图中最大的矩形) - * [去除重复字母](https://github.com/Miller-Xie/Code/blob/master/LeetCode/%E8%B4%AA%E5%BF%83.md#%E5%8E%BB%E9%99%A4%E9%87%8D%E5%A4%8D%E5%AD%97%E6%AF%8D) + * [每日温度](#每日温度) (`medium`) + * [柱状图中最大的矩形](#柱状图中最大的矩形) (`hard`) + * [去除重复字母](https://github.com/Miller-Xie/Code/blob/master/LeetCode/%E8%B4%AA%E5%BF%83.md#%E5%8E%BB%E9%99%A4%E9%87%8D%E5%A4%8D%E5%AD%97%E6%AF%8D) (`hard` `贪心`) # 单调栈总结 From 8f8935c8badb85ba2f8761ab30d87063fca7d045 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Wed, 6 Dec 2023 15:49:14 +0800 Subject: [PATCH 107/163] =?UTF-8?q?Update=20=E5=9B=BE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\345\233\276.md" | 45 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git "a/LeetCode/\345\233\276.md" "b/LeetCode/\345\233\276.md" index 9710686..0f6838d 100644 --- "a/LeetCode/\345\233\276.md" +++ "b/LeetCode/\345\233\276.md" @@ -7,6 +7,7 @@ * [单词搜索](#单词搜索) (`medium`) * [单词搜索II](#单词搜索II) (`hard` `字典树`) * [矩阵中的最长递增路径](#矩阵中的最长递增路径) (`hard` `动态规划`) + * [以图判树](#以图判树) (`medium`) * **并查集** * [冗余连接](#冗余连接) (`medium`) * [朋友圈](#朋友圈) (`medium`) @@ -20,6 +21,50 @@ * [课程表II](#课程表II) (`medium` `拓扑排序`) # 图总结 +## 以图判树 + +[LeetCode中文](https://leetcode.cn/problems/graph-valid-tree/) + +**解法**:建立图的数据结构,dfs整个图,并记录已经访问过的node,如果遍历到某个节点发现与他相连的节点数大于1且都访问过,说明图中存在环;另外还有一种特殊情况考虑,所有的节点构成了多个隔离的环,这种情况遍历一次的节点数不等于总结点数 + +```c++ +class Solution { +public: + bool validTree(int n, vector>& edges) { + if (n < 1) return true; + vector visited(n ,false); + vector> graph(n, vector()); + for (const auto edge : edges) { + graph[edge[0]].push_back(edge[1]); + graph[edge[1]].push_back(edge[0]); + } + int cnt = 0; + visited[0] = true; + return recursive(graph, visited, 0, cnt) && cnt == n; + } + + bool recursive(const vector>& graph, vector& visited, int n, int& cnt) { + bool flag = false; + ++cnt; + for (const int a : graph[n]) { + if (!visited[a]) { + visited[a] = true; + if (!recursive(graph, visited, a, cnt)) { + return false; + } + visited[a] = false; + flag = true; + } + } + if (!flag && graph[n].size() > 1) { + return false; + } + return true; + } +}; +``` + + ## 课程表 [LeetCode中文](https://leetcode-cn.com/problems/course-schedule/) From 0503fda9c822e9b1620cba6abe93e77b216844df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Fri, 8 Dec 2023 15:37:39 +0800 Subject: [PATCH 108/163] =?UTF-8?q?Update=20=E5=AD=97=E5=85=B8=E6=A0=91.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\345\255\227\345\205\270\346\240\221.md" | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) diff --git "a/LeetCode/\345\255\227\345\205\270\346\240\221.md" "b/LeetCode/\345\255\227\345\205\270\346\240\221.md" index 1a014a3..cc28b26 100644 --- "a/LeetCode/\345\255\227\345\205\270\346\240\221.md" +++ "b/LeetCode/\345\255\227\345\205\270\346\240\221.md" @@ -2,8 +2,106 @@ * [实现Trie(前缀树)](#实现Trie前缀树) (`medium`) * [键值映射](#键值映射) (`medium`) * [单词替换](#单词替换) (`medium`) + * [添加与搜索单词 - 数据结构设计] (`medium`) # 字典树总结 +## 添加与搜索单词 - 数据结构设计 + +[LeetCode中文](https://leetcode.cn/problems/design-add-and-search-words-data-structure/solutions/) + +```c++ +struct TrieTreeNode { + std::vector sons; + int num; + explicit TrieTreeNode(int a) : num(a) { + sons.resize(26); + for (int i = 0; i < sons.size(); ++i) { + sons[i] = nullptr; + } + } +}; + +class TrieTree { +public: + TrieTree() { + root = new TrieTreeNode(0); + } + + void AddStr(const std::string& str) { + AddStrRecursive(str, root, 0); + } + + bool Exists(const std::string& str) { + return ExistsRecursive(str, root, 0); + } + +private: + TrieTreeNode* root = nullptr; + void AddStrRecursive(const std::string& str, TrieTreeNode* node, int idx) { + if (idx == str.size()) { + ++node->num; + return; + } + int a = str[idx] - 'a'; + if (node->sons[a] == nullptr) { + node->sons[a] = new TrieTreeNode(0); + } + AddStrRecursive(str, node->sons[a], idx + 1); + } + + bool ExistsRecursive(const std::string& str, const TrieTreeNode* node, int idx) { + if (node == nullptr) { + return false; + } + if (idx == str.size()) { + if (node->num > 0) { + return true; + } else { + return false; + } + } + if (str[idx] == '.') { + for (int i = 0; i < 26; ++i) { + if (node->sons[i] != nullptr && ExistsRecursive(str, node->sons[i], idx + 1)) { + return true; + } + } + return false; + } + int a = str[idx] - 'a'; + if (node->sons[a] == nullptr) { + return false; + } + return ExistsRecursive(str, node->sons[a], idx + 1); + } +}; + +class WordDictionary { +public: + WordDictionary() { + tree_ = new TrieTree(); + } + + void addWord(string word) { + tree_->AddStr(word); + } + + bool search(string word) { + return tree_->Exists(word); + } + +private: + TrieTree* tree_; +}; + +/** + * Your WordDictionary object will be instantiated and called as such: + * WordDictionary* obj = new WordDictionary(); + * obj->addWord(word); + * bool param_2 = obj->search(word); + */ +``` + ## 实现Trie(前缀树) [LeetCode中文](https://leetcode-cn.com/problems/implement-trie-prefix-tree) From 373ff8d4b5d40b2f8b39366d7ba61a78a6456cc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Fri, 8 Dec 2023 15:38:21 +0800 Subject: [PATCH 109/163] =?UTF-8?q?Update=20=E5=AD=97=E5=85=B8=E6=A0=91.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\345\255\227\345\205\270\346\240\221.md" | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git "a/LeetCode/\345\255\227\345\205\270\346\240\221.md" "b/LeetCode/\345\255\227\345\205\270\346\240\221.md" index cc28b26..c112405 100644 --- "a/LeetCode/\345\255\227\345\205\270\346\240\221.md" +++ "b/LeetCode/\345\255\227\345\205\270\346\240\221.md" @@ -2,13 +2,15 @@ * [实现Trie(前缀树)](#实现Trie前缀树) (`medium`) * [键值映射](#键值映射) (`medium`) * [单词替换](#单词替换) (`medium`) - * [添加与搜索单词 - 数据结构设计] (`medium`) + * [添加与搜索单词 - 数据结构设计](#添加与搜索单词 - 数据结构设计) (`medium`) # 字典树总结 ## 添加与搜索单词 - 数据结构设计 [LeetCode中文](https://leetcode.cn/problems/design-add-and-search-words-data-structure/solutions/) +**解法**: 前缀树 + 正则匹配 + ```c++ struct TrieTreeNode { std::vector sons; From a09d092d7d539d214e03c52d1edb5e04c6667cb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Fri, 8 Dec 2023 15:41:10 +0800 Subject: [PATCH 110/163] =?UTF-8?q?Update=20=E5=AD=97=E5=85=B8=E6=A0=91.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\345\255\227\345\205\270\346\240\221.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/LeetCode/\345\255\227\345\205\270\346\240\221.md" "b/LeetCode/\345\255\227\345\205\270\346\240\221.md" index c112405..3580cac 100644 --- "a/LeetCode/\345\255\227\345\205\270\346\240\221.md" +++ "b/LeetCode/\345\255\227\345\205\270\346\240\221.md" @@ -2,10 +2,10 @@ * [实现Trie(前缀树)](#实现Trie前缀树) (`medium`) * [键值映射](#键值映射) (`medium`) * [单词替换](#单词替换) (`medium`) - * [添加与搜索单词 - 数据结构设计](#添加与搜索单词 - 数据结构设计) (`medium`) + * [添加与搜索单词-数据结构设计](#添加与搜索单词-数据结构设计) (`medium`) # 字典树总结 -## 添加与搜索单词 - 数据结构设计 +## 添加与搜索单词-数据结构设计 [LeetCode中文](https://leetcode.cn/problems/design-add-and-search-words-data-structure/solutions/) From fa5f58e43b72eb67828d76b12f05e890a36a14cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Fri, 15 Dec 2023 10:46:18 +0800 Subject: [PATCH 111/163] =?UTF-8?q?Update=20=E5=8A=A8=E6=80=81=E8=A7=84?= =?UTF-8?q?=E5=88=92.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...50\346\200\201\350\247\204\345\210\222.md" | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" index dff1a1e..a7e5ba4 100644 --- "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" +++ "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" @@ -6,6 +6,7 @@ * [买卖股票的最佳时机含冷冻期](#买卖股票的最佳时机含冷冻期) (`medium` `状态dp`) * [最大子序和](#最大子序和) (`easy`) * [打家劫舍](#打家劫舍) (`easy`) + * [打家劫舍III](#打家劫舍III) (`medium` `树形动态规划`) * [最小路径和](#最小路径和) (`medium`) * [不同路径](#不同路径) (`medium`) * [三角形最小路径和](#三角形最小路径和) (`medium`) @@ -25,6 +26,54 @@ # 动态规划总结 +## 打家劫舍III + +[LeetCode中文](https://leetcode.cn/problems/house-robber-iii/solutions/47828/san-chong-fang-fa-jie-jue-shu-xing-dong-tai-gui-hu/) + +解法:树形动态规划 + 递归 + +```c++ +/** + * Definition for a binary tree node. + * struct TreeNode { + * int val; + * TreeNode *left; + * TreeNode *right; + * TreeNode() : val(0), left(nullptr), right(nullptr) {} + * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} + * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} + * }; + */ +class Solution { +public: + int rob(TreeNode* root) { + return max(pickRecursive(root), unpickRecursive(root)); + } + int pickRecursive(TreeNode* root) { + if (!root) return 0; + if (pick_mp.find(root) != pick_mp.end()) { + return pick_mp[root]; + } + int res = root->val + unpickRecursive(root->left) + unpickRecursive(root->right); + pick_mp[root] = res; + return res; + } + int unpickRecursive(TreeNode* root) { + if (!root) return 0; + if (unpicked_mp.find(root) != unpicked_mp.end()) { + return unpicked_mp[root]; + } + int res = max(pickRecursive(root->left), unpickRecursive(root->left)) + max(pickRecursive(root->right), unpickRecursive(root->right)); + unpicked_mp[root] = res; + return res; + } + +private: + unordered_map pick_mp; + unordered_map unpicked_mp; +}; +``` + ## 买卖股票的最佳时机含冷冻期 [LeetCode中文](https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-cooldown/) From 505d983ebd833bff11c3f77c70bcd2e22b6b9296 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Fri, 15 Dec 2023 10:47:01 +0800 Subject: [PATCH 112/163] =?UTF-8?q?Update=20=E5=8A=A8=E6=80=81=E8=A7=84?= =?UTF-8?q?=E5=88=92.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" index a7e5ba4..52a6e7d 100644 --- "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" +++ "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" @@ -30,7 +30,7 @@ [LeetCode中文](https://leetcode.cn/problems/house-robber-iii/solutions/47828/san-chong-fang-fa-jie-jue-shu-xing-dong-tai-gui-hu/) -解法:树形动态规划 + 递归 +解法:树形动态规划 + 记忆化 + 递归 ```c++ /** From 9b279897ebb7f5929bd8a50e522de544e8cde475 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Fri, 15 Dec 2023 19:38:30 +0800 Subject: [PATCH 113/163] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 9c83052..7207fc3 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,7 @@ * **算法** * [二分查找](https://github.com/xcg1995/Code/blob/master/LeetCode/二分查找.md) * [排序](https://github.com/xcg1995/Code/blob/master/LeetCode/排序.md) + * [递归]() * [动态规划](https://github.com/xcg1995/Code/blob/master/LeetCode/动态规划.md) * [分治](https://github.com/Miller-Xie/Code/blob/master/LeetCode/%E5%88%86%E6%B2%BB.md) * [记忆化搜索](https://github.com/Miller-Xie/Code/blob/master/LeetCode/%E8%AE%B0%E5%BF%86%E5%8C%96%E6%90%9C%E7%B4%A2.md) From 689edef5f0c65516abda01ebf8395c0a6c4eaac2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Fri, 15 Dec 2023 19:41:07 +0800 Subject: [PATCH 114/163] =?UTF-8?q?Create=20=E9=80=92=E5=BD=92.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\351\200\222\345\275\222.md" | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 "LeetCode/\351\200\222\345\275\222.md" diff --git "a/LeetCode/\351\200\222\345\275\222.md" "b/LeetCode/\351\200\222\345\275\222.md" new file mode 100644 index 0000000..1def9fe --- /dev/null +++ "b/LeetCode/\351\200\222\345\275\222.md" @@ -0,0 +1,14 @@ +* **递归总结** + * [字符串解码](#字符串解码) + + +# 递归总结 + +## 字符串解码 + +[LeetCode中文](https://leetcode.cn/problems/decode-string/description/) + + +```c++ + +``` From 0365c985173c0b1df504381c8de769ea0941ef58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Fri, 15 Dec 2023 19:42:09 +0800 Subject: [PATCH 115/163] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7207fc3..9a89617 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ * **算法** * [二分查找](https://github.com/xcg1995/Code/blob/master/LeetCode/二分查找.md) * [排序](https://github.com/xcg1995/Code/blob/master/LeetCode/排序.md) - * [递归]() + * [递归](https://github.com/Miller-Xie/Code/blob/master/LeetCode/%E9%80%92%E5%BD%92.md) * [动态规划](https://github.com/xcg1995/Code/blob/master/LeetCode/动态规划.md) * [分治](https://github.com/Miller-Xie/Code/blob/master/LeetCode/%E5%88%86%E6%B2%BB.md) * [记忆化搜索](https://github.com/Miller-Xie/Code/blob/master/LeetCode/%E8%AE%B0%E5%BF%86%E5%8C%96%E6%90%9C%E7%B4%A2.md) From 255f130de73b35c0db6671c70f9e275cc95400a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Sat, 16 Dec 2023 18:55:36 +0800 Subject: [PATCH 116/163] =?UTF-8?q?Update=20=E5=9B=BE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\345\233\276.md" | 104 +++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) diff --git "a/LeetCode/\345\233\276.md" "b/LeetCode/\345\233\276.md" index 0f6838d..2dc6099 100644 --- "a/LeetCode/\345\233\276.md" +++ "b/LeetCode/\345\233\276.md" @@ -11,6 +11,7 @@ * **并查集** * [冗余连接](#冗余连接) (`medium`) * [朋友圈](#朋友圈) (`medium`) + * [除法求解](#除法求解) (`medium`) * **最短路径** * [最短路径.一](#最短路径一) (`hard` `迪杰斯特拉算法`) * **最小生成树** @@ -21,6 +22,109 @@ * [课程表II](#课程表II) (`medium` `拓扑排序`) # 图总结 + +## 除法求解 + +**解法**:带权值并查集 + 分子分母表达式转换 + + +```c++ +class UnionSet { + public: + UnionSet(const set st) { + for (auto iter = st.begin(); iter != st.end(); ++iter) { + const string& str = *iter; + parent_mp_[str] = str; + weight_mp_[str] = 1.0; + size_mp_[str] = 1; + } + } + + bool IsSameSet(const string& str1, const string& str2) { + return FindRoot(str1) == FindRoot(str2); + } + + void Union(const string& str1, const string& str2, double val) { + const string& root1 = FindRoot(str1); + const string& root2 = FindRoot(str2); + double d1 = GetDivideToRoot(str1); + double d2 = GetDivideToRoot(str2); + if (size_mp_[root1] > size_mp_[root2]) { + parent_mp_[root2] = root1; + weight_mp_[root2] = d1 / d2 / val; + size_mp_[root1] = size_mp_[root1] + size_mp_[root2]; + size_mp_.erase(root2); + } else { + parent_mp_[root1] = root2; + weight_mp_[root1] = d2 / d1 * val; + size_mp_[root2] = size_mp_[root1] + size_mp_[root2]; + size_mp_.erase(root1); + } + } + + double GetRes(const string& str1, const string& str2) { + if (str1 == str2) { + return 1.0; + } + if (!IsSameSet(str1, str2)) { + return -1.0; + } + return GetDivideToRoot(str1) / GetDivideToRoot(str2); + } + + private: + // 当前节点 -> 父节点映射 + unordered_map parent_mp_; + // 当前节点 / 父节点 的结果 + unordered_map weight_mp_, size_mp_; + + string FindRoot(const string& str) { + if (parent_mp_[str] != str) { + return FindRoot(parent_mp_[str]); + } + return str; + } + + double GetDivideToRoot(const string& str) { + double res = 1.0; + string tmp = str; + while (parent_mp_[tmp] != tmp) { + res *= weight_mp_[tmp]; + tmp = parent_mp_[tmp]; + } + return res; + } +}; + +class Solution { +public: + vector calcEquation(vector>& equations, vector& values, vector>& queries) { + set st; + for (const auto& equation : equations) { + st.insert(equation[0]); + st.insert(equation[1]); + } + UnionSet union_set(st); + for (int i = 0; i < equations.size(); ++i) { + const string& s1 = equations[i][0]; + const string& s2 = equations[i][1]; + if (union_set.IsSameSet(s1, s2)) continue; + union_set.Union(s1, s2, values[i]); + } + vector res; + res.reserve(queries.size()); + for (const auto& query : queries) { + if (st.find(query[0]) == st.end() || st.find(query[0]) == st.end()) { + res.emplace_back(-1.0); + } else { + res.emplace_back(union_set.GetRes(query[0], query[1])); + } + } + return res; + } +}; +``` + ## 以图判树 [LeetCode中文](https://leetcode.cn/problems/graph-valid-tree/) From 706187716e78802287920285910dd0aeb13b165a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Sat, 16 Dec 2023 18:56:22 +0800 Subject: [PATCH 117/163] =?UTF-8?q?Update=20=E5=9B=BE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\345\233\276.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/LeetCode/\345\233\276.md" "b/LeetCode/\345\233\276.md" index 2dc6099..9c6fdb9 100644 --- "a/LeetCode/\345\233\276.md" +++ "b/LeetCode/\345\233\276.md" @@ -25,6 +25,8 @@ ## 除法求解 +[LeetCode中文](https://leetcode.cn/problems/evaluate-division/) + **解法**:带权值并查集 + 分子分母表达式转换 From 08931a0a8609b18f8e8fe6e70c6069bbddbcd8ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Thu, 17 Jul 2025 12:10:02 +0800 Subject: [PATCH 118/163] =?UTF-8?q?Update=20=E5=9B=9E=E6=BA=AF.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\345\233\236\346\272\257.md" | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git "a/LeetCode/\345\233\236\346\272\257.md" "b/LeetCode/\345\233\236\346\272\257.md" index 7296491..09e5074 100644 --- "a/LeetCode/\345\233\236\346\272\257.md" +++ "b/LeetCode/\345\233\236\346\272\257.md" @@ -9,11 +9,22 @@ * [将数组拆分成斐波那契序列](#将数组拆分成斐波那契序列) (`medium` `贪心`) * [解数独](#解数独) (`hard` `哈希`) * [路径总和III](#路径总和III) (`medium` `回溯` `哈希`) + * [N皇后](N皇后) (`hard` `回溯`) # 回溯法总结 +## N皇后 + +[LeetCode中文](https://leetcode.cn/problems/n-queens/) + +解法:回溯 + 状态记录 + +https://www.hello-algo.com/chapter_backtracking/n_queens_problem/ + + + ## 路径总和III [LeetCode中文](https://leetcode.cn/problems/path-sum-iii/description/) From 41063d271ad0df55ed2aa8a16ea4736e8761354b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Thu, 17 Jul 2025 12:11:02 +0800 Subject: [PATCH 119/163] =?UTF-8?q?Update=20=E5=9B=9E=E6=BA=AF.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\345\233\236\346\272\257.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/LeetCode/\345\233\236\346\272\257.md" "b/LeetCode/\345\233\236\346\272\257.md" index 09e5074..510623b 100644 --- "a/LeetCode/\345\233\236\346\272\257.md" +++ "b/LeetCode/\345\233\236\346\272\257.md" @@ -9,7 +9,7 @@ * [将数组拆分成斐波那契序列](#将数组拆分成斐波那契序列) (`medium` `贪心`) * [解数独](#解数独) (`hard` `哈希`) * [路径总和III](#路径总和III) (`medium` `回溯` `哈希`) - * [N皇后](N皇后) (`hard` `回溯`) + * [N皇后](n皇后) (`hard` `回溯`) From e1aa2585b229fcc77a77d08a5e8b1e03bd036c9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Thu, 17 Jul 2025 12:11:30 +0800 Subject: [PATCH 120/163] =?UTF-8?q?Update=20=E5=9B=9E=E6=BA=AF.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\345\233\236\346\272\257.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/LeetCode/\345\233\236\346\272\257.md" "b/LeetCode/\345\233\236\346\272\257.md" index 510623b..be6d917 100644 --- "a/LeetCode/\345\233\236\346\272\257.md" +++ "b/LeetCode/\345\233\236\346\272\257.md" @@ -9,7 +9,7 @@ * [将数组拆分成斐波那契序列](#将数组拆分成斐波那契序列) (`medium` `贪心`) * [解数独](#解数独) (`hard` `哈希`) * [路径总和III](#路径总和III) (`medium` `回溯` `哈希`) - * [N皇后](n皇后) (`hard` `回溯`) + * [N皇后](#n皇后) (`hard` `回溯`) From 8c9865a43601c45f8f65ab9bbb0c2317714e7330 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Mon, 21 Jul 2025 18:31:22 +0800 Subject: [PATCH 121/163] =?UTF-8?q?Update=20=E5=8A=A8=E6=80=81=E8=A7=84?= =?UTF-8?q?=E5=88=92.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" index 52a6e7d..0a1795b 100644 --- "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" +++ "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" @@ -4,7 +4,7 @@ * [买卖股票的最佳时机](#买卖股票的最佳时机) (`easy`) * [买卖股票的最佳时机III](#买卖股票的最佳时机III) (`hard` `分治`) * [买卖股票的最佳时机含冷冻期](#买卖股票的最佳时机含冷冻期) (`medium` `状态dp`) - * [最大子序和](#最大子序和) (`easy`) + * [最大子序和](#最大子序和) (`medium`) * [打家劫舍](#打家劫舍) (`easy`) * [打家劫舍III](#打家劫舍III) (`medium` `树形动态规划`) * [最小路径和](#最小路径和) (`medium`) From af8b9d96d936b6c38d70968a6175e1bfd7d63193 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Mon, 21 Jul 2025 18:32:01 +0800 Subject: [PATCH 122/163] =?UTF-8?q?Update=20=E5=8A=A8=E6=80=81=E8=A7=84?= =?UTF-8?q?=E5=88=92.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" index 0a1795b..c7e87a1 100644 --- "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" +++ "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" @@ -5,7 +5,7 @@ * [买卖股票的最佳时机III](#买卖股票的最佳时机III) (`hard` `分治`) * [买卖股票的最佳时机含冷冻期](#买卖股票的最佳时机含冷冻期) (`medium` `状态dp`) * [最大子序和](#最大子序和) (`medium`) - * [打家劫舍](#打家劫舍) (`easy`) + * [打家劫舍](#打家劫舍) (`medium`) * [打家劫舍III](#打家劫舍III) (`medium` `树形动态规划`) * [最小路径和](#最小路径和) (`medium`) * [不同路径](#不同路径) (`medium`) From 36c6e6678325cfa5d369f4bd887f4ba8345c04de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Wed, 23 Jul 2025 18:18:29 +0800 Subject: [PATCH 123/163] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 9a89617..343d6d7 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,7 @@ * [线段树](https://github.com/xcg1995/Code/blob/master/LeetCode/线段树.md) * [字典树](https://github.com/xcg1995/Code/blob/master/LeetCode/字典树.md) * [单调栈](https://github.com/xcg1995/Code/blob/master/LeetCode/单调栈.md) + * [前缀和]() * **算法** * [二分查找](https://github.com/xcg1995/Code/blob/master/LeetCode/二分查找.md) * [排序](https://github.com/xcg1995/Code/blob/master/LeetCode/排序.md) From 4dbafe34ff53c539b4f4d6364035519080115000 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Wed, 23 Jul 2025 18:19:06 +0800 Subject: [PATCH 124/163] =?UTF-8?q?Create=20=E5=89=8D=E7=BC=80=E5=92=8C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\345\211\215\347\274\200\345\222\214.md" | 1 + 1 file changed, 1 insertion(+) create mode 100644 "LeetCode/\345\211\215\347\274\200\345\222\214.md" diff --git "a/LeetCode/\345\211\215\347\274\200\345\222\214.md" "b/LeetCode/\345\211\215\347\274\200\345\222\214.md" new file mode 100644 index 0000000..8b13789 --- /dev/null +++ "b/LeetCode/\345\211\215\347\274\200\345\222\214.md" @@ -0,0 +1 @@ + From e80a6b0799d08f6a37f40b078ce8d977e4b39d28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Wed, 23 Jul 2025 18:19:50 +0800 Subject: [PATCH 125/163] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 343d6d7..5a8c198 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ * [线段树](https://github.com/xcg1995/Code/blob/master/LeetCode/线段树.md) * [字典树](https://github.com/xcg1995/Code/blob/master/LeetCode/字典树.md) * [单调栈](https://github.com/xcg1995/Code/blob/master/LeetCode/单调栈.md) - * [前缀和]() + * [前缀和](https://github.com/Miller-Xie/Code/blob/master/LeetCode/前缀和.md) * **算法** * [二分查找](https://github.com/xcg1995/Code/blob/master/LeetCode/二分查找.md) * [排序](https://github.com/xcg1995/Code/blob/master/LeetCode/排序.md) From 0dd054df05a20cf2960dcd039dc253b1cf819336 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Wed, 23 Jul 2025 18:22:41 +0800 Subject: [PATCH 126/163] =?UTF-8?q?Update=20=E5=89=8D=E7=BC=80=E5=92=8C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\345\211\215\347\274\200\345\222\214.md" | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git "a/LeetCode/\345\211\215\347\274\200\345\222\214.md" "b/LeetCode/\345\211\215\347\274\200\345\222\214.md" index 8b13789..f7ccfed 100644 --- "a/LeetCode/\345\211\215\347\274\200\345\222\214.md" +++ "b/LeetCode/\345\211\215\347\274\200\345\222\214.md" @@ -1 +1,35 @@ +* **数组类总结** + * [和为K的子数组](#和为K的子数组) + + +# 数组类总结 +## 和为K的子数组 + +[LeetCode中文](https://leetcode.cn/problems/subarray-sum-equals-k/description/) + +解法:哈希表 + 前缀和 + +```c++ +class Solution { +public: + int subarraySum(vector& nums, int k) { + unordered_map mp; + mp[0] = 1; + int pre = 0; + int res = 0; + for (int i = 0; i < nums.size(); i++) { + pre += nums[i]; + if (mp.find(pre - k) != mp.end()) { + res += mp[pre - k]; + } + if (mp.find(pre) != mp.end()) { + mp[pre] += 1; + } else { + mp[pre] = 1; + } + } + return res; + } +}; +``` From a27b76230cf7f898a042b5f7e003d8666bfd8bae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Wed, 23 Jul 2025 18:50:37 +0800 Subject: [PATCH 127/163] =?UTF-8?q?Update=20=E5=8A=A8=E6=80=81=E8=A7=84?= =?UTF-8?q?=E5=88=92.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...50\346\200\201\350\247\204\345\210\222.md" | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" index c7e87a1..1ccec42 100644 --- "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" +++ "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" @@ -23,9 +23,52 @@ * [最长递增子序列的个数](#最长递增子序列的个数) (`medium`) * [接雨水](#接雨水) (`hard`) * [分割等和子集](#分割等和子集) (`medium` `01背包`) + * [编辑距离](#编辑距离) (`medium` `dp`) # 动态规划总结 +## 编辑距离 + +[LeetCode中文](https://leetcode.cn/problems/edit-distance/) + +解法:动态规划 + +https://leetcode.cn/problems/edit-distance/solutions/6455/zi-di-xiang-shang-he-zi-ding-xiang-xia-by-powcai-3/ + +```c++ +class Solution { +public: + int minDistance(string word1, string word2) { + if (word1.empty()) return word2.size(); + if (word2.empty()) return word1.size(); + int len1 = word1.size(), len2 = word2.size(); + vector> dp(len1, vector(len2)); + bool flag = false; + for (int j = 0; j < len2; j++) { + if (word2[j] == word1[0]) flag = true; + if (flag) dp[0][j] = j; + else dp[0][j] = j + 1; + } + flag = false; + for (int i = 0; i < len1; ++i) { + if (word1[i] == word2[0]) flag = true; + if (flag) dp[i][0] = i; + else dp[i][0] = i + 1; + } + for (int i = 1; i < len1; i++) { + for (int j = 1; j < len2; j++) { + if (word1[i] == word2[j]) { + dp[i][j] = dp[i - 1][j - 1]; + } else { + dp[i][j] = min(min(dp[i - 1][j - 1], dp[i - 1][j]), dp[i][j - 1]) + 1; + } + } + } + return dp[len1 - 1][len2 - 1]; + } +}; +``` + ## 打家劫舍III [LeetCode中文](https://leetcode.cn/problems/house-robber-iii/solutions/47828/san-chong-fang-fa-jie-jue-shu-xing-dong-tai-gui-hu/) From e4a1295876bc19c2e26cd250f1b435a46872c198 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Fri, 25 Jul 2025 16:33:40 +0800 Subject: [PATCH 128/163] =?UTF-8?q?Update=20=E6=95=B0=E7=BB=84.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\346\225\260\347\273\204.md" | 34 ++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git "a/LeetCode/\346\225\260\347\273\204.md" "b/LeetCode/\346\225\260\347\273\204.md" index 2fd8b66..3fcc3be 100644 --- "a/LeetCode/\346\225\260\347\273\204.md" +++ "b/LeetCode/\346\225\260\347\273\204.md" @@ -23,6 +23,8 @@ * [求众数](#求众数) (`easy` `哈希`) * [多数元素](#多数元素) (`medium` `摩尔投票`) * [有效的数独](#有效的数独) (`medium` `哈希`) + * **滑动窗口** + * [长度最小的子数组](#长度最小的子数组) (`medium`) * **其他** * [杨辉三角](#杨辉三角) (`easy` `迭代`) * [缺失数字](#缺失数字) (`easy` `位运算` `数学`) @@ -36,6 +38,38 @@ # 数组类总结 +## 长度最小的子数组 + +[LeetCode中文](https://leetcode.cn/problems/minimum-size-subarray-sum/description/) + +题解:滑动串口,注意边界值 + +```c++ +class Solution { +public: + int minSubArrayLen(int target, vector& nums) { + if (nums.empty()) return 0; + int l = 0, r = 0, tmp = 0; + int res = INT_MAX; + while (l <= r && r <= nums.size()) { + if (tmp < target) { + if (r < nums.size()) tmp += nums[r]; + r++; + continue; + } else { + res = min(res, r - l); + while (l <= r && tmp >= target) { + res = min(res, r - l); + tmp = tmp - nums[l]; + l++; + } + } + } + return res == INT_MAX ? 0 : res; + } +}; +``` + ## 数组中重复的数字 [LeetCode中文](https://leetcode.cn/problems/find-all-duplicates-in-an-array/description/) From d95a6f8e3160d5a6aaf8ea40de0263c862e2c2c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Fri, 25 Jul 2025 17:21:48 +0800 Subject: [PATCH 129/163] =?UTF-8?q?Update=20=E5=9B=9E=E6=BA=AF.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\345\233\236\346\272\257.md" | 54 ++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git "a/LeetCode/\345\233\236\346\272\257.md" "b/LeetCode/\345\233\236\346\272\257.md" index be6d917..d2faaa2 100644 --- "a/LeetCode/\345\233\236\346\272\257.md" +++ "b/LeetCode/\345\233\236\346\272\257.md" @@ -10,11 +10,65 @@ * [解数独](#解数独) (`hard` `哈希`) * [路径总和III](#路径总和III) (`medium` `回溯` `哈希`) * [N皇后](#n皇后) (`hard` `回溯`) + * [分割回文串](#分割回文串) (`medium` `dp`) # 回溯法总结 +## 分割回文串 + +[LeetCode中文](https://leetcode.cn/problems/palindrome-partitioning/) + +解法:回溯 + 动态规划 + +设dp[i][j]代表i到j的字符串是否回文 + +d = 1, dp[i][j] = true +d =2, dp[i][j] = (s[i] == s[j]) +d > 2, dp[i][j] = dp[i + 1][j - 1] && (s[i] == s[j]) + +然后进行回溯,每一层递归选择下一步分割的位置,到结尾时记录当前dfs的结果 + +```c++ +class Solution { +public: + void recursion(const vector>& dp, const string& s, int start, vector>& res, vector& tmp) { + if (start >= s.size()) { + res.push_back(tmp); + return; + } + for (int i = start; i < s.size(); i++) { + if (dp[start][i]) { + tmp.push_back(s.substr(start, i - start + 1)); + recursion(dp, s, i + 1, res, tmp); + tmp.pop_back(); + } + } + } + vector> partition(string s) { + int len = s.size(); + vector> dp(len, vector(len, false)); + for (int i = 0; i < len; i++) { + dp[i][i] = true; + } + for (int d = 2; d <= len; d++) { + for (int i = 0; i + d - 1 < len; i++) { + int j = i + d - 1; + if (d == 2) dp[i][j] = s[i] == s[j]; + else { + dp[i][j] = dp[i + 1][j - 1] && (s[i] == s[j]); + } + } + } + vector> res; + vector tmp; + recursion(dp, s, 0, res, tmp); + return res; + } +}; +``` + ## N皇后 [LeetCode中文](https://leetcode.cn/problems/n-queens/) From b359af37d2aad85d49e1897822275e65af42a183 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Fri, 25 Jul 2025 18:01:56 +0800 Subject: [PATCH 130/163] =?UTF-8?q?Update=20=E5=8A=A8=E6=80=81=E8=A7=84?= =?UTF-8?q?=E5=88=92.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...50\346\200\201\350\247\204\345\210\222.md" | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" index 1ccec42..afb075f 100644 --- "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" +++ "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" @@ -24,9 +24,51 @@ * [接雨水](#接雨水) (`hard`) * [分割等和子集](#分割等和子集) (`medium` `01背包`) * [编辑距离](#编辑距离) (`medium` `dp`) + * [完全平方数](完全平方数) (`medium` `dp` `记忆化`) # 动态规划总结 +## 完全平方数 + +[LeetCode中文](https://leetcode.cn/problems/perfect-squares/description/) + +解法:动态规划 + 记忆化 + +先用bool数组flag记录1~n范围内的数字是否为完全平方数 + +设dp[i]代表和为数字i的完全平方数的最小数量 + +如果flag[i] = true, dp[i] = 1 +否则,dp[i] = min(dp[i - j * j] + 1, j * j <= i) + +```c++ +class Solution { +public: + int numSquares(int n) { + if (n <= 1) return n; + vector flag(n + 1, false); + for (int i = 1; i * i <= n; i++) { + flag[i * i] = true; + } + vector dp(n + 1, INT_MAX); + dp[0] = 0; + dp[1] = 1; + for (int i = 2; i <= n; i++) { + if (flag[i]) { + dp[i] = 1; + continue; + } + for (int j = 1; j * j <= i; j++) { + if (dp[i - j * j] != INT_MAX) { + dp[i] = min(dp[i], dp[i - j * j] + 1); + } + } + } + return dp[n]; + } +}; +``` + ## 编辑距离 [LeetCode中文](https://leetcode.cn/problems/edit-distance/) From 3823e787cfb77159da7ddcd4ec768c9b472df59e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Fri, 25 Jul 2025 18:02:27 +0800 Subject: [PATCH 131/163] =?UTF-8?q?Update=20=E5=8A=A8=E6=80=81=E8=A7=84?= =?UTF-8?q?=E5=88=92.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" index afb075f..de79163 100644 --- "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" +++ "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" @@ -24,7 +24,7 @@ * [接雨水](#接雨水) (`hard`) * [分割等和子集](#分割等和子集) (`medium` `01背包`) * [编辑距离](#编辑距离) (`medium` `dp`) - * [完全平方数](完全平方数) (`medium` `dp` `记忆化`) + * [完全平方数](#完全平方数) (`medium` `dp` `记忆化`) # 动态规划总结 From 703c688914ec53f1b76999e96967a89260b1c120 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Tue, 29 Jul 2025 17:41:29 +0800 Subject: [PATCH 132/163] =?UTF-8?q?Update=20=E9=80=92=E5=BD=92.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\351\200\222\345\275\222.md" | 45 ++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git "a/LeetCode/\351\200\222\345\275\222.md" "b/LeetCode/\351\200\222\345\275\222.md" index 1def9fe..ff547dd 100644 --- "a/LeetCode/\351\200\222\345\275\222.md" +++ "b/LeetCode/\351\200\222\345\275\222.md" @@ -1,5 +1,5 @@ * **递归总结** - * [字符串解码](#字符串解码) + * [字符串解码](#字符串解码) (`递归` `回溯`) # 递归总结 @@ -9,6 +9,47 @@ [LeetCode中文](https://leetcode.cn/problems/decode-string/description/) -```c++ +```c++ +class Solution { +public: + string recursion(const string& s, int idx) { + if (idx >= s.size()) return ""; + stack> sta; + string res; + while (idx < s.size()) { + if (s[idx] >= '1' && s[idx] <= '9') { + int a = 0; + while (idx < s.size() && (s[idx] >= '0' && s[idx] <= '9')) { + a = a * 10 + (s[idx] - '0'); + idx++; + } + if (s[idx] == '[') { + sta.push({res, a}); + idx++; + res = ""; + } + } else if (s[idx] == ']') { + auto pr = sta.top(); + sta.pop(); + idx++; + string tmp = pr.first; + for (int i = 0; i < pr.second; i++) { + tmp += res; + } + res = tmp; + } else if (s[idx] >= 'a' && s[idx] <= 'z') { + while (idx < s.size() && (s[idx] >= 'a' && s[idx] <= 'z')) { + res += s[idx]; + idx++; + } + } + } + return res; + } + string decodeString(string s) { + int idx = 0; + return recursion(s, idx); + } +}; ``` From 19174031e898df324424540809bb0422170b2cfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Wed, 30 Jul 2025 19:23:28 +0800 Subject: [PATCH 133/163] =?UTF-8?q?Update=20=E5=8A=A8=E6=80=81=E8=A7=84?= =?UTF-8?q?=E5=88=92.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...50\346\200\201\350\247\204\345\210\222.md" | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" index de79163..241577d 100644 --- "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" +++ "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" @@ -25,9 +25,47 @@ * [分割等和子集](#分割等和子集) (`medium` `01背包`) * [编辑距离](#编辑距离) (`medium` `dp`) * [完全平方数](#完全平方数) (`medium` `dp` `记忆化`) + * [单词拆分](#单词拆分) (`medium` `dp` `记忆化`) # 动态规划总结 +## 单词拆分 + +[LeetCode中文](https://leetcode.cn/problems/word-break/) + +解答:动态规划 + 记忆化 + +用一个set记录所有的单词 + +设dp[i]代表0~i的字串能否被字典中的单词拼接 + +dp[i] = dp[j] 且 单词s.substr(j + 1, i - j)在set中, 0 <= j < i + + +```c++ +class Solution { +public: + bool wordBreak(string s, vector& wordDict) { + unordered_set st; + for (const auto& a : wordDict) { + st.insert(a); + } + int len = s.size(); + vector dp(len + 1, false); + dp[0] = true; + for (int i = 1; i <= len; ++i) { + for (int j = 0; j <= i - 1; ++j) { + if (dp[j] && st.find(s.substr(j, i - j)) != st.end()) { + dp[i] = true; + break; + } + } + } + return dp[len]; + } +}; +``` + ## 完全平方数 [LeetCode中文](https://leetcode.cn/problems/perfect-squares/description/) From 58efb2e05c3c8881b00c7a097dd6246582d601e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Thu, 31 Jul 2025 12:28:17 +0800 Subject: [PATCH 134/163] =?UTF-8?q?Update=20=E9=93=BE=E8=A1=A8.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\351\223\276\350\241\250.md" | 56 ++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git "a/LeetCode/\351\223\276\350\241\250.md" "b/LeetCode/\351\223\276\350\241\250.md" index 377ae3d..46864e4 100644 --- "a/LeetCode/\351\223\276\350\241\250.md" +++ "b/LeetCode/\351\223\276\350\241\250.md" @@ -1,5 +1,6 @@ * **链表类总结** * [反转链表](#反转链表) (`easy` `三指针` `dummy节点`) + * [反转链表II](#反转链表II) (`medium` `双指针`) * [合并两个有序链表](#合并两个有序链表) (`easy` `双指针`) * [删除排序链表中的重复元素](#删除排序链表中的重复元素) (`easy` `双指针`) * [回文链表](#回文链表) (`easy` `反转链表`) @@ -16,6 +17,61 @@ # 链表类总结 + +## 反转链表II + +[LeetCode中文](https://leetcode.cn/problems/reverse-linked-list-ii/) + +```c++ +/** + * Definition for singly-linked list. + * struct ListNode { + * int val; + * ListNode *next; + * ListNode() : val(0), next(nullptr) {} + * ListNode(int x) : val(x), next(nullptr) {} + * ListNode(int x, ListNode *next) : val(x), next(next) {} + * }; + */ +class Solution { +public: + ListNode* reverseBetween(ListNode* head, int left, int right) { + ListNode *l_pre = nullptr, *r_next = nullptr, *l_p, *r_p; + ListNode* p = head; + int idx = 1; + while (p) { + if (idx == left) { + l_p = p; + } + if (idx + 1 == left) { + l_pre = p; + } + if (idx == right) { + r_p = p; + r_next = p->next; + break; + } + p = p->next; + idx++; + } + if (!l_p || !r_p) return head; + ListNode *pre = r_next, *cur = l_p, *next = nullptr; + while (pre != r_p) { + next = cur->next; + cur->next = pre; + pre = cur; + cur = next; + } + if (l_pre) { + l_pre->next = pre; + return head; + } + return pre; + } +}; +``` + + ## 反转链表 [LeetCode中文](https://leetcode-cn.com/problems/reverse-linked-list/) From 020997f07b779e8dd80b0251c3eb23f8ddfc3dad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Mon, 4 Aug 2025 12:10:25 +0800 Subject: [PATCH 135/163] =?UTF-8?q?Update=20=E5=8A=A8=E6=80=81=E8=A7=84?= =?UTF-8?q?=E5=88=92.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...50\346\200\201\350\247\204\345\210\222.md" | 46 ++++++++++++++++++- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" index 241577d..81ea92c 100644 --- "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" +++ "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" @@ -4,7 +4,8 @@ * [买卖股票的最佳时机](#买卖股票的最佳时机) (`easy`) * [买卖股票的最佳时机III](#买卖股票的最佳时机III) (`hard` `分治`) * [买卖股票的最佳时机含冷冻期](#买卖股票的最佳时机含冷冻期) (`medium` `状态dp`) - * [最大子序和](#最大子序和) (`medium`) + * [最大子数组和](#最大子数组和) (`medium`) + * [乘积最大子数组](#乘积最大子数组) (`medium`) * [打家劫舍](#打家劫舍) (`medium`) * [打家劫舍III](#打家劫舍III) (`medium` `树形动态规划`) * [最小路径和](#最小路径和) (`medium`) @@ -29,6 +30,47 @@ # 动态规划总结 +## 乘积最大子数组 + +[LeetCode中文](https://leetcode.cn/problems/maximum-product-subarray/description/) + +题解:动态规划 + +设以nums[i]结尾的子数组最大乘积是dp[i][0],最小乘积是dp[i][1],动态转移方程如下: + +if nums[i] >= 0: + dp[i][0] = max(dp[i][0] * nums[i], nums[i]) + dp[i][1] = min(dp[i][1] * nums[i], nums[i]) +if nums[i] < 0: + dp[i][0] = max(dp[i][1] * nums[i], nums[i]) + dp[i][1] = min(dp[i][0] * nums[i], nums[i]) + +**注意**: nums[i] < 0的时候,状态转移的过程中最小值和最大值回交替使用,需要用tmp暂存某一个值防止被覆盖 + +```c++ +class Solution { +public: + int maxProduct(vector& nums) { + int len = nums.size(); + if (len == 0) return 0; + int imax = nums[0], imin = nums[0]; + int res = imax; + for (int i = 1; i < len; i++) { + if (nums[i] >= 0) { + imax = max(imax * nums[i], nums[i]); + imin = min(imin * nums[i], nums[i]); + } else { + int tmp = imax; + imax = max(imin * nums[i], nums[i]); + imin = min(tmp * nums[i], nums[i]); + } + res = max(imax, res); + } + return res; + } +}; +``` + ## 单词拆分 [LeetCode中文](https://leetcode.cn/problems/word-break/) @@ -467,7 +509,7 @@ class Solution: -## 最大子序和 +## 最大子数组和 [LeetCode中文](https://leetcode-cn.com/problems/maximum-subarray) From 39dc60d5e92cc28be34dc1a9b7ec171d85fbab71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Mon, 4 Aug 2025 12:11:01 +0800 Subject: [PATCH 136/163] =?UTF-8?q?Update=20=E5=8A=A8=E6=80=81=E8=A7=84?= =?UTF-8?q?=E5=88=92.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" index 81ea92c..ac35fa0 100644 --- "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" +++ "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" @@ -40,9 +40,12 @@ if nums[i] >= 0: dp[i][0] = max(dp[i][0] * nums[i], nums[i]) + dp[i][1] = min(dp[i][1] * nums[i], nums[i]) + if nums[i] < 0: dp[i][0] = max(dp[i][1] * nums[i], nums[i]) + dp[i][1] = min(dp[i][0] * nums[i], nums[i]) **注意**: nums[i] < 0的时候,状态转移的过程中最小值和最大值回交替使用,需要用tmp暂存某一个值防止被覆盖 From 413a0f2402473c55e9afc5ffe6bac30e716d7f42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Mon, 4 Aug 2025 12:11:26 +0800 Subject: [PATCH 137/163] =?UTF-8?q?Update=20=E5=8A=A8=E6=80=81=E8=A7=84?= =?UTF-8?q?=E5=88=92.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\345\212\250\346\200\201\350\247\204\345\210\222.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" index ac35fa0..3862648 100644 --- "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" +++ "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" @@ -38,15 +38,15 @@ 设以nums[i]结尾的子数组最大乘积是dp[i][0],最小乘积是dp[i][1],动态转移方程如下: +``` if nums[i] >= 0: dp[i][0] = max(dp[i][0] * nums[i], nums[i]) - dp[i][1] = min(dp[i][1] * nums[i], nums[i]) if nums[i] < 0: dp[i][0] = max(dp[i][1] * nums[i], nums[i]) - dp[i][1] = min(dp[i][0] * nums[i], nums[i]) +``` **注意**: nums[i] < 0的时候,状态转移的过程中最小值和最大值回交替使用,需要用tmp暂存某一个值防止被覆盖 From c3a2084d973179b193b1102c0a9eac0c62d99bb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Wed, 6 Aug 2025 18:48:37 +0800 Subject: [PATCH 138/163] =?UTF-8?q?Update=20=E5=9B=9E=E6=BA=AF.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\345\233\236\346\272\257.md" | 43 ++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git "a/LeetCode/\345\233\236\346\272\257.md" "b/LeetCode/\345\233\236\346\272\257.md" index d2faaa2..cd3084c 100644 --- "a/LeetCode/\345\233\236\346\272\257.md" +++ "b/LeetCode/\345\233\236\346\272\257.md" @@ -4,6 +4,7 @@ * [括号生成](#括号生成) (`medium`) * [电话号码的字母组合](#电话号码的字母组合) (`medium`) * [全排列](#全排列) (`medium`) + * [全排列II](#全排列II) (`medium`) * [格雷编码](#格雷编码) (`medium`) * [累加数](#累加数) (`medium`) * [将数组拆分成斐波那契序列](#将数组拆分成斐波那契序列) (`medium` `贪心`) @@ -16,6 +17,48 @@ # 回溯法总结 +## 全排列II + +[LeetCode中文](https://leetcode.cn/problems/permutations-ii/description/) + +详细题解:https://leetcode.cn/problems/permutations-ii/solutions/71776/hot-100-47quan-pai-lie-ii-python3-hui-su-kao-lu-zh + +回溯 + 剪枝 +image + +```c++ +class Solution { +public: + void dfs(const vector& nums, vector>& res, vector& tmp, vector& vis, int n) { + if (n >= nums.size()) { + res.push_back(tmp); + return; + } + for (int i = 0; i < nums.size(); i++) { + if (i > 0 && nums[i] == nums[i - 1] && !vis[i - 1]) { + continue; + } + if (!vis[i]) { + tmp.push_back(nums[i]); + vis[i] = true; + dfs(nums, res, tmp, vis, n + 1); + tmp.pop_back(); + vis[i] = false; + } + } + } + vector> permuteUnique(vector& nums) { + sort(nums.begin(), nums.end()); + vector vis(nums.size(), false); + vector> res; + vector tmp; + dfs(nums, res, tmp, vis, 0); + return res; + } +}; +``` + + ## 分割回文串 [LeetCode中文](https://leetcode.cn/problems/palindrome-partitioning/) From 899a3a1ff3e145e5908081b6a6b8e23abca066cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Fri, 8 Aug 2025 18:34:27 +0800 Subject: [PATCH 139/163] =?UTF-8?q?Update=20=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 --- .../\345\255\227\347\254\246\344\270\262.md" | 48 ++++++++----------- 1 file changed, 19 insertions(+), 29 deletions(-) diff --git "a/LeetCode/\345\255\227\347\254\246\344\270\262.md" "b/LeetCode/\345\255\227\347\254\246\344\270\262.md" index a4114a3..a086a96 100644 --- "a/LeetCode/\345\255\227\347\254\246\344\270\262.md" +++ "b/LeetCode/\345\255\227\347\254\246\344\270\262.md" @@ -115,37 +115,27 @@ public: class Solution { public: vector findAnagrams(string s, string p) { - unordered_map window, need; - for (const char& ch : p) { - need[ch]++; - } - int l = 0, r = 0; - int valid = 0; - vector res; - while (r < s.size()) { - char c = s[r]; - if (need.find(c) != need.end()) { - window[c]++; - if (need[c] == window[c]) { - valid++; - } - } - while (r - l + 1 > p.size()) { - char a = s[l]; - if (need.find(a) != need.end()) { - if (window[a] == need[a]) { - valid--; + unordered_map window, need; + for (auto ch : p) { + need[ch]++; + } + vector res; + int l = 0, r = 0; + int len = s.size(); + while (r < len) { + window[s[r++]]++; + while (r - l > p.size()) { + window[s[l]]--; + if (window[s[l]] == 0) { + window.erase(s[l]); } - window[a]--; + l++; } - l++; - } - if (valid == need.size()) { + if (window == need) { res.push_back(l); - } - ++r; - } - return res; + } + } + return res; } }; ``` @@ -1464,7 +1454,7 @@ public: #### 方法2 -跳出全排列的思维定势,只需要遍历`s2`,然后每当遇到在`s1`中的字母时,以这个字母位置开始从`s2`截取与`s1`同等长度的字符串,和`s1`比较是否为同一个全排列组。而比较两个字符串是否为同一个排列,可以用哈希表,记录下两个字符串中字母的出现次数然后逐个字母进行比较。同时利用滑动窗口的思想,在遍历`s2`的过程中,**动态**地改变从`s2`截取的字符串对应的哈希表`hash1`,每遍历一个新的字母,就在`hash`中将它的次数加一,由于窗口大小限制为`s1`的长度,那么此时窗口左侧的字母在`hash`中的次数就需要减一,然后和`s1`对应的哈希表`hash`比较,如果相等,则返回`true`;否则,继续遍历下一个字母。如果遍历结束都没有发现相同的哈希表,那么返回`false`。 +滑动串口,和 [找到字符串中所有字母异位词](#找到字符串中所有字母异位词) 解法完全一样 设`s1`的长度为*m*,`s2`的长度为*n* From c9f9b550f9c389ce08e079ae5e306b7063d711fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Fri, 8 Aug 2025 19:13:50 +0800 Subject: [PATCH 140/163] =?UTF-8?q?Update=20=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 --- .../\345\255\227\347\254\246\344\270\262.md" | 83 +++++-------------- 1 file changed, 19 insertions(+), 64 deletions(-) diff --git "a/LeetCode/\345\255\227\347\254\246\344\270\262.md" "b/LeetCode/\345\255\227\347\254\246\344\270\262.md" index a086a96..db09ea3 100644 --- "a/LeetCode/\345\255\227\347\254\246\344\270\262.md" +++ "b/LeetCode/\345\255\227\347\254\246\344\270\262.md" @@ -1324,18 +1324,9 @@ public: 思路:滑动窗口 + hash表 -首先使用一个`map`统计字符串`t`中每个字符出现的次数,要解决这个问题,就是要找到`s`的子串中,包含所有`map`中的字符,并且字符出现次数大于等于该字符在`map`中计数的子串。满足要求的最短子串就是答案。 +直接套用通用模板,非常easy -使用一个变量`cnt`记录字符串`t`的长度,这个长度将用于判断滑动窗口中是否包含所有`t`中的字符。使用一个变量`min`表示满足要求的子串的最小长度,一个变量`start`表示该子串的起始下标。我们按如下假设遍历s进行处理: - -1. 当遇到一个`t`中的字符时,将其`map`中的计数减1(可能小于0,因为s中可能包含多个这样的字符),同时判断: - 1. 如果减1之前计数大于0,说明这个字符应该含入滑动窗口中,此时`cnt`减1; - 2. 如果减1之前计数小于等于0,说明这个字符在s中出现了很多次,此时`cnt`不变; -2. 当遇到一个不在t中出现的字符时,跳过。 - -显然,当`cnt`为0时,我们找到了一个满足要求的滑动窗口,这个滑动窗口中,包含了所有`t`中的字符。因此,我们比较这个滑动窗口的长度与`min`的值,如果小于`min`,说明找到了一个新的滑动窗口,因此更新`min`和`start`。 - -既然当`cnt`为0时,找到了一个满足要求的滑动窗口,那么下一步该怎么做?注意到我们找到的第一个滑动窗口是位于最左边,此时`map`中一些字符的计数可能小于0,因为`t`中的某些字符在该滑动窗口中出现了很多次。此时我们从左边开始释放字符,目的是希望在右边能找到一个新的相同字符,从而得到一个新的满足要求的滑动窗口。但是从左边开始,第一个在`t`中的字符可能是一个冗余的字符(即`map`中的计数小于0),因此释放了这个字符后,滑动窗口中还是拥有满足条件的字符,那么此时回收应该只增加其在`map`中的计数,但是不需要从右边开始滑动窗口(即不增加`cnt`)。因此,只有当遇到一个在`t`中,并且`map`中计数为0的字符,才需要将`cnt`加1。因为`map`计数为0说明滑动窗口中这个字符的数量“恰好”满足要求,因此可以开始从右边滑动窗口,也就是说,我们还应该从右边找到1个这样字符,使得`map`中其计数递减后,又变为0。 +https://leetcode.cn/problems/find-all-anagrams-in-a-string/solutions/9749/hua-dong-chuang-kou-tong-yong-si-xiang-jie-jue-zi- 设字符串s的长度为m,字符串t的长度为n,那么: @@ -1345,64 +1336,28 @@ public: ```c++ class Solution { public: - string minWindow(string s, string t) { - map mp; - for(auto ch : t) - { - ++mp[ch]; + vector findAnagrams(string s, string p) { + unordered_map window, need; + for (auto ch : p) { + need[ch]++; } - - int m = s.size(); - int n = t.size(); - if(m < n) return ""; - - int cnt = n; - int start = 0,idx = 0,Min = INT_MAX,len = 0; - bool flag = false; - for(int i=0;i 0) - { - --cnt; + vector res; + int l = 0, r = 0; + int len = s.size(); + while (r < len) { + window[s[r++]]++; + while (r - l > p.size()) { + window[s[l]]--; + if (window[s[l]] == 0) { + window.erase(s[l]); } - --mp[ch]; + l++; } - - while(cnt == 0) - { - len = i-idx+1; - if(Min > len) - { - start = idx; - Min = len; - } - - char ch1 = s[idx]; - if(mp.find(ch1) != mp.end()) - { - if(mp[ch1] >= 0) - { - cnt++; - } - - mp[ch1]++; - } - - idx++; + if (window == need) { + res.push_back(l); } - } - - return Min == INT_MAX ? "" : s.substr(start,Min); + return res; } }; ``` From 0d2274ed0c4c3da20c736131a29c83f83b9a471c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Mon, 11 Aug 2025 10:42:52 +0800 Subject: [PATCH 141/163] =?UTF-8?q?Update=20=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 --- .../\345\255\227\347\254\246\344\270\262.md" | 85 ++++++------------- 1 file changed, 24 insertions(+), 61 deletions(-) diff --git "a/LeetCode/\345\255\227\347\254\246\344\270\262.md" "b/LeetCode/\345\255\227\347\254\246\344\270\262.md" index db09ea3..8635103 100644 --- "a/LeetCode/\345\255\227\347\254\246\344\270\262.md" +++ "b/LeetCode/\345\255\227\347\254\246\344\270\262.md" @@ -33,75 +33,38 @@ https://leetcode.cn/problems/substring-with-concatenation-of-all-words/solutions class Solution { public: vector findSubstring(string s, vector& words) { - vector res; - if (words.empty()) return res; - int w_len = words[0].size(), n = words.size(), len = s.size(); - unordered_map mp; - unordered_map mp2; - for (const auto& word : words) { - ++mp[word]; - } - for (int i = 0; i <= len - w_len; ++i) { - mp2[i] = s.substr(i, w_len); + if (words.empty() || s.empty()) return {}; + int d = words[0].size(), total = words.size() * d; + unordered_map need; + for (auto word : words) { + need[word]++; } - for (int i = 0; i < w_len && i <= len - w_len * n; ++i) { - unordered_map mp1; - int l = i; - int r = i; - int valid = 0; - while (r <= len - w_len) { - auto tmp = mp2[r]; - if (mp.find(tmp) == mp.end()) { - l = r + w_len; - r = l; - mp1.clear(); - valid = 0; - continue; - } else { - ++mp1[tmp]; - if (mp1[tmp] == mp[tmp]) { - ++valid; - } - if (mp1[tmp] > mp[tmp]) { - r += w_len; - while (l < r && mp1[tmp] > mp[tmp]) { - const auto& tmp1 = mp2[l]; - if (tmp1 != tmp && mp[tmp1] == mp1[tmp1]) { - --valid; - } - --mp1[tmp1]; - // if (tmp == tmp1 && mp[tmp1] == mp1[tmp1]) { - // ++valid; - // } - if (mp1[tmp1] == 0) { - mp1.erase(tmp1); - } - l += w_len; - } - continue; + int len = s.size(); + vector res; + int start = 0; + while (start < d) { + int l = start, r = start; + unordered_map window; + while (r < len) { + window[s.substr(r, d)]++; + r += d; + while (r - l > total) { + string w = s.substr(l, d); + window[w]--; + if (window[w] == 0) { + window.erase(w); } + l += d; } - r += w_len; - while (r - l == w_len * n) { - if (valid == mp.size()) { - res.push_back(l); - } - const auto& tmp1 = mp2[l]; - if (mp.find(tmp1) != mp.end() && mp[tmp1] == mp1[tmp1]) { - --valid; - } - --mp1[tmp1]; - if (mp1[tmp1] == 0) { - mp1.erase(tmp1); - } - l += w_len; + if (window == need) { + res.push_back(l); } } + start++; } return res; } - unordered_map mp; - unordered_map mp1; +}; }; ``` From b33acd7994e09481a85f926cc3f175597dffb755 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Tue, 12 Aug 2025 18:49:43 +0800 Subject: [PATCH 142/163] =?UTF-8?q?Update=20=E8=B4=AA=E5=BF=83.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\350\264\252\345\277\203.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/LeetCode/\350\264\252\345\277\203.md" "b/LeetCode/\350\264\252\345\277\203.md" index 05c2d78..fe389e2 100644 --- "a/LeetCode/\350\264\252\345\277\203.md" +++ "b/LeetCode/\350\264\252\345\277\203.md" @@ -11,7 +11,7 @@ * [根据身高重建队列](#根据身高重建队列) (`medium`) * [救生艇](#救生艇) (`medium`) * [用最少数量的箭引爆气球](#用最少数量的箭引爆气球) (`medium`) - * [移掉K位数字](#移掉K位数字) (`medium`) + * [移掉K位数字](#移掉K位数字) (`medium` `单调栈`) * [无重叠区间](#无重叠区间) (`medium`) * [加油站](#加油站) (`medium`) * [判断一个括号字符串是否有效](#判断一个括号字符串是否有效) (`medium`) From febf9785664c7d0e111587b69f5d427c0195d201 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Wed, 13 Aug 2025 10:28:35 +0800 Subject: [PATCH 143/163] =?UTF-8?q?Update=20=E8=B4=AA=E5=BF=83.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\350\264\252\345\277\203.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/LeetCode/\350\264\252\345\277\203.md" "b/LeetCode/\350\264\252\345\277\203.md" index fe389e2..635d743 100644 --- "a/LeetCode/\350\264\252\345\277\203.md" +++ "b/LeetCode/\350\264\252\345\277\203.md" @@ -15,7 +15,7 @@ * [无重叠区间](#无重叠区间) (`medium`) * [加油站](#加油站) (`medium`) * [判断一个括号字符串是否有效](#判断一个括号字符串是否有效) (`medium`) - * [去除重复字母](#去除重复字母) (`贪心` `哈希`) + * [去除重复字母](#去除重复字母) (`贪心` `哈希` `单调栈`) # 贪心总结 From b46f94e2592ac70e20c720ef546efde648f5c839 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Wed, 13 Aug 2025 10:29:10 +0800 Subject: [PATCH 144/163] =?UTF-8?q?Update=20=E5=8D=95=E8=B0=83=E6=A0=88.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\345\215\225\350\260\203\346\240\210.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/LeetCode/\345\215\225\350\260\203\346\240\210.md" "b/LeetCode/\345\215\225\350\260\203\346\240\210.md" index 84d654b..e13661e 100644 --- "a/LeetCode/\345\215\225\350\260\203\346\240\210.md" +++ "b/LeetCode/\345\215\225\350\260\203\346\240\210.md" @@ -1,7 +1,7 @@ * **单调栈总结** * [每日温度](#每日温度) (`medium`) * [柱状图中最大的矩形](#柱状图中最大的矩形) (`hard`) - * [去除重复字母](https://github.com/Miller-Xie/Code/blob/master/LeetCode/%E8%B4%AA%E5%BF%83.md#%E5%8E%BB%E9%99%A4%E9%87%8D%E5%A4%8D%E5%AD%97%E6%AF%8D) (`hard` `贪心`) + * [去除重复字母]([https://github.com/Miller-Xie/Code/blob/master/LeetCode/%E8%B4%AA%E5%BF%83.md#%E5%8E%BB%E9%99%A4%E9%87%8D%E5%A4%8D%E5%AD%97%E6%AF%8D](https://github.com/Miller-Xie/Code/blob/master/LeetCode/%E8%B4%AA%E5%BF%83.md#%E5%8E%BB%E9%99%A4%E9%87%8D%E5%A4%8D%E5%AD%97%E6%AF%8D)) (`hard` `贪心`) # 单调栈总结 From 6651886ed56d07ab4ce5c325c1f796265af68ba3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Wed, 13 Aug 2025 10:29:34 +0800 Subject: [PATCH 145/163] =?UTF-8?q?Update=20=E5=8D=95=E8=B0=83=E6=A0=88.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\345\215\225\350\260\203\346\240\210.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/LeetCode/\345\215\225\350\260\203\346\240\210.md" "b/LeetCode/\345\215\225\350\260\203\346\240\210.md" index e13661e..84d654b 100644 --- "a/LeetCode/\345\215\225\350\260\203\346\240\210.md" +++ "b/LeetCode/\345\215\225\350\260\203\346\240\210.md" @@ -1,7 +1,7 @@ * **单调栈总结** * [每日温度](#每日温度) (`medium`) * [柱状图中最大的矩形](#柱状图中最大的矩形) (`hard`) - * [去除重复字母]([https://github.com/Miller-Xie/Code/blob/master/LeetCode/%E8%B4%AA%E5%BF%83.md#%E5%8E%BB%E9%99%A4%E9%87%8D%E5%A4%8D%E5%AD%97%E6%AF%8D](https://github.com/Miller-Xie/Code/blob/master/LeetCode/%E8%B4%AA%E5%BF%83.md#%E5%8E%BB%E9%99%A4%E9%87%8D%E5%A4%8D%E5%AD%97%E6%AF%8D)) (`hard` `贪心`) + * [去除重复字母](https://github.com/Miller-Xie/Code/blob/master/LeetCode/%E8%B4%AA%E5%BF%83.md#%E5%8E%BB%E9%99%A4%E9%87%8D%E5%A4%8D%E5%AD%97%E6%AF%8D) (`hard` `贪心`) # 单调栈总结 From b4505940a05db833c4855165caf1a33690ed7f70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Wed, 13 Aug 2025 10:31:46 +0800 Subject: [PATCH 146/163] =?UTF-8?q?Update=20=E8=B4=AA=E5=BF=83.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\350\264\252\345\277\203.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/LeetCode/\350\264\252\345\277\203.md" "b/LeetCode/\350\264\252\345\277\203.md" index 635d743..b2d967a 100644 --- "a/LeetCode/\350\264\252\345\277\203.md" +++ "b/LeetCode/\350\264\252\345\277\203.md" @@ -28,6 +28,8 @@ https://leetcode.cn/problems/remove-duplicate-letters/solutions/290200/yi-zhao-chi-bian-li-kou-si-dao-ti-ma-ma-zai-ye-b-4/ +和 [移掉K位数字](#移掉K位数字) 思路很相似,主要区别是需要考虑重复元素,在从左往右遍历的时候,如果当前元素cur已经在stack中存在,直接丢弃 + ```c++ class Solution { public: From b17b4267446ee5358e1d7c09ef5797238db38972 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Thu, 14 Aug 2025 11:22:54 +0800 Subject: [PATCH 147/163] =?UTF-8?q?Update=20=E8=B4=AA=E5=BF=83.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\350\264\252\345\277\203.md" | 37 ++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git "a/LeetCode/\350\264\252\345\277\203.md" "b/LeetCode/\350\264\252\345\277\203.md" index b2d967a..bf5aeaa 100644 --- "a/LeetCode/\350\264\252\345\277\203.md" +++ "b/LeetCode/\350\264\252\345\277\203.md" @@ -6,6 +6,7 @@ * [任务调度器](#任务调度器) (`medium`) * [分割数组为连续子序列](#分割数组为连续子序列) (`medium`) * [跳跃游戏](#跳跃游戏) (`medium` `动态规划`) + * [跳跃游戏II](#跳跃游戏II) (`medium` `贪心`) * [使数组唯一的最大增量](#使数组唯一的最大增量) (`medium` ) * [分发糖果](#分发糖果) (`hard`) * [根据身高重建队列](#根据身高重建队列) (`medium`) @@ -20,6 +21,42 @@ # 贪心总结 +## 跳跃游戏II + +[LeetCode中文](https://leetcode.cn/problems/jump-game-ii/description/) + +题解:和 [跳跃游戏](#跳跃游戏) 贪心方法类似,但是需要选择下一步的位置,来保证走得最远,在走的过程中记录步数 + +```c++ +class Solution { +public: + int jump(vector& nums) { + if (nums.size() <= 1) return 0; + int len = nums.size(); + int Max = 0 + nums[0]; + if (Max >= len - 1) return 1; + int step = 0; + int idx = 0; + while (idx < len) { + int end = idx + nums[idx]; + for (int i = idx + 1; i <= end && i < len; i++) { + if (i + nums[i] > Max) { + idx = i; + Max = i + nums[i]; + } + } + step++; + if (Max >= len - 1) { + step++; + break; + } + } + return step; + } +}; +``` + + ## 去除重复字母 [LeetCode中文](https://leetcode.cn/problems/remove-duplicate-letters/description/) From 5a712d384b82d11b829560e1d0662c650258d862 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Thu, 14 Aug 2025 18:37:36 +0800 Subject: [PATCH 148/163] =?UTF-8?q?Update=20=E5=8A=A8=E6=80=81=E8=A7=84?= =?UTF-8?q?=E5=88=92.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\345\212\250\346\200\201\350\247\204\345\210\222.md" | 5 +++++ 1 file changed, 5 insertions(+) diff --git "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" index 3862648..9a341ef 100644 --- "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" +++ "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" @@ -2291,6 +2291,11 @@ class Solution: ### 解答 +动态规划,设`dp_len[i]`代表以nums[i]结尾的最长上升子序列长度,`dp_num[i]`代表以nums[i]结尾的最长上升子序列数量,状态转移方程如下: + +dp_len[i] = max{dp_len[j] + 1, j < i && nums[j] < nums[i]} +dp_num[i] = sum{dp_num[j], j < i && nums[j] < nums[i] && dp_len[j] = dp_len[i] - 1} + **Python代码** ```python From 76572ba1a6a1edd9efdfac8602a61f8e5befdda8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Thu, 14 Aug 2025 18:38:14 +0800 Subject: [PATCH 149/163] =?UTF-8?q?Update=20=E5=8A=A8=E6=80=81=E8=A7=84?= =?UTF-8?q?=E5=88=92.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" index 9a341ef..d58554f 100644 --- "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" +++ "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" @@ -2293,8 +2293,10 @@ class Solution: 动态规划,设`dp_len[i]`代表以nums[i]结尾的最长上升子序列长度,`dp_num[i]`代表以nums[i]结尾的最长上升子序列数量,状态转移方程如下: +``` dp_len[i] = max{dp_len[j] + 1, j < i && nums[j] < nums[i]} dp_num[i] = sum{dp_num[j], j < i && nums[j] < nums[i] && dp_len[j] = dp_len[i] - 1} +``` **Python代码** From cb301c918cb5ff7a4d4359900c6516be7b89170d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Fri, 15 Aug 2025 19:28:32 +0800 Subject: [PATCH 150/163] =?UTF-8?q?Update=20=E5=89=8D=E7=BC=80=E5=92=8C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\345\211\215\347\274\200\345\222\214.md" | 1 + 1 file changed, 1 insertion(+) diff --git "a/LeetCode/\345\211\215\347\274\200\345\222\214.md" "b/LeetCode/\345\211\215\347\274\200\345\222\214.md" index f7ccfed..9cac747 100644 --- "a/LeetCode/\345\211\215\347\274\200\345\222\214.md" +++ "b/LeetCode/\345\211\215\347\274\200\345\222\214.md" @@ -1,5 +1,6 @@ * **数组类总结** * [和为K的子数组](#和为K的子数组) + * [路径总和III](https://github.com/Miller-Xie/Code/blob/master/LeetCode/%E5%9B%9E%E6%BA%AF.md#%E8%B7%AF%E5%BE%84%E6%80%BB%E5%92%8Ciii) # 数组类总结 From 682fdccaf22e0949cc25721c37b50230352b98a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Fri, 15 Aug 2025 19:48:08 +0800 Subject: [PATCH 151/163] =?UTF-8?q?Update=20=E8=B4=AA=E5=BF=83.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\350\264\252\345\277\203.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/LeetCode/\350\264\252\345\277\203.md" "b/LeetCode/\350\264\252\345\277\203.md" index bf5aeaa..e676341 100644 --- "a/LeetCode/\350\264\252\345\277\203.md" +++ "b/LeetCode/\350\264\252\345\277\203.md" @@ -752,6 +752,10 @@ public: ### 解答 +通俗解释:矮个子插队,高个子看不见;所以我们可以先安排高个子的位置,再通过插队的方式安排矮个子的位置 + +详细处理:对数组排序,第一个元素(身高)降序,第二个元素(人数)升序,然后遍历数组,根据第二个元素(人数)插入到结果数组 + **C++代码** ```c++ From 03f89f5891ba89defcacd2a5b9cfbfa5c24c706d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Wed, 20 Aug 2025 18:54:10 +0800 Subject: [PATCH 152/163] =?UTF-8?q?Update=20=E5=8A=A8=E6=80=81=E8=A7=84?= =?UTF-8?q?=E5=88=92.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...50\346\200\201\350\247\204\345\210\222.md" | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" index d58554f..6d2d67d 100644 --- "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" +++ "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" @@ -27,9 +27,59 @@ * [编辑距离](#编辑距离) (`medium` `dp`) * [完全平方数](#完全平方数) (`medium` `dp` `记忆化`) * [单词拆分](#单词拆分) (`medium` `dp` `记忆化`) + * [最长有效括号](#最长有效括号) (`hard` `dp`) # 动态规划总结 +## 最长有效括号 + +[LeetCode中文](https://leetcode.cn/problems/longest-valid-parentheses/) + +题解:设`dp[i]`为以s[i]结尾的字符串最长有效括号长度 + +``` +if s[i] == '(': + dp[i] = 0 +if s[i] == ')': + if s[i - 1] == '(': + dp[i] = dp[i - 2] + 2 + else if s[i - dp[i - 1] - 1] == '(': + dp[i] = dp[i - 1] + 2 + dp[i - dp[i - 1] - 2] (需要i - dp[i - 1] - 2 >= 0) +``` + +```c++ +class Solution { +public: + int longestValidParentheses(string s) { + int len = s.size(); + if (len < 2) return 0; + int res = 0; + vector dp(len, 0); + if (s[0] == '(' && s[1] == ')') { + dp[1] = 2; + res = 2; + } + for (int i = 2; i < len; i++) { + if (s[i] == ')') { + if (s[i - 1] == '(') { + dp[i] = dp[i - 2] + 2; + } else { + int pre = i - dp[i - 1] - 1; + if (pre >= 0 && s[pre] == '(') { + dp[i] = dp[i - 1] + 2; + if (pre >= 1) { + dp[i] = dp[pre - 1] + dp[i]; + } + } + } + } + res = max(res, dp[i]); + } + return res; + } +}; +``` + ## 乘积最大子数组 [LeetCode中文](https://leetcode.cn/problems/maximum-product-subarray/description/) From bcbc86d927e6a2282259542d792e87033749d95d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Fri, 22 Aug 2025 19:21:51 +0800 Subject: [PATCH 153/163] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 5a8c198..4fcbf5f 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,7 @@ * [线段树](https://github.com/xcg1995/Code/blob/master/LeetCode/线段树.md) * [字典树](https://github.com/xcg1995/Code/blob/master/LeetCode/字典树.md) * [单调栈](https://github.com/xcg1995/Code/blob/master/LeetCode/单调栈.md) + * [单调队列]() * [前缀和](https://github.com/Miller-Xie/Code/blob/master/LeetCode/前缀和.md) * **算法** * [二分查找](https://github.com/xcg1995/Code/blob/master/LeetCode/二分查找.md) From a317e107c53afd18699e7c700be8106d73ad2318 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Fri, 22 Aug 2025 19:22:28 +0800 Subject: [PATCH 154/163] =?UTF-8?q?Create=20=E5=8D=95=E8=B0=83=E9=98=9F?= =?UTF-8?q?=E5=88=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\345\215\225\350\260\203\351\230\237\345\210\227.md" | 1 + 1 file changed, 1 insertion(+) create mode 100644 "LeetCode/\345\215\225\350\260\203\351\230\237\345\210\227.md" diff --git "a/LeetCode/\345\215\225\350\260\203\351\230\237\345\210\227.md" "b/LeetCode/\345\215\225\350\260\203\351\230\237\345\210\227.md" new file mode 100644 index 0000000..8b13789 --- /dev/null +++ "b/LeetCode/\345\215\225\350\260\203\351\230\237\345\210\227.md" @@ -0,0 +1 @@ + From a87d666e5fa086ae4b1e4e4ea3d7611f3cb1af73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Fri, 22 Aug 2025 19:25:30 +0800 Subject: [PATCH 155/163] =?UTF-8?q?Update=20=E5=8D=95=E8=B0=83=E9=98=9F?= =?UTF-8?q?=E5=88=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...25\350\260\203\351\230\237\345\210\227.md" | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git "a/LeetCode/\345\215\225\350\260\203\351\230\237\345\210\227.md" "b/LeetCode/\345\215\225\350\260\203\351\230\237\345\210\227.md" index 8b13789..3f379cf 100644 --- "a/LeetCode/\345\215\225\350\260\203\351\230\237\345\210\227.md" +++ "b/LeetCode/\345\215\225\350\260\203\351\230\237\345\210\227.md" @@ -1 +1,40 @@ +* **单调队列** + * [滑动窗口最大值](#滑动窗口最大值) (`hard` `滑动窗口`) + +# 单调队列总结 +## 滑动窗口最大值 + +[LeetCode中文](https://leetcode.cn/problems/sliding-window-maximum/description/) + +参考题解:https://leetcode.cn/problems/sliding-window-maximum/solutions/2361228/239-hua-dong-chuang-kou-zui-da-zhi-dan-d-u6h0 + + +```c++ +class Solution { +public: + vector maxSlidingWindow(vector& nums, int k) { + int len = nums.size(); + deque que; + int l = 0, r = 0; + vector res; + while (r < len) { + while (!que.empty() && que.back() < nums[r]) { + que.pop_back(); + } + que.push_back(nums[r]); + r++; + while (r - l > k) { + if (nums[l] == que.front()) { + que.pop_front(); + } + l++; + } + if (r - l == k) { + res.push_back(que.front()); + } + } + return res; + } +}; +``` From b03826391393a13d63883c8717bfea1f830fe231 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Tue, 26 Aug 2025 10:53:49 +0800 Subject: [PATCH 156/163] =?UTF-8?q?Update=20=E4=BA=8C=E5=88=86=E6=9F=A5?= =?UTF-8?q?=E6=89=BE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...14\345\210\206\346\237\245\346\211\276.md" | 34 +++++++++---------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git "a/LeetCode/\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/LeetCode/\344\272\214\345\210\206\346\237\245\346\211\276.md" index 86be27c..8f4dcc0 100644 --- "a/LeetCode/\344\272\214\345\210\206\346\237\245\346\211\276.md" +++ "b/LeetCode/\344\272\214\345\210\206\346\237\245\346\211\276.md" @@ -643,7 +643,7 @@ public: #### 方法2:二分查找 -[参见博客](http://www.cnblogs.com/grandyang/p/4465932.html) +[参见解法三](https://leetcode.cn/problems/median-of-two-sorted-arrays/solutions/8999/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by-w-2/) - 时间复杂度O(*log(m+n)*) - 空间复杂度O(1) @@ -651,25 +651,23 @@ public: ```c++ class Solution { public: - double recursionFind(const vector& nums1,int i,const vector& nums2,int j,int k) - { - if(i >= nums1.size()) return nums2[j + k - 1]; - if(j >= nums2.size()) return nums1[i + k - 1]; - if(k == 1) return min(nums1[i],nums2[j]); - - int val1 = ( i + k/2 - 1 < nums1.size() ) ? nums1[i + k/2 - 1] : INT_MAX; - int val2 = ( j + k/2 - 1 < nums2.size() ) ? nums2[j + k/2 - 1] : INT_MAX; - if(val1 < val2) - return recursionFind(nums1,i + k/2,nums2,j,k - k/2); - else - return recursionFind(nums1,i,nums2,j + k/2,k - k/2); + int recursion(const vector& nums1, const vector& nums2, int k, int start1, int start2) { + int len1 = nums1.size(), len2 = nums2.size(); + if (start1 >= len1) return nums2[start2 + k - 1]; + if (start2 >= len2) return nums1[start1 + k - 1]; + if (k == 1) return min(nums1[start1], nums2[start2]); + int n1 = min(start1 + k / 2 - 1, len1 - 1); + int n2 = min(start2 + k / 2 - 1, len2 - 1); + if (nums1[n1] < nums2[n2]) { + return recursion(nums1, nums2, k - (n1 - start1 + 1), n1 + 1, start2); + } else { + return recursion(nums1, nums2, k - (n2 - start2 + 1), start1, n2 + 1); + } } - double findMedianSortedArrays(vector& nums1, vector& nums2) { - int len1 = nums1.size(),len2 = nums2.size(); - int k1 = (len1 + len2 + 1)/2,k2 = (len1 + len2 + 2)/2; - - return (recursionFind(nums1,0,nums2,0,k1) + recursionFind(nums1,0,nums2,0,k2)) / 2.0; + int len1 = nums1.size(), len2 = nums2.size(); + int k1 = (len1 + len2 + 1) / 2, k2 = (len1 + len2 + 2) / 2; + return double(recursion(nums1, nums2, k1, 0, 0) + recursion(nums1, nums2, k2, 0, 0)) / 2.0; } }; ``` From c4631d3aad0f517a6b51d72ef694113d4c028700 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Mon, 1 Sep 2025 10:54:21 +0800 Subject: [PATCH 157/163] =?UTF-8?q?Update=20=E9=93=BE=E8=A1=A8.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\351\223\276\350\241\250.md" | 62 ++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git "a/LeetCode/\351\223\276\350\241\250.md" "b/LeetCode/\351\223\276\350\241\250.md" index 46864e4..7064d2c 100644 --- "a/LeetCode/\351\223\276\350\241\250.md" +++ "b/LeetCode/\351\223\276\350\241\250.md" @@ -13,11 +13,73 @@ * [两数相加](#两数相加) (`medium` `数学`) * [删除链表的倒数第N个节点](#删除链表的倒数第N个节点) (`medium`) * [复制带随机指针的链表](#复制带随机指针的链表) (`medium`) + * [k个一组翻转链表](#k个一组翻转链表) (`medium`) # 链表类总结 +## k个一组翻转链表 + +[LeetCode中文](https://leetcode.cn/problems/reverse-nodes-in-k-group/description/) + +解答:翻转链表的进阶版每翻转一组,都需要实时维护当前头结点cur_head、当前尾结点cur_tail和下一组头结点cur_head,通过cur、next、pre三个变量实现每组的翻转 + +```c++ +/** + * Definition for singly-linked list. + * struct ListNode { + * int val; + * ListNode *next; + * ListNode() : val(0), next(nullptr) {} + * ListNode(int x) : val(x), next(nullptr) {} + * ListNode(int x, ListNode *next) : val(x), next(next) {} + * }; + */ +class Solution { +public: + ListNode* reverseKGroup(ListNode* head, int k) { + ListNode *next_head = head, *cur = head, *pre = nullptr, *next = nullptr, *cur_head = head, *cur_tail = nullptr; + int cnt = 1; + while (cnt < k && cur_head && cur_head->next) { + cur_head = cur_head->next; + cnt++; + } + next_head = cur_head->next; + ListNode node(0, nullptr), *dummy = &node; + dummy->next = cur_head; + while (cur) { + if (cur_tail) { + cur_tail->next = cur_head; + } + cur_tail = cur; + while (pre != cur_head) { + next = cur->next; + cur->next = pre; + pre = cur; + cur = next; + } + cur = next_head; + if (!cur) break; + cur_head = cur; + int cnt = 1; + while (cnt < k && cur_head && cur_head->next) { + cur_head = cur_head->next; + cnt++; + } + if (cnt < k) { + cur_tail->next = cur; + break; + } + next_head = cur_head->next; + pre = nullptr; + next = nullptr; + } + return node.next; + } +}; +``` + ## 反转链表II [LeetCode中文](https://leetcode.cn/problems/reverse-linked-list-ii/) From 02a2de2f9f4d831ababeeadac0b08478e1e8093c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Mon, 1 Sep 2025 10:56:11 +0800 Subject: [PATCH 158/163] =?UTF-8?q?Update=20=E9=93=BE=E8=A1=A8.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\351\223\276\350\241\250.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/LeetCode/\351\223\276\350\241\250.md" "b/LeetCode/\351\223\276\350\241\250.md" index 7064d2c..02768ca 100644 --- "a/LeetCode/\351\223\276\350\241\250.md" +++ "b/LeetCode/\351\223\276\350\241\250.md" @@ -13,7 +13,7 @@ * [两数相加](#两数相加) (`medium` `数学`) * [删除链表的倒数第N个节点](#删除链表的倒数第N个节点) (`medium`) * [复制带随机指针的链表](#复制带随机指针的链表) (`medium`) - * [k个一组翻转链表](#k个一组翻转链表) (`medium`) + * [k个一组翻转链表](#k个一组翻转链表) (`hard`) From c634368731ccd1114105f574e99d6e015a82a22e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Tue, 2 Sep 2025 19:11:11 +0800 Subject: [PATCH 159/163] =?UTF-8?q?Update=20=E5=9B=BE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\345\233\276.md" | 52 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git "a/LeetCode/\345\233\276.md" "b/LeetCode/\345\233\276.md" index 9c6fdb9..ded6183 100644 --- "a/LeetCode/\345\233\276.md" +++ "b/LeetCode/\345\233\276.md" @@ -14,6 +14,7 @@ * [除法求解](#除法求解) (`medium`) * **最短路径** * [最短路径.一](#最短路径一) (`hard` `迪杰斯特拉算法`) + * [网络延迟时间](#网络延迟时间) (`medium`) * **最小生成树** * [最小生成树一.Prim算法](#最小生成树一prim算法) (`hard`) * [最小生成树二.Kruscal算法](#最小生成树二kruscal算法) (`hard`) @@ -23,6 +24,57 @@ # 图总结 +## 网络延迟时间 + +[LeetCode中文](https://leetcode.cn/problems/network-delay-time/description/) + +题解:https://leetcode.cn/problems/network-delay-time/solutions/910056/gong-shui-san-xie-yi-ti-wu-jie-wu-chong-oghpz + +解法一:朴素的迪杰斯特拉算法,时间复杂度 `O(N^2)` + +```c++ +class Solution { +public: + int networkDelayTime(vector>& times, int n, int k) { + vector dis(n + 1, INT_MAX); + vector vis(n + 1, false); + vector> graph(n + 1, vector(n + 1, -1)); + for (auto time : times) { + graph[time[0]][time[1]] = time[2]; + } + dis[k] = 0; + int cnt = 0; + for (int p = 1; p <= n; p++) { + int tmp = -1, min_dis = INT_MAX; + for (int i = 1; i <= n; i++) { + if (!vis[i] && dis[i] < min_dis) { + min_dis = dis[i]; + tmp = i; + } + } + // tmp = -1,还没结束循环,说明有些未访问的节点不可到达 + if (tmp < 0) return -1; + // if (tmp < 0 && p < n) return -1; + vis[tmp] = true; + bool flag = false; + for (int i = 1; i <= n; i++) { + if (!vis[i] && graph[tmp][i] >= 0) { + dis[i] = min(dis[i], dis[tmp] + graph[tmp][i]); + flag = true; + } + } + } + int res = INT_MIN; + for (int i = 1; i <= n; i++) { + res = max(dis[i], res); + } + return res; + } +}; +``` + + + ## 除法求解 [LeetCode中文](https://leetcode.cn/problems/evaluate-division/) From 6c1d7e62f40d633983fea99fa12d049811f7ea45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Tue, 9 Sep 2025 11:45:07 +0800 Subject: [PATCH 160/163] =?UTF-8?q?Update=20=E5=8A=A8=E6=80=81=E8=A7=84?= =?UTF-8?q?=E5=88=92.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...50\346\200\201\350\247\204\345\210\222.md" | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" index 6d2d67d..0d094b2 100644 --- "a/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" +++ "b/LeetCode/\345\212\250\346\200\201\350\247\204\345\210\222.md" @@ -28,9 +28,54 @@ * [完全平方数](#完全平方数) (`medium` `dp` `记忆化`) * [单词拆分](#单词拆分) (`medium` `dp` `记忆化`) * [最长有效括号](#最长有效括号) (`hard` `dp`) + * [最后一块石头的重量II](#最后一块石头的重量II) (`medium` `01背包`) # 动态规划总结 +## 最后一块石头的重量II + +[LeetCode中文](https://leetcode.cn/problems/last-stone-weight-ii/description/) + +背包问题通用题解:https://leetcode.cn/problems/last-stone-weight-ii/solutions/805162/yi-pian-wen-zhang-chi-tou-bei-bao-wen-ti-5lfv + + +```c++ +class Solution { +public: + int lastStoneWeightII(vector& stones) { + int total = accumulate(stones.begin(), stones.end(), 0); + int target = total / 2; + vector dp(target + 1, 0); + int len = stones.size(); + // dp[i][j] = max(dp[i - 1][j], dp[i-1][j-v[i] + v[i]]) + // 优化后: dp[j] = max(dp[j], dp[j-v[i]] + v[i]) + dp[0] = 0; + for (int i = 0; i < len; i++) { + for (int j = target; j >= 1; j--) { + if (j >= stones[i]) dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]); + } + } + return total - 2 * dp[target]; + // vector> dp(len, vector(target + 1, 0)); + // for (int i = 0; i < len; i++) { + // for (int j = 1; j <= target; j++) { + // if (i == 0) { + // if (j >= stones[i]) dp[i][j] = stones[i]; + // continue; + // } + // if (j >= stones[i]) { + // dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - stones[i]] + stones[i]); + // } else { + // dp[i][j] = dp[i - 1][j]; + // } + // } + // } + // return total - 2 * dp[len - 1][target]; + } +}; +``` + + ## 最长有效括号 [LeetCode中文](https://leetcode.cn/problems/longest-valid-parentheses/) From a541d3ecac7be813f6ec32ca0918ca6a1bd5cbbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Wed, 10 Sep 2025 18:46:34 +0800 Subject: [PATCH 161/163] =?UTF-8?q?Update=20=E6=95=B0=E7=BB=84.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\346\225\260\347\273\204.md" | 32 ++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git "a/LeetCode/\346\225\260\347\273\204.md" "b/LeetCode/\346\225\260\347\273\204.md" index 3fcc3be..fdbae5b 100644 --- "a/LeetCode/\346\225\260\347\273\204.md" +++ "b/LeetCode/\346\225\260\347\273\204.md" @@ -7,6 +7,7 @@ * [除自身以外数组的乘积](#除自身以外数组的乘积) (`medium`) * [搜索二维矩阵II](#搜索二维矩阵II) (`medium` `二分查找`) * **双指针** + * [有序数组的平方](#有序数组的平方) (`easy` `双指针` ``数组合并) * [移动零](#移动零) (`easy` `双指针`) * [判断子序列](#判断子序列) (`medium` `双指针`) * [盛最多水的容器](#盛最多水的容器) (`medium` `双指针`) @@ -38,6 +39,37 @@ # 数组类总结 +## 有序数组的平方 + +[LeetCode中文](https://leetcode.cn/problems/squares-of-a-sorted-array/description/) + +题解:类似合并有序数组,双指针 + +https://leetcode.cn/problems/squares-of-a-sorted-array/solutions/2806253/xiang-xiang-shuang-zhi-zhen-cong-da-dao-blda6 + +```c++ +class Solution { +public: + vector sortedSquares(vector& nums) { + int len = nums.size(); + vector res(len); + int l = 0, r = len - 1, p = len - 1; + while (p >= 0) { + int a = nums[l] * nums[l], b = nums[r] * nums[r]; + if (a > b) { + res[p--] = a; + l++; + } else { + res[p--] = b; + r--; + } + } + return res; + } +}; +``` + + ## 长度最小的子数组 [LeetCode中文](https://leetcode.cn/problems/minimum-size-subarray-sum/description/) From 0b7e47bf755bdf921cfb38ac3ede302e8627f642 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Wed, 10 Sep 2025 18:46:52 +0800 Subject: [PATCH 162/163] =?UTF-8?q?Update=20=E6=95=B0=E7=BB=84.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\346\225\260\347\273\204.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/LeetCode/\346\225\260\347\273\204.md" "b/LeetCode/\346\225\260\347\273\204.md" index fdbae5b..4fc7fb5 100644 --- "a/LeetCode/\346\225\260\347\273\204.md" +++ "b/LeetCode/\346\225\260\347\273\204.md" @@ -7,7 +7,7 @@ * [除自身以外数组的乘积](#除自身以外数组的乘积) (`medium`) * [搜索二维矩阵II](#搜索二维矩阵II) (`medium` `二分查找`) * **双指针** - * [有序数组的平方](#有序数组的平方) (`easy` `双指针` ``数组合并) + * [有序数组的平方](#有序数组的平方) (`easy` `双指针` `数组合并`) * [移动零](#移动零) (`easy` `双指针`) * [判断子序列](#判断子序列) (`medium` `双指针`) * [盛最多水的容器](#盛最多水的容器) (`medium` `双指针`) From acb121c6398de2e908742ac6c93a49ad2e7fff46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=99=A8=E5=85=89?= <852390212@qq.com> Date: Thu, 11 Sep 2025 11:33:32 +0800 Subject: [PATCH 163/163] =?UTF-8?q?Update=20=E6=95=B0=E7=BB=84.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "LeetCode/\346\225\260\347\273\204.md" | 38 ++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git "a/LeetCode/\346\225\260\347\273\204.md" "b/LeetCode/\346\225\260\347\273\204.md" index 4fc7fb5..b5498d9 100644 --- "a/LeetCode/\346\225\260\347\273\204.md" +++ "b/LeetCode/\346\225\260\347\273\204.md" @@ -24,6 +24,7 @@ * [求众数](#求众数) (`easy` `哈希`) * [多数元素](#多数元素) (`medium` `摩尔投票`) * [有效的数独](#有效的数独) (`medium` `哈希`) + * [划分字母区间](#划分字母区间) (`medium` `哈希`) * **滑动窗口** * [长度最小的子数组](#长度最小的子数组) (`medium`) * **其他** @@ -39,6 +40,43 @@ # 数组类总结 +## 划分字母区间 + +[LeetCode中文](https://leetcode.cn/problems/partition-labels/description/) + +题解:https://leetcode.cn/problems/partition-labels/solutions/2884165/zui-yi-dong-bu-fu-lai-zhan-by-zealous-ho-j17e + +巧妙地解法,时间复杂度只需要 O(N) + +```c++ +class Solution { +public: + vector partitionLabels(string s) { + unordered_map mp1; + unordered_set st; + for (auto ch : s) mp1[ch]++; + vector res; + int cnt = 0; + for (int i = 0; i < s.size(); i++) { + char ch = s[i]; + mp1[ch]--; + if (mp1[ch] > 0) { + st.insert(ch); + } else { + st.erase(ch); + } + cnt++; + if (st.empty()) { + res.push_back(cnt); + cnt = 0; + } + } + return res; + } +}; +``` + + ## 有序数组的平方 [LeetCode中文](https://leetcode.cn/problems/squares-of-a-sorted-array/description/)