Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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)

AltStyle によって変換されたページ (->オリジナル) /