题目的目的是求岛屿的最大面积。首先我们需要知道什么叫岛屿,这里的岛屿指的是数组中上下左右相连1的总数。即只要在这四个方向上有1相连接,就计入该岛屿面积。
解题思路:看到这种有条件查询问题(本题是在找到1的基础上向四个方向继续找1),可以想到深度搜索法。为了减少查询次数,我们先搜索整个二维数组,找到1再进行递归查询。
注意点:1.可设置两个数组来实现四个方向的查询;2.对应查询过的1,一定要将其标记为0,防止二次查询;3.查询的边界条件;
代码如下:
代码1:
class Solution {
int value=0;
int max_value=0;
int h[]={-1,1,0,0};
int l[]={0,0,-1,1};
public int maxAreaOfIsland(int[][] grid) {
int h1=grid.length;
int l1=grid[0].length;
for(int i=0;i<h1;i++)
{
for(int j=0;j<l1;j++)
{
if(grid[i][j]==1)
des(i,j,grid);
if(value>max_value)
{
max_value=value;
}
value=0;
}
}
return max_value;
}
void des(int x,int y,int[][] grid){
value++; //每一次进入递归都要做的事
grid[x][y]=0;
for(int i=0;i<4;i++){
x+=h[i]; //状态转移
y+=l[i];
if(x>=0&&y>=0&&x<grid.length&&y<grid[0].length)//转移状态后,判断继续递归的条件,也可以放在函数开始处,每进入函数就先判断能不能继续往下做。
{if(grid[x][y]==1){
des(x,y,grid);
}
}
x-=h[i]; //不满足递归条件后,回溯到上一状态y-=l[i];
}
} //所有状态都遍历完成后,函数任务结束。可以假设进入递归后,不满足进一步递归的条件,看函数能不能顺利结束。
}
代码2:
class Solution {
public int maxAreaOfIsland(int[][] grid) {
int max_area=0;
for(int i=0;i<grid.length;i++)
{
for(int j=0;j<grid[0].length;j++)
{
if(grid[i][j]==1)
max_area = Math.max(max_area, dfs(grid, i, j));
}
}
return max_area;
}
public int dfs(int [][]a,int i,int j)
{
if( i < 0 || i >= a.length || j < 0 || j >= a[0].length || a[i][j] == 0)
return 0;
int result=1;
a[i][j]=0;//防止二次搜索
result+=dfs(a,i-1,j)+dfs(a,i+1,j)+dfs(a,i,j-1)+dfs(a,i,j+1);
return result;
}
}