Skip to content

Commit 96dbda7

Browse files
Merge branch 'master' into master
2 parents 3cba050 + 240684f commit 96dbda7

File tree

67 files changed

+2481
-234
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

67 files changed

+2481
-234
lines changed

README.md

Lines changed: 32 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -372,25 +372,38 @@
372372

373373
通知:开始更新图论内容,图论部分还没有其他语言版本,欢迎录友们提交PR,成为contributor
374374

375-
### 深搜广搜
376-
377-
* [图论:深度优先搜索理论基础](./problems/图论深搜理论基础.md)
378-
* [图论:797.所有可能的路径](./problems/0797.所有可能的路径.md)
379-
* [图论:广度优先搜索理论基础](./problems/图论广搜理论基础.md)
380-
* [图论:200.岛屿数量.深搜版](./problems/0200.岛屿数量.深搜版.md)
381-
* [图论:200.岛屿数量.广搜版](./problems/0200.岛屿数量.广搜版.md)
382-
* [图论:695.岛屿的最大面积](./problems/0695.岛屿的最大面积.md)
383-
* [图论:1020.飞地的数量](./problems/1020.飞地的数量.md)
384-
* [图论:130.被围绕的区域](./problems/0130.被围绕的区域.md)
385-
* [图论:417.太平洋大西洋水流问题](./problems/0417.太平洋大西洋水流问题.md)
386-
* [图论:827.最大人工岛](./problems/0827.最大人工岛.md)
387-
* [图论:127. 单词接龙](./problems/0127.单词接龙.md)
388-
* [图论:841.钥匙和房间](./problems/0841.钥匙和房间.md)
389-
* [图论:463. 岛屿的周长](./problems/0463.岛屿的周长.md)
390-
* [图论:并查集理论基础](./problems/图论并查集理论基础.md)
391-
* [图论:1971. 寻找图中是否存在路径](./problems/1971.寻找图中是否存在路径.md)
392-
* [图论:684.冗余连接](./problems/0684.冗余连接.md)
393-
* [图论:685.冗余连接II](./problems/0685.冗余连接II.md)
375+
1. [图论:理论基础](./problems/kamacoder/图论理论基础.md)
376+
2. [图论:深度优先搜索理论基础](./problems/kamacoder/图论深搜理论基础.md)
377+
3. [图论:所有可达路径](./problems/kamacoder/0098.所有可达路径.md)
378+
4. [图论:广度优先搜索理论基础](./problems/kamacoder/图论广搜理论基础.md)
379+
5. [图论:岛屿数量.深搜版](./problems/kamacoder/0099.岛屿的数量深搜.md)
380+
6. [图论:岛屿数量.广搜版](./problems/kamacoder/0099.岛屿的数量广搜.md)
381+
7. [图论:岛屿的最大面积](./problems/kamacoder/0100.岛屿的最大面积.md)
382+
8. [图论:孤岛的总面积](./problems/kamacoder/0101.孤岛的总面积.md)
383+
9. [图论:沉没孤岛](./problems/kamacoder/0102.沉没孤岛.md)
384+
10. [图论:水流问题](./problems/kamacoder/0103.水流问题.md)
385+
11. [图论:建造最大岛屿](./problems/kamacoder/0104.建造最大岛屿.md)
386+
12. [图论:字符串接龙](./problems/kamacoder/0110.字符串接龙.md)
387+
13. [图论:有向图的完全可达性](./problems/kamacoder/0105.有向图的完全可达性.md)
388+
14. [图论:岛屿的周长](./problems/kamacoder/0106.岛屿的周长.md)
389+
15. [图论:并查集理论基础](./problems/kamacoder/图论并查集理论基础.md)
390+
16. [图论:寻找存在的路径](./problems/kamacoder/0107.寻找存在的路径.md)
391+
17. [图论:冗余连接](./problems/kamacoder/0108.冗余连接.md)
392+
18. [图论:冗余连接II](./problems/kamacoder/0109.冗余连接II.md)
393+
19. [图论:最小生成树之prim](./problems/kamacoder/0053.寻宝-prim.md)
394+
20. [图论:最小生成树之kruskal](./problems/kamacoder/0053.寻宝-Kruskal.md)
395+
21. [图论:拓扑排序](./problems/kamacoder/0117.软件构建.md)
396+
22. [图论:dijkstra(朴素版)](./problems/kamacoder/0047.参会dijkstra朴素.md)
397+
23. [图论:dijkstra(堆优化版)](./problems/kamacoder/0047.参会dijkstra堆.md)
398+
24. [图论:Bellman_ford 算法](./problems/kamacoder/0094.城市间货物运输I.md)
399+
25. [图论:Bellman_ford 队列优化算法(又名SPFA)](./problems/kamacoder/0094.城市间货物运输I-SPFA.md)
400+
26. [图论:Bellman_ford之判断负权回路](./problems/kamacoder/0095.城市间货物运输II.md)
401+
27. [图论:Bellman_ford之单源有限最短路](./problems/kamacoder/0095.城市间货物运输II.md)
402+
28. [图论:Floyd 算法](./problems/kamacoder/0097.小明逛公园.md)
403+
29. [图论:A * 算法](./problems/kamacoder/0126.骑士的攻击astar.md)
404+
30. [图论:最短路算法总结篇](./problems/kamacoder/最短路问题总结篇.md)
405+
31. [图论:图论总结篇](./problems/kamacoder/图论总结篇.md)
406+
394407

395408
(持续更新中....)
396409

problems/0015.三数之和.md

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -403,6 +403,7 @@ class Solution:
403403
```
404404

405405
### Go:
406+
(版本一) 双指针
406407

407408
```Go
408409
func threeSum(nums []int) [][]int {
@@ -442,6 +443,42 @@ func threeSum(nums []int) [][]int {
442443
return res
443444
}
444445
```
446+
(版本二) 哈希解法
447+
448+
```Go
449+
func threeSum(nums []int) [][]int {
450+
res := make([][]int, 0)
451+
sort.Ints(nums)
452+
// 找出a + b + c = 0
453+
// a = nums[i], b = nums[j], c = -(a + b)
454+
for i := 0; i < len(nums); i++ {
455+
// 排序之后如果第一个元素已经大于零,那么不可能凑成三元组
456+
if nums[i] > 0 {
457+
break
458+
}
459+
// 三元组元素a去重
460+
if i > 0 && nums[i] == nums[i-1] {
461+
continue
462+
}
463+
set := make(map[int]struct{})
464+
for j := i + 1; j < len(nums); j++ {
465+
// 三元组元素b去重
466+
if j > i + 2 && nums[j] == nums[j-1] && nums[j-1] == nums[j-2] {
467+
continue
468+
}
469+
c := -nums[i] - nums[j]
470+
if _, ok := set[c]; ok {
471+
res = append(res, []int{nums[i], nums[j], c})
472+
// 三元组元素c去重
473+
delete(set, c)
474+
} else {
475+
set[nums[j]] = struct{}{}
476+
}
477+
}
478+
}
479+
return res
480+
}
481+
```
445482

446483
### JavaScript:
447484

problems/0018.四数之和.md

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,96 @@ if (nums[k] + nums[i] > target && nums[i] >= 0) {
151151

152152
## 其他语言版本
153153

154+
### C:
155+
156+
```C
157+
/* qsort */
158+
static int cmp(const void* arg1, const void* arg2) {
159+
int a = *(int *)arg1;
160+
int b = *(int *)arg2;
161+
return (a > b);
162+
}
163+
164+
int** fourSum(int* nums, int numsSize, int target, int* returnSize, int** returnColumnSizes) {
165+
166+
/* 对nums数组进行排序 */
167+
qsort(nums, numsSize, sizeof(int), cmp);
168+
169+
int **res = (int **)malloc(sizeof(int *) * 40000);
170+
int index = 0;
171+
172+
/* k */
173+
for (int k = 0; k < numsSize - 3; k++) { /* 第一级 */
174+
175+
/* k剪枝 */
176+
if ((nums[k] > target) && (nums[k] >= 0)) {
177+
break;
178+
}
179+
/* k去重 */
180+
if ((k > 0) && (nums[k] == nums[k - 1])) {
181+
continue;
182+
}
183+
184+
/* i */
185+
for (int i = k + 1; i < numsSize - 2; i++) { /* 第二级 */
186+
187+
/* i剪枝 */
188+
if ((nums[k] + nums[i] > target) && (nums[i] >= 0)) {
189+
break;
190+
}
191+
/* i去重 */
192+
if ((i > (k + 1)) && (nums[i] == nums[i - 1])) {
193+
continue;
194+
}
195+
196+
/* left and right */
197+
int left = i + 1;
198+
int right = numsSize - 1;
199+
200+
while (left < right) {
201+
202+
/* 防止大数溢出 */
203+
long long val = (long long)nums[k] + nums[i] + nums[left] + nums[right];
204+
if (val > target) {
205+
right--;
206+
} else if (val < target) {
207+
left++;
208+
} else {
209+
int *res_tmp = (int *)malloc(sizeof(int) * 4);
210+
res_tmp[0] = nums[k];
211+
res_tmp[1] = nums[i];
212+
res_tmp[2] = nums[left];
213+
res_tmp[3] = nums[right];
214+
res[index++] = res_tmp;
215+
216+
/* right去重 */
217+
while ((right > left) && (nums[right] == nums[right - 1])) {
218+
right--;
219+
}
220+
/* left去重 */
221+
while ((left < right) && (nums[left] == nums[left + 1])) {
222+
left++;
223+
}
224+
225+
/* 更新right与left */
226+
left++, right--;
227+
}
228+
}
229+
}
230+
}
231+
232+
/* 返回值处理 */
233+
*returnSize = index;
234+
235+
int *column = (int *)malloc(sizeof(int) * index);
236+
for (int i = 0; i < index; i++) {
237+
column[i] = 4;
238+
}
239+
*returnColumnSizes = column;
240+
return res;
241+
}
242+
```
243+
154244
### Java:
155245
156246
```Java

problems/0054.螺旋矩阵.md

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,66 @@ class Solution {
200200
}
201201
```
202202

203+
```java
204+
class Solution {
205+
public List<Integer> spiralOrder(int[][] matrix) {
206+
List<Integer> res = new ArrayList<>(); // 存放结果
207+
if (matrix.length == 0 || matrix[0].length == 0)
208+
return res;
209+
int rows = matrix.length, columns = matrix[0].length;
210+
int startx = 0, starty = 0; // 定义每循环一个圈的起始位置
211+
int loop = 0; // 循环次数
212+
int offset = 1; // 每一圈循环,需要控制每一条边遍历的长度
213+
while (loop < Math.min(rows, columns) / 2) {
214+
int i = startx;
215+
int j = starty;
216+
// 模拟填充上行从左到右(左闭右开)
217+
for (; j < columns - offset; j++) {
218+
res.add(matrix[i][j]);
219+
}
220+
// 模拟填充右列从上到下(左闭右开)
221+
for (; i < rows - offset; i++) {
222+
res.add(matrix[i][j]);
223+
}
224+
// 模拟填充下行从右到左(左闭右开)
225+
for (; j > starty; j--) {
226+
res.add(matrix[i][j]);
227+
}
228+
// 模拟填充左列从下到上(左闭右开)
229+
for (; i > startx; i--) {
230+
res.add(matrix[i][j]);
231+
}
232+
233+
// 起始位置加1 循环次数加1 并控制每条边遍历的长度
234+
startx++;
235+
starty++;
236+
offset++;
237+
loop++;
238+
}
239+
240+
// 如果列或行中的最小值为奇数 则一定有未遍历的部分
241+
// 可以自行画图理解
242+
if (Math.min(rows, columns) % 2 == 1) {
243+
// 当行大于列时 未遍历的部分是列
244+
// (startx, starty)即下一个要遍历位置 从该位置出发 遍历完未遍历的列
245+
// 遍历次数为rows - columns + 1
246+
if (rows > columns) {
247+
for (int i = 0; i < rows - columns + 1; i++) {
248+
res.add(matrix[startx++][starty]);
249+
}
250+
} else {
251+
// 此处与上面同理 遍历完未遍历的行
252+
for (int i = 0; i < columns - rows + 1; i++) {
253+
res.add(matrix[startx][starty++]);
254+
}
255+
}
256+
}
257+
258+
return res;
259+
}
260+
}
261+
```
262+
203263
### Javascript
204264
```
205265
/**

problems/0063.不同路径II.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -550,6 +550,27 @@ function uniquePathsWithObstacles(obstacleGrid: number[][]): number {
550550
};
551551
```
552552
553+
// 版本二: dp改為使用一維陣列,從終點開始遍歷
554+
```typescript
555+
function uniquePathsWithObstacles(obstacleGrid: number[][]): number {
556+
const m = obstacleGrid.length;
557+
const n = obstacleGrid[0].length;
558+
559+
const dp: number[] = new Array(n).fill(0);
560+
dp[n - 1] = 1;
561+
562+
// 由下而上,右而左進行遍歷
563+
for (let i = m - 1; i >= 0; i--) {
564+
for (let j = n - 1; j >= 0; j--) {
565+
if (obstacleGrid[i][j] === 1) dp[j] = 0;
566+
else dp[j] = dp[j] + (dp[j + 1] || 0);
567+
}
568+
}
569+
570+
return dp[0];
571+
};
572+
```
573+
553574
### Rust
554575
555576
```Rust

problems/0101.对称二叉树.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,8 +224,8 @@ public:
224224
st.push(root->left);
225225
st.push(root->right);
226226
while (!st.empty()) {
227-
TreeNode* leftNode = st.top(); st.pop();
228227
TreeNode* rightNode = st.top(); st.pop();
228+
TreeNode* leftNode = st.top(); st.pop();
229229
if (!leftNode && !rightNode) {
230230
continue;
231231
}
@@ -950,3 +950,4 @@ public bool IsSymmetric(TreeNode root)
950950
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
951951
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
952952
</a>
953+

problems/0102.二叉树的层序遍历.md

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ class Solution:
201201
return result
202202
```
203203
```python
204-
# 递归法
204+
#递归法
205205
# Definition for a binary tree node.
206206
# class TreeNode:
207207
# def __init__(self, val=0, left=None, right=None):
@@ -210,18 +210,24 @@ class Solution:
210210
# self.right = right
211211
class Solution:
212212
def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
213+
if not root:
214+
return []
215+
213216
levels = []
214-
self.helper(root, 0, levels)
217+
218+
def traverse(node, level):
219+
if not node:
220+
return
221+
222+
if len(levels) == level:
223+
levels.append([])
224+
225+
levels[level].append(node.val)
226+
traverse(node.left, level + 1)
227+
traverse(node.right, level + 1)
228+
229+
traverse(root, 0)
215230
return levels
216-
217-
def helper(self, node, level, levels):
218-
if not node:
219-
return
220-
if len(levels) == level:
221-
levels.append([])
222-
levels[level].append(node.val)
223-
self.helper(node.left, level + 1, levels)
224-
self.helper(node.right, level + 1, levels)
225231

226232
```
227233

problems/0151.翻转字符串里的单词.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,13 @@ class Solution:
467467
# 将列表转换成字符串
468468
return " ".join(words)
469469
```
470+
(版本三) 拆分字符串 + 反转列表
471+
```python
472+
class Solution:
473+
def reverseWords(self, s):
474+
words = s.split() #type(words) --- list
475+
words = words[::-1] # 反转单词
476+
return ' '.join(words) #列表转换成字符串
470477

471478
### Go:
472479

0 commit comments

Comments
 (0)