LeetCode0695-海岛岛屿最大面积
深度搜索
经典之海岛岛屿
题目
给你一个大小为 m x n 的二进制矩阵 grid 。
岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。
岛屿的面积是岛上值为 1 的单元格的数目。
计算并返回 grid 中最大的岛屿面积。如果没有岛屿,则返回面积为 0 。
题解
注意,要我们计算的是最大的海岛岛屿面积,而不是这篇区域的面积和
我们先一步步来,首先对于每一点,我们要怎么进行上下左右的搜索呢?
//public static void dfs(地图,坐标x,坐标y)
public static void dfs(int[][] grid,int _x,int _y){
//老规矩,判断
if(_x<0 || _y<0 || _x>=grid.length || _y >=grid[0].length){
return ;
//越界自然是不行的
}
if(grid[_x][_y] ==0){
return ;
//是海的话,我们也不要进行什么操作
}
grid[_x][_y] = 0 ; //更改属性(地->海),避免重复计算
dfs(gird,_x+1,_y);
dfs(gird,_x-1,_y);
dfs(gird,_x,_y+1);
dfs(gird,_x,_y-1);
}
好的,现在我们回过头来看,我们需要的是最大岛屿面积
思路很简单,算出每个小岛屿的面积和即可,然后不断比较更新最大值
int max = 0 ;
Math.max(max,每个岛屿的面积);
因此我们改造以下dfs函数,使它可以返回每一个岛屿的面积
public static int dfs(int[][] grid, int _x, int _y){
if(_x<0 || _y<0 || _x>=grid.length || _y >=grid[0].length){
return 0 ;
}
if(grid[_x][_y] ==0){
return 0 ;
}
//是陆地的话就对周围计数
int count = 1 ;
grid[_x][_y] = 0 ;
count += dfs(grid,_x+1,_y);
count += dfs(grid,_x,_y+1);
count += dfs(grid,_x-1,_y);
count += dfs(grid,_x,_y-1);
return count ;
}
然后我们遍历地图,就可以求得最大值
int max = 0 ;
//遍历比较
for(int i = 0 ; i<grid.length;i++){
for(int j = 0 ; j <=grid[0].length ; j++){
max = Math.max(max,dfs(grid,i,j));
}
}
完整的代码如下:
class Solution {
public int maxAreaOfIsland(int[][] grid) {
int max = 0 ;
//遍历比较
for(int i = 0 ; i<grid.length;i++){
for(int j = 0 ; j <=grid[0].length ; j++){
max = Math.max(max,dfs(grid,i,j));
}
}
return max ;
}
public static int dfs(int[][] grid, int _x, int _y){
if(_x<0 || _y<0 || _x>=grid.length || _y >=grid[0].length){
return 0 ;
}
if(grid[_x][_y] ==0){
return 0 ;
}
int count = 1 ;
grid[_x][_y] = 0 ;
count += dfs(grid,_x+1,_y);
count += dfs(grid,_x,_y+1);
count += dfs(grid,_x-1,_y);
count += dfs(grid,_x,_y-1);
return count ;
}
}
s