本题是让求岛屿的最大面积,和上一个题求岛屿的数量类似,也是通过dfs或者bfs进行求解。
那么,首先我们判断dfs函数的参数,需要grid[][],需要横坐标i,纵坐标j。那么,这里我们求的是最大面积,我们需要把每一次递归所求的的面积,都返回给调用者,所以这里我们需要返回值,并且是int类型。
然后我们确定终止条件,也就是,当我们走到边界,或者走到的当前位置是海洋(值为0),那么我们直接return0即可,因为没有找到岛屿。
然后,我们确定单层递归的逻辑。注意,这里我们可以把我们已经走过的陆地(值为1的点)置为0,从而省去标记的二维数组。然后我们可以在当前值为1的点,判断其上下左右是不是1,如果是,则面积+1,如果不是,则不需要处理;
然后我们在函数中先进行两次for循环,是为了在图中找到值为1的点,先找到一块陆地,然后进行dfs,再把返回值和0作比较,返回二者中最大值即可;
//这里使用深度优先搜索 DFS 来完成本道题目。我们使用 DFS 计算一个岛屿的面积,同时维护计算过的最大的岛屿面积。同时,为了避免对岛屿重复计算,我们在 DFS 的时候对岛屿进行 “淹没” 操作,即将岛屿所占的地方置为 0。
public int maxAreaOfIsland(int[][] grid) {int res = 0;for(int i = 0;i < grid.length;i++){for(int j = 0;j < grid[0].length;j++){//每遇到一个岛屿就计算这个岛屿的面积同时”淹没“这个岛屿if(grid[i][j] == 1){//每次计算一个岛屿的面积都要与res比较,维护最大的岛屿面积作为最后的答案res = Math.max(res,dfs(grid,i,j));}}}return res;
}
public int dfs(int[][] grid,int i,int j){//搜索边界:i,j超过grid的范围或者当前元素为0,即当前所在的地方已经是海洋if(i < 0 || i >= grid.length || j < 0 || j >= grid[0].length || grid[i][j] == 0) return 0;//淹没土地,防止后续被重复计算grid[i][j] = 0;//递归的思路:要求当前土地(i,j)所在的岛屿的面积,则等于1加上下左右相邻的土地的总面积return 1 + dfs(grid,i - 1,j) +dfs(grid,i + 1,j) +dfs(grid,i,j + 1) +dfs(grid,i,j - 1);
}