Max Area of Island

medium array dfs matrix

Problem

Given a 2D binary grid where 1 = land, 0 = water, return the maximum area (number of cells) of an island. An island is a 4-directionally connected group of 1s.

Inputgrid = [[1,1,0],[1,0,0],[0,0,1]]
Output3
Top-left island has 3 cells; bottom-right island has 1.

def max_area_of_island(grid):
    m, n = len(grid), len(grid[0])
    def dfs(r, c):
        if r < 0 or r >= m or c < 0 or c >= n or grid[r][c] != 1:
            return 0
        grid[r][c] = -1
        return 1 + dfs(r+1, c) + dfs(r-1, c) + dfs(r, c+1) + dfs(r, c-1)
    best = 0
    for r in range(m):
        for c in range(n):
            if grid[r][c] == 1:
                best = max(best, dfs(r, c))
    return best
function maxAreaOfIsland(grid) {
  const m = grid.length, n = grid[0].length;
  function dfs(r, c) {
    if (r < 0 || r >= m || c < 0 || c >= n || grid[r][c] !== 1) return 0;
    grid[r][c] = -1;
    return 1 + dfs(r+1, c) + dfs(r-1, c) + dfs(r, c+1) + dfs(r, c-1);
  }
  let best = 0;
  for (let r = 0; r < m; r++) for (let c = 0; c < n; c++)
    if (grid[r][c] === 1) best = Math.max(best, dfs(r, c));
  return best;
}
class Solution {
    int[][] g; int m, n;
    public int maxAreaOfIsland(int[][] grid) {
        g = grid; m = grid.length; n = grid[0].length; int best = 0;
        for (int r = 0; r < m; r++) for (int c = 0; c < n; c++)
            if (g[r][c] == 1) best = Math.max(best, dfs(r, c));
        return best;
    }
    int dfs(int r, int c) {
        if (r < 0 || r >= m || c < 0 || c >= n || g[r][c] != 1) return 0;
        g[r][c] = -1;
        return 1 + dfs(r+1, c) + dfs(r-1, c) + dfs(r, c+1) + dfs(r, c-1);
    }
}
int m, n;
int dfs(vector<vector<int>>& g, int r, int c) {
    if (r < 0 || r >= m || c < 0 || c >= n || g[r][c] != 1) return 0;
    g[r][c] = -1;
    return 1 + dfs(g, r+1, c) + dfs(g, r-1, c) + dfs(g, r, c+1) + dfs(g, r, c-1);
}
int maxAreaOfIsland(vector<vector<int>>& grid) {
    m = grid.size(); n = grid[0].size(); int best = 0;
    for (int r = 0; r < m; r++) for (int c = 0; c < n; c++)
        if (grid[r][c] == 1) best = max(best, dfs(grid, r, c));
    return best;
}
Time: O(m·n) Space: O(m·n)