# [695] 岛屿的最大面积
给你一个大小为 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
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 50
grid[i][j] 为 0 或 1
这道题在 DFS 中算是很经典的一类,淹没(Flood Fill
)问题。因此有专题 深度优先搜索(DFS)
中讲解了这一类问题的解决思路。
Flood Fill
问题中,都有一个优化的小技巧,就是将遍历过的节点值改为其他数值,这样就不需要多建立一个visited数组来记录当前节点是否已被遍历了。
function maxAreaOfIsland(grid: number[][]): number {
let res = 0;
let count = 0;
const direction = [
[-1, 0],
[1, 0],
[0, -1],
[0, 1]
];
const rowLen = grid.length;
const colLen = grid[0].length;
for (let i = 0; i < rowLen; i++) {
for (let j = 0; j < colLen; j++) {
if (grid[i][j] === 1) {
count = 0;
backtrack(i, j);
res = Math.max(res, count);
}
}
}
return res;
function backtrack(row: number, col: number): void {
if (row < 0 || row >= rowLen || col < 0 || col >= colLen) return;
if (grid[row][col] !== 1) return;
grid[row][col] = 2;
count += 1;
for (const [i, j] of direction) {
backtrack(row + i, col + j);
}
}
}