51.岛屿数量
给你一个由 '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
示例2:
输入:grid = [
["1","1","0","0","0"],
["1","1","0","0","0"],
["0","0","1","0","0"],
["0","0","0","1","1"]
]
输出:3
提示:
- m == grid.length
- n == grid[i].length
- 1 <= m, n <= 300
- grid[i][j] 的值为 '0' 或 '1'
代码:
class Solution {
//方向数组,分别代表上下左右四个方向横纵坐标的变化
int[][] dir = {{-1,0},{0,1},{1,0},{0,-1}};
public int numIslands(char[][] grid) {
//res用于记录岛屿数量
int res = 0;
//遍历网格
for(int i=0;i<grid.length;i++){
for(int j=0;j<grid[i].length;j++){
//如果当前网格为'1',即当前网格为陆地,才进行递归
if(grid[i][j] == '1'){
//岛屿数量加1
res++;
//以该陆地为起点进行递归遍历,将所有与该陆地相连的陆地全部标记为'2',表示已经访问过
dfs(i,j,grid.length,grid[i].length,grid);
}
}
}
//返回岛屿数
return res;
}
public void dfs(int x,int y,int m,int n,char[][] grid){
//标记当前陆地被访问过
grid[x][y] = '2';
//按照上下左右四个方向寻找未被标记的陆地
for(int i=0;i<4;i++){
int x1 = x + dir[i][0];
int y1 = y + dir[i][1];
//如果当前陆地未被标记且未越界,进行递归
if(x1>=0&&x1<m&&y1>=0&&y1<n&&grid[x1][y1]=='1')dfs(x1,y1,m,n,grid);
}
}
}

浙公网安备 33010602011771号