1254. Number of Closed Islands ⭐

Medium

Given a 2D grid consists of 0s (land) and 1s (water). An island is a maximal 4-directionally connected group of 0s and a closed island is an island totally (all left, top, right, bottom) surrounded by 1s.

Return the number of closed islands.

Example 1:

Input: grid = [[1,1,1,1,1,1,1,0],[1,0,0,0,0,1,1,0],[1,0,1,0,1,1,1,0],[1,0,0,0,0,1,0,1],[1,1,1,1,1,1,1,0]]
Output:
 2
Explanation:
 
Islands in gray are closed because they are completely surrounded by water (group of 1s).

Example 2:

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

Example 3:

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

Constraints:

  • 1 <= grid.length, grid[0].length <= 100

  • 0 <= grid[i][j] <=1

解題

經典 DFS 題目

Runtime: 12 ms, faster than 87.76%

Memory Usage: 4.6 MB, less than 85.71%

func closedIsland(grid [][]int) int {
    res := 0

    for i := 0; i < len(grid); i++ {
        for j := 0; j < len(grid[0]); j++ {
            if grid[i][j] == 0 {
                if dfs(grid, i, j) { res++ }
            }
        }
    }

    return res
}

func dfs(grid [][]int, x int, y int) bool {
    if x < 0 || y < 0 || x == len(grid) || y == len(grid[0]) {
        return false
    }

    if grid[x][y] == 1 { return true }
    grid[x][y] = 1

    right := dfs(grid, x + 1, y)
    left := dfs(grid, x - 1, y)
    up := dfs(grid, x, y + 1)
    down := dfs(grid, x, y - 1)

    return right && left && up && down
}

Last updated