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
思路分析
- 使用深度优先算法来处理本题;
- 做边界处理和不是岛屿或者已访问过的处理,返回0;
- 遍历该节点的上下左右得到对应的面积并相加;
- 取所有节点遍历后最大值,即为最大岛屿的面积。
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