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

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

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

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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/max-area-of-island
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

深度优先搜索

示例 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的时候,将该1的上下左右延申去寻找对接数为1 则该岛屿面积+1
  • 优化性能,可以将每次参与面积计算的1置为0,则不会重复计算
/**
 * @param {number[][]} grid
 * @return {number}
 */
var maxAreaOfIsland = function (grid) {
    let count = 0;
    let result = 0;

    let sr = 0;
    let sc = 0;

    function fill(sr, sc) {
        if (sr < 0 || sr >= grid.length || sc < 0 || sc >= grid[0].length) {
            return;
        }

        if (!grid[sr][sc]) {
            return
        }
        count++
        grid[sr][sc] = 0

        fill(sr + 1, sc)
        fill(sr - 1, sc)
        fill(sr, sc + 1)
        fill(sr, sc - 1)
    }

    //遍历每个数
    for (let i = 0; i < grid.length; i++) {
        for (let j = 0; j < grid[i].length; j++) {
            count = 0
            fill(i, j) //计算岛屿面积
            result = Math.max(result, count) //每次遇到岛屿 保留最大面积
        }
    }
    return result


};

温故而知新

  • 计算数组的边界,一定要考虑 length是否相等。
Last modification:February 24, 2023
如果觉得我的文章对你有用,请随意赞赏