# [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);
    }
  }
}