原题链接:
https://leetcode.cn/problems/max-area-of-island/submissions/518973865/
完成情况:
解题思路:
这段代码是使用深度优先搜索(DFS)来计算一个二维网格中岛屿的最大面积。算法通过遍历网格中的每个点,当遇到一个岛屿时,调用DFS函数计算该岛屿的面积并将其“淹没”(将岛屿所占的位置置为0),同时维护最大的岛屿面积作为结果。
maxAreaOfIsland
函数:遍历整个二维网格,对于每个为1的点(即岛屿),调用dfs
函数计算岛屿面积,并更新最大面积结果res
。dfs
函数:递归计算当前土地所在的岛屿面积,首先判断边界条件和当前土地是否为0,然后将当前土地置为0以避免重复计算。接着递归计算当前土地上下左右相邻土地的总面积,并返回当前土地所在岛屿的总面积。
整体思路是通过DFS遍历每个岛屿的所有相邻土地,并将其置为0,避免重复计算。最终返回的res
即为最大的岛屿面积。
这段代码通过DFS算法实现了计算二维网格中岛屿的最大面积,是一种高效且清晰的解决方案。
参考代码:
package 代码随想录.图论;
public class _695岛屿的最大面积_dfs {
/**
* 寻找最大的岛屿面积
* @param grid
* @return
*/
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++){
//每一个去dfs,从中计数,找出满足条件的最大的岛屿
if (grid[i][j] == 1){
//每次计算一个岛屿的面积都要与res进行比较,维护最大的岛屿面积作为最后的答案
res = Math.max(res,dfs_maxAreaOfIsland(grid,i,j));
}
}
}
return res;
}
/**
*
* @param grid
* @param i
* @param j
* @return
*/
private int dfs_maxAreaOfIsland(int[][] grid, int i, int j) {
//一样的,先判断是否可以,然后每一次的一个进来的新的,都去重新计数,找出最大值,然后每次出来的结果,去和当前的最大值作比较
if (i<0 || j<0 || i> grid.length-1 || j > grid[0].length-1){
return 0;
}
//当前可以被认为是一块新的岛屿
grid[i][j] = 0;
//然后向四个方向机进行扩展,同时记录当前的位置
return dfs_maxAreaOfIsland(grid,i+1,j) + dfs_maxAreaOfIsland(grid,i-1,j) +dfs_maxAreaOfIsland(grid,i,j+1) +dfs_maxAreaOfIsland(grid,i,j-1) + 1;
}
}