Max Area of Island — DFS with Area Count

Sanjeev SharmaSanjeev Sharma
2 min read

Advertisement

Problem

Return the maximum area of an island (connected 1s) in grid. An island's area is the number of 1-cells.

Example:

Input: [[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],
         ...
Output: 6

Approach — DFS Returns Area

DFS recurses into all 4 neighbours, sums up 1 + area of each subtree. Track global max.

Time: O(mn) | Space: O(mn)


Solutions

C

int dfs(int** g, int r, int c, int R, int C) {
    if(r<0||r>=R||c<0||c>=C||g[r][c]!=1) return 0;
    g[r][c]=0;
    return 1+dfs(g,r+1,c,R,C)+dfs(g,r-1,c,R,C)+dfs(g,r,c+1,R,C)+dfs(g,r,c-1,R,C);
}
int maxAreaOfIsland(int** g, int R, int* cols) {
    int C=cols[0],best=0;
    for(int r=0;r<R;r++) for(int c=0;c<C;c++)
        if(g[r][c]==1) best=fmax(best,dfs(g,r,c,R,C));
    return best;
}

C++

class Solution {
    int dfs(vector<vector<int>>& g, int r, int c) {
        if(r<0||r>=g.size()||c<0||c>=g[0].size()||g[r][c]!=1) return 0;
        g[r][c]=0;
        return 1+dfs(g,r+1,c)+dfs(g,r-1,c)+dfs(g,r,c+1)+dfs(g,r,c-1);
    }
public:
    int maxAreaOfIsland(vector<vector<int>>& g) {
        int best=0;
        for(int r=0;r<g.size();r++) for(int c=0;c<g[0].size();c++)
            if(g[r][c]==1) best=max(best,dfs(g,r,c));
        return best;
    }
};

Java

class Solution {
    private int dfs(int[][] g, int r, int c) {
        if(r<0||r>=g.length||c<0||c>=g[0].length||g[r][c]!=1) return 0;
        g[r][c]=0;
        return 1+dfs(g,r+1,c)+dfs(g,r-1,c)+dfs(g,r,c+1)+dfs(g,r,c-1);
    }
    public int maxAreaOfIsland(int[][] g) {
        int best=0;
        for(int r=0;r<g.length;r++) for(int c=0;c<g[0].length;c++)
            if(g[r][c]==1) best=Math.max(best,dfs(g,r,c));
        return best;
    }
}

JavaScript

var maxAreaOfIsland = function(grid) {
    const dfs=(r,c)=>{
        if(r<0||r>=grid.length||c<0||c>=grid[0].length||grid[r][c]!==1) return 0;
        grid[r][c]=0;
        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<grid.length;r++) for(let c=0;c<grid[0].length;c++)
        if(grid[r][c]===1) best=Math.max(best,dfs(r,c));
    return best;
};

Python

class Solution:
    def maxAreaOfIsland(self, grid: list[list[int]]) -> int:
        R,C=len(grid),len(grid[0])
        def dfs(r,c):
            if not(0<=r<R and 0<=c<C) or grid[r][c]!=1: return 0
            grid[r][c]=0
            return 1+dfs(r+1,c)+dfs(r-1,c)+dfs(r,c+1)+dfs(r,c-1)
        return max((dfs(r,c) for r in range(R) for c in range(C) if grid[r][c]==1), default=0)

Complexity

  • Time: O(mn) | Space: O(mn)

Advertisement

Sanjeev Sharma

Written by

Sanjeev Sharma

Full Stack Engineer · E-mopro