[LeetCode in Python] 542 (M) 01 matrix 01 矩阵

题目

https://leetcode-cn.com/problems/01-matrix/

解题思路

  • 先将全部0的位置都放入队列,同时将其都加入seen_set
  • 标准BFS流程:
    • 首元素a出队,即为坐标
    • 探测a上下左右四个方向的元素
      • 如果坐标非法,或者曾经访问过,则跳过
      • 更新元素对应的距离值=a的距离+1
      • 更新seen_set
      • 将元素入队

代码

class Solution:
    def updateMatrix(self, matrix: List[List[int]]) -> List[List[int]]:
        n_row = len(matrix)
        n_col = len(matrix[0])

        # - init distance matrix
        dist = [[0]*n_col for _ in range(n_row)]

        # - save visited cell here
        seen_set = set()

        # - put all 0 cells in queue
        q = []
        for row in range(n_row):
            for col in range(n_col):
                if matrix[row][col] == 0:
                    q.append((row,col))
                    seen_set.add((row,col))
        
        # - BFS
        while q:
            row,col = q.pop(0)

            # - 4 directions: left,right,top,bottom
            for dr,dc in [
                (-1,0), (1,0), (0,-1), (0,1)
            ]:
                # - next pos
                nr, nc = row + dr, col + dc

                # - check if pos is valid
                if nr < 0: continue
                if nr >= n_row: continue
                if nc < 0: continue
                if nc >= n_col: continue
                if (nr,nc) in seen_set: continue

                # - update dist
                dist[nr][nc] = dist[row][col] + 1

                seen_set.add((nr,nc))
                q.append((nr,nc))
        
        return dist

猜你喜欢

转载自www.cnblogs.com/journeyonmyway/p/12702739.html