给你一个大小为 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是否相等。