LeetCode 「中等」695.岛屿的最大面积

sankigan2025-3-5算法LeetCode

岛屿的最大面积open in new window

题目描述

岛屿是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。

岛屿的面积是岛上值为 1 的单元格的数目。

计算并返回 grid 中最大的岛屿面积。如果没有岛屿,则返回面积为 0

示例

输入:grid = [
  [0,0,1,0,0,0,0,1,0,0,0,0,0],
  [0,0,0,0,0,0,0,1,1,1,0,0,0],
  [0,1,1,0,1,0,0,0,0,0,0,0,0],
  [0,1,0,0,1,1,0,0,1,0,1,0,0],
  [0,1,0,0,1,1,0,0,1,1,1,0,0],
  [0,0,0,0,0,0,0,0,0,0,1,0,0],
  [0,0,0,0,0,0,0,1,1,1,0,0,0],
  [0,0,0,0,0,0,0,1,1,0,0,0,0]
]
输出:6

输入:grid = [[0,0,0,0,0,0,0,0]]
输出:0

解答

DFS(深度优先搜索)

关键思路

  1. 遍历网格
  • 遍历整个网格,找到值为 1 的单元格,这表示一个岛屿的起点
  1. DFS 递归
  • 对于每个起点,使用 DFS 递归地计算该岛屿的面积
  • 在递归过程中,将访问过的陆地单元格标记为 0,以避免重复计算
  1. 更新最大面积
  • 每次计算完一个岛屿的面积后,更新全局的最大面积
  1. 返回结果
  • 遍历结束后,返回最大面积

具体步骤

  1. 初始化变量
  • maxArea:用于存储最大岛屿的面积
  • rowcol:网格的行数和列数
  1. 定义 DFS 函数
  • 递归地计算一个岛屿的面积
  • 检查边界条件和单元格的值,确保只计算陆地单元格
  1. 遍历网格
  • 对于每个单元格,如果值为 1,则调用 DFS 函数计算该岛屿的面积,并更新最大面积
  1. 返回结果
  • 返回计算得到的最大面积
Code
/**
 * @param {number[][]} grid
 * @return {number}
 */
var maxAreaOfIsland = function(grid) {
  const row = grid.length;
  const col = grid[0].length;
  let maxArea = 0;

  const dfs = (r, c) => {
    // 检查边界条件和单元格值
    if (r < 0 || r >= row || c < 0 || c >= col || grid[r][c] !== 1) return 0;
    // 标记当前单元格为已访问
    grid[r][c] = 0;

    // 递归计算当前岛屿的面积
    let area = 1;
    area += dfs(r - 1, c);
    area += dfs(r + 1, c);
    area += dfs(r, c - 1);
    area += dfs(r, c + 1);

    return area;
  };

  for (let i = 0; i < row; ++i) {
    for (let j = 0; j < col; ++j) {
      if (grid[i][j] === 1) {
        // 计算当前岛屿的面积
        const islandArea = dfs(i, j);
        // 更新最大面积
        maxArea = Math.max(islandArea, maxArea);
      }
    }
  }

  return maxArea;
};
更新于 2025/3/5 19:23:42