问题描述
问题分析
- 该题是 floodfill 经典问题,本质便是 DFS.
- 该题是求连续区域的个数问题,可以用 DFS 做,当遇到陆地并且未被遍历过时,则进行DFS,将与他连通的未被染色(遍历)的区域进行染色。一直到无法染色为止。
- 利用visited数组起到染色的效果
- 注意,该题并不需要利用回溯来恢复已遍历标志,就是一个二维DFS遍历。
- 该题也可以用并查集或者 BFS 做,以后补充并查集的做法。
代码实现
class Solution {
public int numIslands(char[][] grid) {
if (grid == null || grid.length == 0 || grid[0] == null || grid[0].length == 0) {
return 0;
}
int row = grid.length;
int col = grid[0].length;
int res = 0;
boolean[][] visited = new boolean[row][col];
for (int i = 0; i < row; ++i) {
for (int j = 0; j < col; ++j) {
if (! visited[i][j] && grid[i][j] == '1') {
dfs(grid, visited, i, j);
++res;
}
}
}
return res;
}
public void dfs(char[][] grid, boolean[][] visited, int x, int y) {
if (x < 0 || x >= grid.length || y < 0 || y >= grid[0].length || visited[x][y] || grid[x][y] == '0') {
return;
}
visited[x][y] = true;
dfs(grid, visited, x - 1, y);
dfs(grid, visited, x + 1, y);
dfs(grid, visited, x, y - 1);
dfs(grid, visited, x, y + 1);
return;
}
}