题目

思路
1.很明显的dfs/bfs
根据dfs把一整块的1都遍历一遍,同时进行标记访问,主函数中遍历grid数组,每遇到一次满足1条件的grid就sum++
2.代码
为了减少空间复杂度,这里没写visited数组,我们可以在每次经过1时手动改成0
class Solution {
//方位数组
private int[][] position = new int[][]{{0, 1}, {0, -1}, {-1, 0}, {1, 0}};
private int m, n;
public int numIslands(char[][] grid) {
m = grid.length;
n = grid[0].length;
int sum = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (grid[i][j] == '1') {
sum++;
dfs(grid, i, j);
}
}
}
return sum;
}
//这里就不搞visited数组了,遍历到的网格全给他还原成0
public void dfs(char[][] grid, int x, int y) {
//归0,相当于访问过了
grid[x][y] = '0';
for (int i = 0; i < 4; i++) {
int nextX = x + position[i][0];
int nextY = y + position[i][1];
if (nextX >= 0 && nextX < m && nextY >= 0 && nextY < n && grid[nextX][nextY] == '1') {
dfs(grid, nextX, nextY);
}
}
}
}
这篇博客介绍了如何利用深度优先搜索(DFS)算法解决在二维网格中计算连通岛屿数量的问题。作者提供了详细的思路分析,包括通过DFS遍历整个网格并进行标记,以及优化空间复杂度,不使用额外的visited数组。代码实现中,当遇到数值为1的格子时,会递增计数器并调用DFS进行深度遍历,将遍历过的1改为0。整个解决方案简洁高效。
176

被折叠的 条评论
为什么被折叠?



