classSolution: defupdateMatrix(self, matrix: List[List[int]]) -> List[List[int]]: # 动态规划,分2部分建立状态转移方程 # 创建二位dp数组 m = len(matrix) n = len(matrix[0]) dp = [[float(inf) for _ inrange(n)] for _ inrange(m)] for row inrange(m): for col inrange(n): if matrix[row][col] == 0: dp[row][col] = 0 # 向右向下 for row inrange(m): for col inrange(n): if col >= 1: dp[row][col] = min(dp[row][col],dp[row][col-1]+1) if row >= 1: dp[row][col] = min(dp[row][col],dp[row-1][col]+1) # 向左向上 for row inrange(m-1,-1,-1): for col inrange(n-1,-1,-1): if col < n-1: dp[row][col] = min(dp[row][col],dp[row][col+1]+1) if row < m-1: dp[row][col] = min(dp[row][col],dp[row+1][col]+1)
classSolution: defupdateMatrix(self, matrix: List[List[int]]) -> List[List[int]]: m = len(matrix) n = len(matrix[0]) for i inrange(m): for j inrange(n): max_i,max_j = 10001,10001 if matrix[i][j] != 0: if i>=1: max_i = matrix[i-1][j] if j>=1: max_j = matrix[i][j-1] matrix[i][j] = min(max_i,max_j)+1 for i inrange(m-1,-1,-1): for j inrange(n-1,-1,-1): max_i,max_j = 10001,10001 # 对不为0的值进行修改 if matrix[i][j] != 0: if i <= m-2: max_i = matrix[i+1][j] if j <= n-2: max_j = matrix[i][j+1] # 因为最终要比较3个值,分别为当前位置,当前位置的下方,当前位置的右方。 matrix[i][j] = min(matrix[i][j], min(max_i,max_j)+1) return matrix
classSolution: defupdateMatrix(self, matrix: List[List[int]]) -> List[List[int]]: from collections import deque m = len(matrix) n = len(matrix[0]) list_zero = [(i,j) for j inrange(n) for i inrange(m) if matrix[i][j] == 0] q = deque(list_zero) set_ = set(list_zero)
while(q): row,col = q.popleft() for i,j in [(row-1,col),(row+1,col),(row,col-1),(row,col+1)]: if0 <= i <= m-1and0 <= j <= n-1and (i,j) notin set_ and matrix[i][j] != 0: matrix[i][j] = matrix[row][col] + 1 set_.add((i,j)) q.append((i,j)) return matrix