Skip to main content

Number of Islands

Problem

Given an m x n 2D binary grid grid which represents a map of '1's (land) and '0's (water), return the number of islands.

An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically. You may assume all four edges of the grid are all surrounded by water.

 

Example 1:

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

Example 2:

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:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 300
  • grid[i][j] is '0' or '1'.

Solution

/**
* @param {character[][]} grid
* @return {number}
*/
var numIslands = function(grid) {
let islands = 0;
for (let i = 0; i < grid.length; i++) {
for (let j = 0; j < grid[i].length; j++) {
if (grid[i][j] === "1") { // if is land (ie. not visited and not water)
islands++;
dfs(grid, i, j);
}
}
}
return islands;
};

var dfs = function(grid, row, col) {
// (row, rol) is not out of range, has not been visited, and is land
if (grid?.[row]?.[col] === "1") {
grid[row][col] = null;
dfs(grid, row - 1, col);
dfs(grid, row + 1, col);
dfs(grid, row, col + 1);
dfs(grid, row, col - 1);
}
};

We will implement a DFS solution. We iterate through grid and apply DFS method dfs at (i, j) if it is land and has not been visited yet (use null to denote visited). More specifically, dfs will traverse the entire island and mark all parts of the island as being visited. This means when we iterate through grid in the numIslands method, if (row, col) is land and has not been visited yet, it must be a new island.