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!