岛屿的最大面积

题目描述

  1. 题目地址:https://leetcode.cn/problems/max-area-of-island/
  2. 题目要求
    给你一个大小为 m x n 的二进制矩阵 grid 。

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

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

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

image

解题思路

  1. 从某一块陆地出发,向四个方向递归DFS
  2. 每次递归前要对下标进行判断,以区域的边界作为递归边界
  3. 为保证每块陆地只访问一次,将已经访问过的陆地置0
  4. 递归地返回整块岛屿的面积
  5. fill()方法用一个固定值填充一个数组中从起始索引到终止索引内的全部元素

解题代码

var maxAreaOfIsland = function(grid) {
    const gLen = grid.length
     const hLen = grid[0].length
    if (!grid.length) {
        return 0
    }
    // 存储当前所选元素在平面内上下左右四个方向元素
    const d = [[-1, 0], [0, 1], [1, 0], [0, -1]]
    // 维护递归过程中,平面中元素的使用状态,每个只能使用一次
    const used = []
    // 保存岛屿最大面积
    let max = 0
    let count = 0
    // 判断所选元素是否在二维平面内
    const inArea = function (x, y) {
        return x >=0 && x < grid.length && y >=0 && y < grid[0].length
    }
    // 递归函数,深度优先遍历,从grid[i][j]开始移动,将所有链接的陆地标记为访问过
    const dfs = function (grid, i, j) {
        used[i][j] = true
        count ++
        for (let k = 0; k < 4; k++) {
            const newX = i + d[k][0]
            const newY = j + d[k][1]
            if (inArea(newX, newY) && !used[newX][newY] && grid[newX][newY] == 1) {
                dfs(grid, newX, newY)
            }
        }
    }
    for (let i = 0; i < gLen; i++) {
        used.push(new Array(hLen).fill(false))
    }
    for (let i = 0; i < gLen; i++) {
        for (let j = 0; j < hLen; j++) {
            if (!used[i][j] && grid[i][j] == 1) {
                dfs(grid, i, j)
                max = Math.max(max, count)
                count = 0
            }
        }
    }
    return max
};
posted @ 2022-10-02 22:10  fionna  阅读(37)  评论(0编辑  收藏  举报