Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 32 additions & 19 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -372,25 +372,38 @@

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

### 深搜广搜

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


(持续更新中....)

Expand Down
73 changes: 70 additions & 3 deletions problems/0417.太平洋大西洋水流问题.md
Original file line number Diff line number Diff line change
Expand Up @@ -177,14 +177,14 @@ public:

// 记录从大西洋出发,可以遍历的节点
vector<vector<bool>> atlantic = vector<vector<bool>>(n, vector<bool>(m, false));

// 从最上最下行的节点出发,向高处遍历
// 从最左最右列的节点出发,向高处遍历
for (int i = 0; i < n; i++) {
dfs (heights, pacific, i, 0); // 遍历最左列,接触太平洋
dfs (heights, atlantic, i, m - 1); // 遍历最右列,接触大西
}

// 从最左最右列的节点出发,向高处遍历
// 从最上最下行的节点出发,向高处遍历
for (int j = 0; j < m; j++) {
dfs (heights, pacific, 0, j); // 遍历最上行,接触太平洋
dfs (heights, atlantic, n - 1, j); // 遍历最下行,接触大西洋
Expand Down Expand Up @@ -297,6 +297,73 @@ class Solution {
}
```

```Java
class Solution {

// 和Carl题解更加符合的Java DFS
private int[][] directions = {{-1, 0}, {1, 0}, {0, 1}, {0, -1}};

/**
* @param heights 题目给定的二维数组
* @param m 当前位置的行号
* @param n 当前位置的列号
* @param visited 记录这个位置可以到哪条河
*/

public void dfs(int[][] heights, boolean[][] visited, int m, int n){
if(visited[m][n]) return;
visited[m][n] = true;

for(int[] dir: directions){
int nextm = m + dir[0];
int nextn = n + dir[1];
//出了2D array的边界,continue
if(nextm < 0||nextm == heights.length||nextn <0||nextn== heights[0].length) continue;
//下一个位置比当下位置还要低,跳过,继续找下一个更高的位置
if(heights[m][n] > heights[nextm][nextn]) continue;
dfs(heights, visited, nextm, nextn);
}
}


public List<List<Integer>> pacificAtlantic(int[][] heights) {
int m = heights.length;
int n = heights[0].length;

// 记录从太平洋边出发,可以遍历的节点
boolean[][] pacific = new boolean[m][n];
// 记录从大西洋出发,可以遍历的节点
boolean[][] atlantic = new boolean[m][n];

// 从最左最右列的节点出发,向高处遍历
for(int i = 0; i<m; i++){
dfs(heights, pacific, i, 0); //遍历pacific最左边
dfs(heights, atlantic, i, n-1); //遍历atlantic最右边
}

// 从最上最下行的节点出发,向高处遍历
for(int j = 0; j<n; j++){
dfs(heights, pacific, 0, j); //遍历pacific最上边
dfs(heights, atlantic, m-1, j); //遍历atlantic最下边
}

List<List<Integer>> result = new ArrayList<>();
for(int a = 0; a<m; a++){
for(int b = 0; b<n; b++){
// 如果这个节点,从太平洋和大西洋出发都遍历过,就是结果
if(pacific[a][b] && atlantic[a][b]){
List<Integer> pair = new ArrayList<>();
pair.add(a);
pair.add(b);
result.add(pair);
}
}
}
return result;
}
}
```

广度优先遍历:

```Java
Expand Down
82 changes: 82 additions & 0 deletions problems/0474.一和零.md
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,89 @@ public:
* 时间复杂度: O(kmn),k 为strs的长度
* 空间复杂度: O(mn)

C++:
使用三维数组的版本

```CPP
class Solution {
public:
int findMaxForm(vector<string>& strs, int m, int n) {
int num_of_str = strs.size();

vector<vector<vector<int>>> dp(num_of_str, vector<vector<int>>(m + 1,vector<int>(n + 1, 0)));

/* dp[i][j][k] represents, if choosing items among strs[0] to strs[i] to form a subset,
what is the maximum size of this subset such that there are no more than m 0's and n 1's in this subset.
Each entry of dp[i][j][k] is initialized with 0

transition formula:
using x[i] to indicates the number of 0's in strs[i]
using y[i] to indicates the number of 1's in strs[i]

dp[i][j][k] = max(dp[i-1][j][k], dp[i-1][j - x[i]][k - y[i]] + 1)

*/


// num_of_zeros records the number of 0's for each str
// num_of_ones records the number of 1's for each str
// find the number of 0's and the number of 1's for each str in strs
vector<int> num_of_zeros;
vector<int> num_of_ones;
for (auto& str : strs){
int count_of_zero = 0;
int count_of_one = 0;
for (char &c : str){
if(c == '0') count_of_zero ++;
else count_of_one ++;
}
num_of_zeros.push_back(count_of_zero);
num_of_ones.push_back(count_of_one);

}


// num_of_zeros[0] indicates the number of 0's for str[0]
// num_of_ones[0] indiates the number of 1's for str[1]

// initialize the 1st plane of dp[i][j][k], i.e., dp[0][j][k]
// if num_of_zeros[0] > m or num_of_ones[0] > n, no need to further initialize dp[0][j][k],
// because they have been intialized to 0 previously
if(num_of_zeros[0] <= m && num_of_ones[0] <= n){
// for j < num_of_zeros[0] or k < num_of_ones[0], dp[0][j][k] = 0
for(int j = num_of_zeros[0]; j <= m; j++){
for(int k = num_of_ones[0]; k <= n; k++){
dp[0][j][k] = 1;
}
}
}

/* if j - num_of_zeros[i] >= 0 and k - num_of_ones[i] >= 0:
dp[i][j][k] = max(dp[i-1][j][k], dp[i-1][j - num_of_zeros[i]][k - num_of_ones[i]] + 1)
else:
dp[i][j][k] = dp[i-1][j][k]
*/

for (int i = 1; i < num_of_str; i++){
int count_of_zeros = num_of_zeros[i];
int count_of_ones = num_of_ones[i];
for (int j = 0; j <= m; j++){
for (int k = 0; k <= n; k++){
if( j < count_of_zeros || k < count_of_ones){
dp[i][j][k] = dp[i-1][j][k];
}else{
dp[i][j][k] = max(dp[i-1][j][k], dp[i-1][j - count_of_zeros][k - count_of_ones] + 1);
}
}
}

}

return dp[num_of_str-1][m][n];

}
};
```

## 总结

Expand Down
2 changes: 2 additions & 0 deletions problems/kamacoder/0047.参会dijkstra堆.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@

<p align="center"><strong><a href="./qita/join.md">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!</strong></p>

# dijkstra(堆优化版)精讲

[卡码网:47. 参加科学大会](https://kamacoder.com/problempage.php?pid=1047)
Expand Down
2 changes: 2 additions & 0 deletions problems/kamacoder/0047.参会dijkstra朴素.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@

<p align="center"><strong><a href="./qita/join.md">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!</strong></p>

# dijkstra(朴素版)精讲

[卡码网:47. 参加科学大会](https://kamacoder.com/problempage.php?pid=1047)
Expand Down
2 changes: 2 additions & 0 deletions problems/kamacoder/0053.寻宝-Kruskal.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@

<p align="center"><strong><a href="./qita/join.md">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!</strong></p>

# kruskal算法精讲

[卡码网:53. 寻宝](https://kamacoder.com/problempage.php?pid=1053)
Expand Down
2 changes: 2 additions & 0 deletions problems/kamacoder/0053.寻宝-prim.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@

<p align="center"><strong><a href="./qita/join.md">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!</strong></p>

# prim算法精讲

[卡码网:53. 寻宝](https://kamacoder.com/problempage.php?pid=1053)
Expand Down
13 changes: 0 additions & 13 deletions problems/kamacoder/0054.替换数字.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,4 @@

<p align="center">
<a href="https://programmercarl.com/other/xunlianying.html" target="_blank">
<img src="../pics/训练营.png" width="1000"/>
</a>
<p align="center"><strong><a href="https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!</strong></p>


# 替换数字

[卡码网题目链接](https://kamacoder.com/problempage.php?pid=1064)
Expand Down Expand Up @@ -376,9 +369,3 @@ main();
### Rust:



<p align="center">
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
</a>

11 changes: 0 additions & 11 deletions problems/kamacoder/0055.右旋字符串.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,4 @@

<p align="center">
<a href="https://programmercarl.com/other/xunlianying.html" target="_blank">
<img src="../pics/训练营.png" width="1000"/>
</a>
<p align="center"><strong><a href="https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!</strong></p>


# 右旋字符串
Expand Down Expand Up @@ -350,9 +345,3 @@ var reverseLeftWords = function(s, n) {
### Rust:




<p align="center">
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
</a>
2 changes: 2 additions & 0 deletions problems/kamacoder/0094.城市间货物运输I-SPFA.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@

<p align="center"><strong><a href="./qita/join.md">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!</strong></p>

# Bellman_ford 队列优化算法(又名SPFA)

[卡码网:94. 城市间货物运输 I](https://kamacoder.com/problempage.php?pid=1152)
Expand Down
2 changes: 2 additions & 0 deletions problems/kamacoder/0094.城市间货物运输I.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@

<p align="center"><strong><a href="./qita/join.md">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!</strong></p>

# Bellman_ford 算法精讲

[卡码网:94. 城市间货物运输 I](https://kamacoder.com/problempage.php?pid=1152)
Expand Down
2 changes: 2 additions & 0 deletions problems/kamacoder/0095.城市间货物运输II.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@

<p align="center"><strong><a href="./qita/join.md">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!</strong></p>

# bellman_ford之判断负权回路

[卡码网:95. 城市间货物运输 II](https://kamacoder.com/problempage.php?pid=1153)
Expand Down
2 changes: 2 additions & 0 deletions problems/kamacoder/0096.城市间货物运输III.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@

<p align="center"><strong><a href="./qita/join.md">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!</strong></p>

# bellman_ford之单源有限最短路

[卡码网:96. 城市间货物运输 III](https://kamacoder.com/problempage.php?pid=1154)
Expand Down
2 changes: 2 additions & 0 deletions problems/kamacoder/0097.小明逛公园.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@

<p align="center"><strong><a href="./qita/join.md">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!</strong></p>

# Floyd 算法精讲

[卡码网:97. 小明逛公园](https://kamacoder.com/problempage.php?pid=1155)
Expand Down
2 changes: 2 additions & 0 deletions problems/kamacoder/0098.所有可达路径.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@

<p align="center"><strong><a href="./qita/join.md">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!</strong></p>

# 98. 所有可达路径

[卡码网题目链接(ACM模式)](https://kamacoder.com/problempage.php?pid=1170)
Expand Down
2 changes: 2 additions & 0 deletions problems/kamacoder/0099.岛屿的数量广搜.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@

<p align="center"><strong><a href="./qita/join.md">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!</strong></p>

# 99. 岛屿数量

[卡码网题目链接(ACM模式)](https://kamacoder.com/problempage.php?pid=1171)
Expand Down
2 changes: 2 additions & 0 deletions problems/kamacoder/0099.岛屿的数量深搜.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@

<p align="center"><strong><a href="./qita/join.md">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!</strong></p>

# 99. 岛屿数量

[卡码网题目链接(ACM模式)](https://kamacoder.com/problempage.php?pid=1171)
Expand Down
2 changes: 2 additions & 0 deletions problems/kamacoder/0100.岛屿的最大面积.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@

<p align="center"><strong><a href="./qita/join.md">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!</strong></p>

# 100. 岛屿的最大面积

[卡码网题目链接(ACM模式)](https://kamacoder.com/problempage.php?pid=1172)
Expand Down
2 changes: 2 additions & 0 deletions problems/kamacoder/0101.孤岛的总面积.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@

<p align="center"><strong><a href="./qita/join.md">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!</strong></p>

# 101. 孤岛的总面积

[卡码网:101. 孤岛的总面积](https://kamacoder.com/problempage.php?pid=1173)
Expand Down
2 changes: 2 additions & 0 deletions problems/kamacoder/0102.沉没孤岛.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@

<p align="center"><strong><a href="./qita/join.md">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!</strong></p>

# 102. 沉没孤岛

[卡码网题目链接(ACM模式)](https://kamacoder.com/problempage.php?pid=1174)
Expand Down
2 changes: 2 additions & 0 deletions problems/kamacoder/0103.水流问题.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@

<p align="center"><strong><a href="./qita/join.md">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!</strong></p>

# 103. 水流问题

[卡码网题目链接(ACM模式)](https://kamacoder.com/problempage.php?pid=1175)
Expand Down
Loading