LeetCode 算法入门 — 岛屿的最大面积

229 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

岛屿的最大面积

原题地址

给你一个大小为 m x n 的二进制矩阵 grid

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

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

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

示例 1:

输入: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
解释:答案不应该是 11 ,因为岛屿只能包含水平或垂直这四个方向上的 1

示例 2:

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

思路分析

  1. 使用深度优先算法来处理本题;
  2. 做边界处理和不是岛屿或者已访问过的处理,返回0;
  3. 遍历该节点的上下左右得到对应的面积并相加;
  4. 取所有节点遍历后最大值,即为最大岛屿的面积。

AC 代码

/**
 * @param {number[][]} grid
 * @return {number}
 */
var maxAreaOfIsland = function(grid) {
    let max = -1
    for (let i = 0; i < grid.length; i++) {
        for (let j = 0; j < grid[0].length; j++) {
            max = Math.max(max, dfs(grid, i, j))
        }
    }
    return max
};

const dfs = (grid, cr, cc) => {
    // 越界
    if (cr < 0 || cr >= grid.length || cc < 0 || cc >= grid[0].length) return 0
    // 已访问过, 或者不是岛屿
    if (grid[cr][cc] === -1 || grid[cr][cc] === 0) return 0
    grid[cr][cc] = -1
    let area = 1

    area += dfs(grid, cr - 1, cc) // 上
    area += dfs(grid, cr, cc + 1) // 右
    area += dfs(grid, cr + 1, cc) // 下
    area += dfs(grid, cr, cc - 1) // 左  
    return area
}

结果:

  • 执行结果: 通过
  • 执行用时:76 ms, 在所有 JavaScript 提交中击败了74.24%的用户
  • 内存消耗:44.1 MB, 在所有 JavaScript 提交中击败了32.56%的用户
  • 通过测试用例:728 / 728

END