📌  相关文章
📜  二进制矩阵中具有 1 的最近单元格的距离(1)

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

题目介绍

给定一个由 0 和 1 组成的二维矩阵,在这个矩阵中,0 表示空单元,1 表示障碍物。每个单元格都有一个距离,表示它和最近的 1 的距离。两个相邻单元格的距离为 1。对于每个空单元格,返回距离它最近的 1 的距离。如果无法到达任何 1,则返回 -1。

解题思路

这道题我们可以运用广度优先搜索算法(BFS)来解题。首先我们把所有的 1 放入到一个队列中,从这些 1 开始,依次往四周扩展,将距离为 1 的所有 0 入队,并且把这些 0 的距离设置为 1。接下来,从队列中弹出这个 0,继续往四周扩展,距离为 2 的 0 入队,并把这些 0 的距离设置为 2,以此类推。

最后,队列中存储的就是所有的 0,它们到 1 的最短距离。我们只需要遍历整个矩阵,计算出每个 0 到队列中的距离最小值,就能得到这个 0 到最近的 1 的距离。

代码实现

class Solution:
    def updateMatrix(self, matrix: List[List[int]]) -> List[List[int]]:
        queue = []
        visited = set()
        m, n = len(matrix), len(matrix[0])
        # 计算所有的 1,并把它们放到队列中
        for i in range(m):
            for j in range(n):
                if matrix[i][j] == 1:
                    queue.append((i, j))
                    visited.add((i, j))

        # 记录四个方向的偏移量
        dirs = [(0, 1), (0, -1), (1, 0), (-1, 0)]

        # 队列为空,表示所有的 0 都已经计算出距离
        while queue:
            x, y = queue.pop(0)
            # 向四周扩展
            for dx, dy in dirs:
                nx, ny = x + dx, y + dy
                if 0 <= nx < m and 0 <= ny < n and (nx, ny) not in visited:
                    matrix[nx][ny] = matrix[x][y] + 1
                    visited.add((nx, ny))
                    queue.append((nx, ny))

        return matrix

以上就是使用 BFS 解决这道题的代码,时间复杂度为 O(mn),其中 m 和 n 分别是矩阵的行数和列数。