📜  查找给定矩阵中封闭岛的数量(1)

📅  最后修改于: 2023-12-03 15:26:39.075000             🧑  作者: Mango

查找给定矩阵中封闭岛的数量

有一个二维矩阵 grid,其中值为 0 表示水域,值为 1 表示陆地。

一个“封闭岛屿”是指这个岛屿完全被水域包围,没有与外界相连。换句话说,在岛屿内部从任意一个陆地单元格都无法到达岛屿的边界。

请编写一个函数来计算给定矩阵中封闭岛屿的数量。

示例:

输入:
[
  [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]
]
输出:2
算法

这道题可以使用深度优先搜索(DFS)算法来解决。

  1. 从边界陆地出发,遍历所有与它相邻的陆地,并标记为已访问。
  2. 如果这个陆地与边界陆地不相邻,则说明这个陆地所在的岛屿是封闭的。
  3. 继续遍历所有未访问的陆地,重复上述过程。
代码
def closedIsland(grid: List[List[int]]) -> int:
    def dfs(x, y):
        if 0 <= x < m and 0 <= y < n and grid[x][y] == 0:
            grid[x][y] = 1
            dfs(x - 1, y)
            dfs(x + 1, y)
            dfs(x, y - 1)
            dfs(x, y + 1)

    m, n = len(grid), len(grid[0])
    # 从边界陆地出发遍历
    for i in range(m):
        dfs(i, 0)
        dfs(i, n - 1)
    for j in range(n):
        dfs(0, j)
        dfs(m - 1, j)

    res = 0
    # 统计封闭岛屿的数量
    for i in range(1, m - 1):
        for j in range(1, n - 1):
            if grid[i][j] == 0:
                dfs(i, j)
                res += 1
    return res

时间复杂度: $O(mn)$,其中 $m$ 和 $n$ 分别是矩阵的长度和宽度。需要遍历矩阵四个边界,以及所有未访问的陆地。

空间复杂度: $O(mn)$。当所有陆地都达到了边界或被标记为已访问时,递归的深度将达到 $mn$。