题目:
给你一个由 '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'
题解:
思路:
深搜,设计vis[][]来记录搜过的结点。判断时记得要判grid[i][j]=='1',否则等于0的时候数量也会+1.
代码:
class Solution {
boolean[][] vis;
public int numIslands(char[][] grid) {
if(grid==null||grid.length==0) return 0;
int m=grid.length,n=grid[0].length;
int num=0;
vis=new boolean[m][n];
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(vis[i][j]==false&&grid[i][j]=='1'){
num++;
dfs(grid,i,j);
}
}
}
return num;
}
public void dfs(char[][] grid,int i,int j){
int m=grid.length,n=grid[0].length;
if(i==-1||i==m||j==-1||j==n||vis[i][j]||grid[i][j]=='0') return;
vis[i][j]=true;
int[] r={1,-1,0,0};
int[] l={0,0,1,-1};
for(int k=0;k<4;k++){
dfs(grid,i+r[k],j+l[k]);
}
}
}