Number of Islands — DFS/BFS Flood Fill

Sanjeev SharmaSanjeev Sharma
2 min read

Advertisement

Problem

Given an m x n grid of '1' (land) and '0' (water), return the number of islands.

Example:

Input: grid = [
  ["1","1","0","0","0"],
  ["1","1","0","0","0"],
  ["0","0","1","0","0"],
  ["0","0","0","1","1"]
]
Output: 3

Constraints: 1 <= m, n <= 300


Approach — DFS Flood Fill

For each unvisited land cell, start a DFS that marks the entire connected island as visited. Count how many DFS calls are made.

Key insight: mutate grid in-place ('1''0') to avoid a separate visited array.

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


Solutions

C

void dfs(char** g, int r, int c, int R, int C) {
    if (r<0||r>=R||c<0||c>=C||g[r][c]!='1') return;
    g[r][c]='0';
    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 numIslands(char** g, int R, int* cols) {
    int C=cols[0], count=0;
    for (int r=0;r<R;r++)
        for (int c=0;c<C;c++)
            if (g[r][c]=='1') { dfs(g,r,c,R,C); count++; }
    return count;
}

C++

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

Java

class Solution {
    private void dfs(char[][] g, int r, int c) {
        if (r<0||r>=g.length||c<0||c>=g[0].length||g[r][c]!='1') return;
        g[r][c]='0';
        dfs(g,r+1,c); dfs(g,r-1,c); dfs(g,r,c+1); dfs(g,r,c-1);
    }
    public int numIslands(char[][] g) {
        int cnt=0;
        for (int r=0;r<g.length;r++)
            for (int c=0;c<g[0].length;c++)
                if (g[r][c]=='1') { dfs(g,r,c); cnt++; }
        return cnt;
    }
}

JavaScript

var numIslands = function(grid) {
    const dfs = (r, c) => {
        if (r<0||r>=grid.length||c<0||c>=grid[0].length||grid[r][c]!=='1') return;
        grid[r][c]='0';
        dfs(r+1,c); dfs(r-1,c); dfs(r,c+1); dfs(r,c-1);
    };
    let cnt=0;
    for (let r=0;r<grid.length;r++)
        for (let c=0;c<grid[0].length;c++)
            if (grid[r][c]==='1') { dfs(r,c); cnt++; }
    return cnt;
};

Python

class Solution:
    def numIslands(self, grid: list[list[str]]) -> 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
            grid[r][c]='0'
            for dr,dc in [(1,0),(-1,0),(0,1),(0,-1)]:
                dfs(r+dr, c+dc)
        count=0
        for r in range(R):
            for c in range(C):
                if grid[r][c]=='1':
                    dfs(r,c); count+=1
        return count

Complexity

  • Time: O(m*n) — each cell visited at most once
  • Space: O(m*n) — recursion depth in worst case (all land)

Key Takeaway

Every "count connected components in a grid" problem uses this exact template. The only variable is the condition for what counts as land.

Advertisement

Sanjeev Sharma

Written by

Sanjeev Sharma

Full Stack Engineer · E-mopro