Skip to main content

Max Area of Island

Problem statement

You are given an m x n binary matrix grid. An island is a group of 1's (representing land) connected 4-directionally (horizontal or vertical.) You may assume all four edges of the grid are surrounded by water.

The area of an island is the number of cells with a value 1 in the island.

Return the maximum area of an island in grid. If there is no island, return 0.

Example 1:

Input: grid = [[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],[0,1,1,0,1,0,0,0,0,0,0,0,0],[0,1,0,0,1,1,0,0,1,0,1,0,0],[0,1,0,0,1,1,0,0,1,1,1,0,0],[0,0,0,0,0,0,0,0,0,0,1,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],[0,0,0,0,0,0,0,1,1,0,0,0,0]]Output: 6Explanation: The answer is not 11, because the island must be connected 4-directionally.

Example 2:

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

Constraints:

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

My solution

/**
* @param {number[][]} grid
* @return {number}
*/
var maxAreaOfIsland = function(grid) {
let maxSize = Number.MIN_SAFE_INTEGER;

const getDirections = (i, j) => [
[i + 1, j],
[i - 1, j],
[i, j + 1],
[i, j - 1],
]

function getArea(i, j, size = 1) {
// console.log(`${i}:${j}`)
if (i < 0 || j < 0 || i >= grid.length || j >= grid[0].length || grid[i][j] === 0) {
return 0;
}

grid[i][j] = 0;
// console.log("size", size)
for (const [newI, newJ] of getDirections(i, j)) {
size += getArea(newI, newJ)
}

return size;
}


for (let i = 0; i < grid.length; i++) {
for (j = 0; j < grid[0].length; j++) {
if (grid[i][j] === 1) {
maxSize = Math.max(maxSize, getArea(i, j));
}
}
}

return maxSize === Number.MIN_SAFE_INTEGER ? 0 : maxSize;
};