本来最近不打算做图的题,不过既然这个打卡今天轮到这道题,那就来做做吧。这题跟当初我面字节跳动的题目有点类似,当年我就倒在不会写dfs的代码上[/(ㄒoㄒ)/~~]
695.岛屿的最大面积
给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合。你可以假设二维矩阵的四个边缘都被水包围着。
找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为0。)
这种题深度优先遍历比较好理解,就是外面两个for找到一个1的位置,然后对这个1进行深♂度♂优♂先♂遍历。看了人家的写法,就是对这个坐标上下左右四个方向的坐标再进行dfs操作,就是递归啦,然后停止递归的条件是超出长度范围或等于0。对了,每次访问一个位置,要把1改成0,避免重复访问。
class Solution {
int[][]grid;
int dfs(int i,int j) {
if(i<0||j<0||i>=grid.length||j>=grid[0].length)
return 0;
if(grid[i][j]==0)
return 0;
grid[i][j]=0;
int ans=1;
int []di=new int[]{0,0,1,-1};
int []dj=new int[]{1,-1,0,0};
for(int k=0;k<4;k++)
{
int x=di[k]+i,y=dj[k]+j;
ans=ans+dfs(x,y);
}
return ans;
}
public int maxAreaOfIsland(int[][] grid) {
this.grid=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(i,j));
return max;
}
}