岛屿数量
矩阵中多处聚集着1,要想统计1聚集的堆数而不重复统计,那我们可以考虑每次找到一堆相邻的1,就将其全部改成0,而将所有相邻的1改成0的步骤又可以使用深度优先搜索(dfs),因此具体做法如下:
step 1:优先判断空矩阵等情况。 step 2:从上到下从左到右遍历矩阵每一个位置的元素,如果该元素值为1,统计岛屿数量。 step 3:使用dfs将遍历矩阵遇到的1以及相邻的1全部置为0。
至于dfs具体怎么操作,我们接着看。当我们遇到矩阵的某个元素为1时,首先将其置为了0,然后查看与它相邻的上下左右四个方向,如果这四个方向相邻元素为1,则进入该元素,进入该元素之后我们发现又回到了刚刚的子问题,又是把这一片相邻区域的1全部置为0,因此可以用递归实现。
终止条件:进入某个元素修改其值为0后,遍历四个方向发现周围都没有1,那就不用继续递归,返回即可,或者递归到矩阵边界也同样可以结束。 返回值:每一级的子问题就是把修改后的矩阵返回,因为其是函数引用,也不用管。 本级任务:对于每一级任务就是将该位置的元素置为0,然后查询与之相邻的四个方向,看看能不能进入子问题。
public int solve (char[][] grid) {
int m= grid.length;
if(m==0) return 0;
int n= grid[0].length;
int count=0;
for (int i=0;i<m;i++){
for (int j=0;j<n;i++){
if(grid[i][j]=='1'){
count++;
dfs(grid,i,j);
}
}
}
return count;
}
public void dfs(char[][] grid,int i,int j){
int m= grid.length;
int n=grid[0].length;
grid[i][j]='0';
if(i-1>0&&grid[i-1][j]=='1') dfs(grid,i-1,j);
if(i+1<m&&grid[i+1][j]=='1') dfs(grid,i+1,j);
if(j-1>0&&grid[i][j-1]=='1') dfs(grid,i,j-1);
if(j+1<n&&grid[i][j+1]=='1') dfs(grid,i,j+1);
}