思路一:动态规划
每一个点到最近邻0的距离等于四周四个点的距离+1
class Solution:
def updateMatrix(self, matrix: List[List[int]]) -> List[List[int]]:
d = matrix
for x in range(len(matrix[0])):
for y in range (len(matrix[:][0])):
if matrix[x][y] == 1:
d[x][y] = self.distance(x,y,matrix)
return d
def distance(self,x,y,list2d,x0=-2,y0=-2):
if 0<=x<len(list2d[0]) and 0<=y<len(list2d[:][0]):
if list2d[x][y] == 0:
return 0
#print("distance({},{})".format(x,y))
if x-1 == x0 and y == y0:
u = 100
else:
u = self.distance(x-1,y,list2d,x,y)
if x == x0 and y-1 == y0:
l = 100
else:
l = self.distance(x,y-1,list2d,x,y)
if x == x0 and y+1 == y0:
r = 100
else:
r = self.distance(x,y+1,list2d,x,y)
if x+1 == x0 and y == y0:
d = 100
else:
d = self.distance(x+1,y,list2d,x,y)
min_one = min(u,l,r,d)
return min_one+1
else:
return 100
测试用例:[[0,1,1,0,0],[0,1,1,0,0],[0,1,0,0,1],[1,1,1,1,0],[1,0,0,1,0]]
目前存在问题:会在循环内打转,即递归没有最终返回值。
思路二:
1.先检测出边界
2.逐步向内部计算直至每一个点都计算完毕
class Solution:
def updateMatrix(self, matrix: List[List[int]]) -> List[List[int]]:
d = matrix
for i in range(len(matrix)):
for j in range(len(matrix[0])):
if matrix[i][j] == 1 and not self.near4(i,j,matrix,0):
d[i][j] = -1
dis = 1
#print(d)
while self.find_num(-1,d):
for i in range(len(matrix)):
for j in range(len(matrix[0])):
if matrix[i][j] == -1 and self.near4(i,j,matrix,dis):
d[i][j] = dis + 1
#print(d)
dis = dis+1
return d
def near4(self,x,y,list2d,num):
l = [[x,y-1],[x,y+1],[x-1,y],[x+1,y]]
Exist = False
for i,j in l:
if 0<=i<len(list2d) and 0<=j<len(list2d[0]):
Exist = Exist or list2d[i][j] == num
return Exist
def find_num(self,num,list2d):
exist = False
for i in range(len(list2d)):
for j in range(len(list2d[0])):
if list2d[i][j] == num:
exist = True
return exist
通过了,但是结果并不如人意,接下来准备继续看看大佬的解法学习,结果如下: