题意:给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
解题思路
解法1:
1.首先分析题意,我们想到的算法是DFS、BFS解决此类搜索问题
2.怎么使用DFS算法?我们知道DFS算法的核心是,按照方向顺序一直遍历,如果遇到此路不通,此时再返回,在这个遍历过程中,当然要去标注我们已经走过的路,用来防止之后遍历的时候,重复遍历
3.分析题意,如果从第一个发现的1开始遍历,此时如果按照上下左右的顺序遍历,看这个1的周围是否有0,如果有0则停止,如果有1,则把它置为0,这样遍历完成第一次,发现就把第一个岛屿遍历完成了,而且此时遍历完成的第一个岛屿,我们已经全部置为0
4.由上述分析可知,进行DFS,每次遍历将遍历到的1,变为0,那么总共进行了几次DFS,即为结果
解题遇到的问题
无
后续需要总结学习的知识点
DFS、BFS核心思想和伪代码要总结一下
##解法1
class Solution {
public int numIslands(char[][] grid) {
// 进行DFS,每次遍历将遍历到的1,变为0
// 那么总共进行了几次DFS,即为结果
int m = grid.length;
int n = grid[0].length;
int landNums = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (grid[i][j] == '1') {
landNums++;
DFS(grid, i, j, m, n);
}
}
}
return landNums;
}
private void DFS(char[][] grid, int i, int j, int m, int n) {
if (i < 0 || j < 0 || i >= m || j >= n || grid[i][j] == '0') {
return;
}
grid[i][j] = '0';
DFS(grid, i - 1, j, m, n);
DFS(grid, i, j - 1, m, n);
DFS(grid, i + 1, j, m, n);
DFS(grid, i, j + 1, m, n);
}
}
网友评论