1.题目描述 542. 01 矩阵
给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离。
两个相邻元素间的距离为 1 。
示例 1:
输入:
0 0 0
0 1 0
0 0 0
输出:
0 0 0
0 1 0
0 0 0
示例 2:
输入:
0 0 0
0 1 0
1 1 1
输出:
0 0 0
0 1 0
1 2 1
注意:
给定矩阵的元素个数不超过 10000。
给定矩阵中至少有一个元素是 0。
矩阵中的元素只在四个方向上相邻: 上、下、左、右。
2.思路分析
2.1 一开始就想到了几度空间,从0开始外围扩散遍历的思路,不过后来想的还是麻烦,考虑看看动态规划能不能行。当前为0,则为0,当前为1,则等于min(周围距离)+1,这明显是个相互依赖的问题,不是动态规划下一步依赖上一步,而不是相互依赖的这种递推公式。当然,几度空间的思路也可以理解为 dp[i, j] = 某一个已知邻居dp + 1
2.2 另一个简单粗暴思路就是获取所有的0点,若当前为1,则计算其到所有为0的的曼哈顿距离,最小值即为所求。
3.debug过程
3.1 没加坐标范围的阈值约束,后来发现又约束错了,应该是 <m 而不是<=
3.2 后来发现没有return 值,低级错误
3.3 没有注意获取的邻居中可能有不需要下一次赋值的点,下一次赋值的时候要刨除掉
4.运行结果
执行用时 :712 ms, 在所有 Python 提交中击败了57.94%的用户
内存消耗 :17.7 MB, 在所有 Python 提交中击败了100.00%的用户
5.ac代码(python):
class Solution(object):
def updateMatrix(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: List[List[int]]
1.思路1
几度空间的思路,先将为0的标记,同时记录当前被标记点的未标记邻居,要注意去重
下一轮中遍历上一轮的邻居,直到不再有未标记邻居为止
"""
dis_matrix = []
nabers = set()
m = len(matrix)
n = len(matrix[0])
for i in range(len(matrix)):
row = []
for j in range(len(matrix[0])):
row.append(-1)
if matrix[i][j] == 0:
nabers.add((i, j))
dis_matrix.append(row)
cur_dis = 0
while len(nabers) > 0:
new_nabers = set()
for naber in nabers:
i = naber[0]
j = naber[1]
if dis_matrix[i][j] != -1:
continue
dis_matrix[i][j] = cur_dis
for point in [(-1, 0), (1, 0), (0, -1), (0, 1)]:
p = i + point[0]
k = j + point[1]
if 0<= p < m and 0<= k < n and dis_matrix[p][k] == -1:
new_nabers.add((p, k))
cur_dis += 1
nabers = new_nabers
return dis_matrix