给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
示例 1:
输入:grid = [
["1","1","1","1","0"],
["1","1","0","1","0"],
["1","1","0","0","0"],
["0","0","0","0","0"]
]
输出:1
public static void main(String[] args) {
/*
* Test代码
* */
char[][] grid = new char[][]{ {'1','1','1','1','0'},
{'1','1','0','1','0'},
{'1','1','0','0','0'},
{'0','0','0','0','1'}};
System.out.println(numIslands(grid));
}
public static int numIslands(char[][] grid){
int ans = 0;
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[i].length; j++) {
if(grid[i][j] == '1'){
dfs(grid,i,j);
ans ++;
}
}
}
return ans;
}
public static void dfs(char[][] grid,int i,int j){
int l1 = grid.length,l2 = grid[0].length;
if( i >= l1 || j >= l2 || i < 0 || j < 0 ){
return;
}
if (grid[i][j] != '1'){
return;
}
grid[i][j] = '2';
dfs(grid,i-1,j);
dfs(grid,i+1,j);
dfs(grid,i,j+1);
dfs(grid,i,j-1);
}
}
本题可以选择用DFS,BFS,并查集的方法来做,这里实例DFS的方法;
思路:首先,需要明确DFS的作用 --> 遍历与目标相关的区域。即,将陆地‘1’作为目标,当遍历到‘1’时,我们再同时在底层遍历与‘1’相关的上下左右区域,并且标记为‘2’,说明已经遍历过了。遍历的时候,我们通过使用递归的思想,再次调用dfs进行遍历,这样就会在底层一次性将所有‘1’相连的区域遍历并标注完,而这样一块区域就是一个岛屿。由此则可以看懂代码。
注意点:
1.因为我们可以保证这个二维数组是个矩形的,所以我们可以用grid【0】的长度来判断当前遍历的位置是否超出这个数组。反之,如果用grid【i】来当做条件,则会出现角标越界的问题(这个时候也可以将||改为|,这样会通过断触的方式来避免角标越界);
2. 需要注意这里的DFS思想,并不是一次性遍历所有的区域,而是查找符合目标的区域并标记。