Back to all solutions
#827 - Making A Large Island
Problem Description
You are given an n x n binary matrix grid. You are allowed to change at most one 0 to be 1.
Return the size of the largest island in grid after applying this operation.
An island is a 4-directionally connected group of 1s.
Solution
/**
* @param {number[][]} grid
* @return {number}
*/
var largestIsland = function(grid) {
function traverse(tile, grid, i, j) {
if (i < 0 || j < 0 || i >= grid.length || j >= grid[0].length
|| grid[i][j] === 0 || grid[i][j] === tile) {
return 0;
}
grid[i][j] = tile;
return 1 + (
traverse(tile, grid, i + 1, j)
+ traverse(tile, grid, i - 1, j)
+ traverse(tile, grid, i, j + 1)
+ traverse(tile, grid, i, j - 1)
);
};
const map = new Map();
let tile = 2;
let result = -1;
for (let i = 0; i < grid.length; i++) {
for (let j = 0; j < grid.length; j++) {
if (grid[i][j] === 1) {
const value = traverse(tile, grid, i, j);
map.set(tile, value);
tile += 1;
result = Math.max(result, value);
}
}
}
map.set(0, 0);
for (let i = 0; i < grid.length; i++) {
for (let j = 0; j < grid.length; j++) {
if (!grid[i][j]) {
const seen = new Set();
let sum = 0;
if (i > 0) seen.add(grid[i - 1][j]);
if (j > 0) seen.add(grid[i][j - 1]);
if (i < grid.length - 1) seen.add(grid[i + 1][j]);
if (j < grid.length - 1) seen.add(grid[i][j + 1]);
seen.forEach(val => sum += map.get(val));
result = Math.max(result, sum + 1);
}
}
}
return result;
};