题目描述:
题解(BFS):
题解一:
1.创建一个队列myq,初始化为空,创建一个和mat结构相同的newmat作为返回值,初始化为一个很大的值,之后进行更新。另一个和mat结构相同的visited记录当前位置是否已经被处理,初始化为全0,表示未被处理。
2.将mat中值为0的位置(i,j)对应的newmat值设为0,visited设为1,表示已经处理过,然后将(i,j)加入队列myq。
3.取出myq中第一个节点(posx,posy),对该位置上下左右四个相邻位置的newmat进行更新,并将该位置标记为处理过,然后加入队列。
4.重复3直到队列为空。
class Solution(object): def updateMatrix(self, mat): direction = [(0,1),(0,-1),(1,0),(-1,0)] myq = deque() row = len(mat) col = len(mat[0]) newmat = [[row*col for j in range(col)] for i in range(row)] visited = [[0 for j in range(col)] for i in range(row)] for i in range(row): for j in range(col): if mat[i][j]==0: newmat[i][j] = 0 visited[i][j] = 1 myq.append((i,j)) while myq: posx,posy = myq.popleft() for dx,dy in direction: nx = posx+dx ny = posy+dy if 0<=nx<row and 0<=ny<col and visited[nx][ny]==0: newmat[nx][ny] = 1+newmat[posx][posy] visited[nx][ny] = 1 myq.append((nx,ny)) return newmat
题解二: 题解一改进版,不需要visited的额外空间。 class Solution(object): def updateMatrix(self, mat): direction = [(0,1),(0,-1),(1,0),(-1,0)] newmat = [[len(mat)*len(mat[0]) for i in range(len(mat[0]))] for j in range(len(mat))] myq = deque() for i in range(len(mat)): for j in range(len(mat[0])): if mat[i][j]==0: newmat[i][j] = 0 myq.append((i,j)) while myq: posx,posy = myq.popleft() for dx,dy in direction: nx = posx+dx ny = posy+dy if 0<=nx<len(mat) and 0<=ny<len(mat[0]) and mat[nx][ny]==1: if newmat[nx][ny]>newmat[posx][posy]+1: myq.append((nx,ny)) newmat[nx][ny] = newmat[posx][posy]+1 return newmat