200. 岛屿数量
2021-08-10 本文已影响0人
justonemoretry
image.png
解法
图类联通性问题,可以用深度优先遍历,往4个方向进行遍历,直到越界,或者找到的元素不是1,或者节点已经访问过,进行返回。
class Solution {
public int numIslands(char[][] grid) {
int res = 0;
boolean[][] visited = new boolean[grid.length][grid[0].length];
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[0].length; j++) {
if (grid[i][j] == '1' && !visited[i][j]) {
dfs(grid, visited, i, j);
res++;
}
}
}
return res;
}
private void dfs(char[][] grid, boolean[][] visited, int i, int j) {
// 坐标越界
if (i >= grid.length || i < 0) {
return;
}
if (j >= grid[0].length || j < 0) {
return;
}
// 不等于1或者之前已经访问过
if (grid[i][j] != '1' || visited[i][j]) {
return;
}
visited[i][j] = true;
// 上下左右,四个不同的方向进行遍历
int[][] dirs = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
for (int[] dir : dirs) {
dfs(grid, visited, i + dir[0], j + dir[1]);
}
}
}
做另外一个题时,发现有更简单的方法,不需要再用visited数组,直接把遇到的1改为0即可。
class Solution {
public int numIslands(char[][] grid) {
int res = 0;
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[0].length; j++) {
if (grid[i][j] == '1') {
dfs(grid, i, j);
res++;
}
}
}
return res;
}
private void dfs(char[][] grid, int i, int j) {
if (i >= grid.length || i < 0) {
return;
}
if (j >= grid[0].length || j < 0) {
return;
}
// 不等于1
if (grid[i][j] != '1') {
return;
}
// 直接改为0,不用再用额外的数组了
grid[i][j] = '0';
// 上下左右
int[][] dirs = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
for (int[] dir : dirs) {
dfs(grid, i + dir[0], j + dir[1]);
}
}
}