问题描述:给定一个包含了0和1的非空二维数组grid,一个岛屿是由一些相邻的1构成的组合,这里的相邻要求两个1必须在水平或竖直方向上相邻,你可以假设grid的四个边缘都被0,代表谁保卫者,找到给定二维数组中最大岛屿的面积,如何没有岛屿,则返回面积为0.dfs求解:外侧大循环对整个grid进行遍历,一旦grid[i][j]没有访问过(处理过程中将1变成0,从而访问过的和海水都不会访问),则进入一个dfs中遍历,并记录该遍历下满足条件的个数。进行多次梳理,直到最后得到最大的岛屿数量。
?
int count=0;
int max=Math.MIN_VALUE;
public void dfs(int [][]matrix,int i,in j)
{
if(i<0||i>=matrix.length||j<0||j>=matrix[0].length){return;}
if(matrix[i][j]==0){return;}
count++;
matrix[i][j]=0;
dfs(matrix,i+1,j);
dfs(matrix,i-1,j);
dfs(matrix,i,j-1);
dfs(matrix,i,j+1);
}
public int Dfs(int [][] matrix)
{
for(int i=0;i<matrix.length;i++)
{
for(int j=0;j<matrix[i].length;j++)
{
if(matrix[i][j]==0)
{
count=0;
dfs(matrix,i,j);
max=Math.max(count,max);
}
}
}
return max;
}
BFS求解:同样外侧大循环用于遍历每一个单元。
int count=0;
int max=Math.MIN_VALUE;
public void bfs(int [][]matrix,int i,int j)
{
Queue<Integer>queueRow=new LinkedList<>();
Queue<Integer>queueCol=new LinkedList<>();
queueRow.add(i);
queueCol.add(j);
while(!queueRow.isEmpty())
{
int row=queueRow.poll();
int col=queueCol.poll();
matrix[row][col]=0;
count++;
if(row+1<matrix.length&&matrix[row+1][col]==1){queueRow.add(row+1);queueCol.add(col);}
if(row-1>=0&&matrix[row-1][col]==1){queueRow.add(row-1);queueCol.add(col);}
if(col+1<matrix[0].length&&matrix[row][col+1]==1){queueRow.add(row);queueCol.add(col+1);}
if(col-1>=0&&matrix[row][col-1]==1){queueRow.add(row);queueCol.add(col-1);}
}
}
public int Bfs(int [][]matrix)
{
for(int i=0;i<matrix.length;i++)
{
for(int j=0;j<matrix[0].length;j++)
{
if(matrix[i][j]==1)
{
count=0;
bfs(matrix,i,j);
max=Math.max(count,max);
}
}
}
???????return max;
}