Minimum Number of Days to Disconnect Island

HardArrayDepth-First SearchBreadth-First SearchMatrixStrongly Connected Component

Solution

export function minDays(grid: number[][]): number {
  const islands = countIslands(grid);
  if (islands !== 1) {
    return 0;
  }
 
  const [m, n] = [grid.length, grid[0].length];
  for (let y = 0; y < m; y++) {
    for (let x = 0; x < n; x++) {
      if (grid[y][x] === 1) {
        grid[y][x] = 0;
        if (countIslands(grid) !== 1) {
          return 1;
        }
        grid[y][x] = 1;
      }
    }
  }
  return 2;
}
 
function countIslands(grid: number[][]): number {
  const [m, n] = [grid.length, grid[0].length];
  const visited = Array.from({ length: m }, () => new Array(n).fill(false));
 
  let islands = 0;
  for (let y = 0; y < m; y++) {
    for (let x = 0; x < n; x++) {
      if (!visited[y][x] && grid[y][x] === 1) {
        dfs(grid, visited, y, x);
        islands += 1;
      }
    }
  }
  return islands;
}
 
function dfs(grid: number[][], visited: boolean[][], y: number, x: number) {
  visited[y][x] = true;
  const [m, n] = [grid.length, grid[0].length];
  const directions = [
    [-1, 0],
    [1, 0],
    [0, -1],
    [0, 1],
  ];
  for (const [dy, dx] of directions) {
    const [ny, nx] = [y + dy, x + dx];
    if (0 <= ny && ny < m && 0 <= nx && nx < n && !visited[ny][nx] && grid[ny][nx] === 1) {
      dfs(grid, visited, ny, nx);
    }
  }
}

Complexity

  • Time: O(N^4)
  • Space: O(N^2)