Number of Islands
Problem Statement
You’re an explorer charting a 2D grid map of '1's (land) and '0's (water). Count the number of distinct islands—connected land masses (horizontally/vertically). This medium-level DFS/BFS challenge is a nautical adventure—sink those islands!
Example
Input: grid = [["1","1","1","1","0"],["1","1","0","1","0"],["1","1","0","0","0"],["0","0","0","0","0"]]
Output: 1 (One large island)
Input: grid = [["1","1","0","0","0"],["1","1","0","0","0"],["0","0","1","0","0"],["0","0","0","1","1"]]
Output: 3 (Three separate islands)
Input: grid = [["0"]]
Output: 0
Code
Java
Python
JavaScript
class Solution {
public int numIslands(char[][] grid) {
int count = 0;
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[0].length; j++) {
if (grid[i][j] == '1') {
dfs(grid, i, j);
count++;
}
}
}
return count;
}
private void dfs(char[][] grid, int i, int j) {
if (i < 0 || i >= grid.length || j < 0 || j >= grid[0].length || grid[i][j] != '1') return;
grid[i][j] = '0'; // Mark as visited
dfs(grid, i+1, j);
dfs(grid, i-1, j);
dfs(grid, i, j+1);
dfs(grid, i, j-1);
}
}
class Solution:
def numIslands(self, grid):
if not grid:
return 0
count = 0
for i in range(len(grid)):
for j in range(len(grid[0])):
if grid[i][j] == '1':
self.dfs(grid, i, j)
count += 1
return count
def dfs(self, grid, i, j):
if i < 0 or i >= len(grid) or j < 0 or j >= len(grid[0]) or grid[i][j] != '1':
return
grid[i][j] = '0' # Sink the land
self.dfs(grid, i+1, j)
self.dfs(grid, i-1, j)
self.dfs(grid, i, j+1)
self.dfs(grid, i, j-1)
function numIslands(grid) {
if (!grid.length) return 0;
let count = 0;
for (let i = 0; i < grid.length; i++) {
for (let j = 0; j < grid[0].length; j++) {
if (grid[i][j] === '1') {
dfs(grid, i, j);
count++;
}
}
}
return count;
function dfs(grid, i, j) {
if (i < 0 || i >= grid.length || j < 0 || j >= grid[0].length || grid[i][j] !== '1') return;
grid[i][j] = '0';
dfs(grid, i+1, j);
dfs(grid, i-1, j);
dfs(grid, i, j+1);
dfs(grid, i, j-1);
}
}
Explanation
- DFS Insight: Flood-fill each island, marking visited land to count distinct ones.
- Flow: Scan grid; on '1', DFS to sink connected land, increment count.
- Example Walkthrough: [["1","1"],["0","1"]] → DFS sinks top-left island, then bottom-right → 2.
- BFS Alt: Queue-based flood-fill—same result, different traversal.
- Optimization: In-place marking saves extra space.
Note
Time complexity: O(m*n), Space complexity: O(m*n) for recursion stack. An island-counting epic—DFS at its finest!
