-
Notifications
You must be signed in to change notification settings - Fork 4
/
01_matrix.py
81 lines (61 loc) · 1.98 KB
/
01_matrix.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
"""
542. 01 矩阵
广度优先搜索 数组 动态规划
中等
给定一个由 0 和 1 组成的矩阵 mat ,请输出一个大小相同的矩阵,其中每一个格子是 mat 中对应位置元素到最近的 0 的距离。
两个相邻元素间的距离为 1 。
示例 1:
输入:mat = [[0,0,0],[0,1,0],[0,0,0]]
输出:[[0,0,0],[0,1,0],[0,0,0]]
示例 2:
输入:mat = [[0,0,0],[0,1,0],[1,1,1]]
输出:[[0,0,0],[0,1,0],[1,2,1]]
提示:
m == mat.length
n == mat[i].length
1 <= m, n <= 104
1 <= m * n <= 104
mat[i][j] is either 0 or 1.
mat 中至少有一个 0
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/01-matrix
"""
from collections import deque
from typing import List
class Solution:
def updateMatrix(self, mat: List[List[int]]) -> List[List[int]]:
m, n = len(mat), len(mat[0])
# dest = [[0]*n for _ in range(m)]
dest = []
zeros = []
seen = set()
queue = deque()
for i in range(m):
row = []
for j in range(n):
row.append(0)
if mat[i][j] == 0:
zeros.append((i, j))
seen.add((i, j))
queue.append((i, j))
dest.append(row)
# seen = set(zeros)
# queue = zeros[:]
while queue:
i, j = queue.popleft()
for ni, nj in ((i-1, j), (i+1, j), (i, j-1), (i, j+1)):
if 0 <= ni < m and 0 <= nj < n and (ni, nj) not in seen:
dest[ni][nj] = dest[i][j] + 1
queue.append((ni, nj))
seen.add((ni, nj))
return dest
if __name__ == '__main__':
solution = Solution()
result = solution.updateMatrix([[0, 0, 0], [0, 1, 0], [0, 0, 0]])
print(result)
assert result == [[0, 0, 0], [0, 1, 0], [0, 0, 0]]
result = solution.updateMatrix([[0, 0, 0], [0, 1, 0], [1, 1, 1]])
print(result)
assert result == [[0, 0, 0], [0, 1, 0], [1, 2, 1]]