-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy path286 Walls and Gates.py
121 lines (97 loc) · 3.43 KB
/
286 Walls and Gates.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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
"""
Premium Question
Author: Rajeev Ranjan
"""
class Solution(object):
def __init__(self):
self.dirs = ((-1, 0), (1, 0), (0, -1), (0, 1))
def wallsAndGates(self, mat):
"""
bfs
O(mn), abstract level
reference: https://leetcode.com/discuss/60170/6-lines-o-mn-python-bfs
:type mat: List[List[int]]
:rtype: void Do not return anything, modify rooms in-place instead.
"""
q = [(i, j) for i, row in enumerate(mat) for j, val in enumerate(row) if val == 0]
for i, j in q: # iterator
for d in self.dirs:
i1, j1 = i+d[0], j+d[1]
if 0 <= i1 < len(mat) and 0 <= j1 < len(mat[0]) and mat[i1][j1] > mat[i][j]+1:
mat[i1][j1] = mat[i][j]+1
q.append((i1, j1))
class Solution_slow(object):
def __init__(self):
self.dirs = ((-1, 0), (1, 0), (0, -1), (0, 1))
def wallsAndGates(self, rooms):
"""
bfs
O(kmn) where k is #0s
:type rooms: List[List[int]]
:rtype: void Do not return anything, modify rooms in-place instead.
"""
if not rooms: return
m = len(rooms)
if not m: return
n = len(rooms[0])
for i in xrange(m):
for j in xrange(n):
if rooms[i][j] == 0:
self.bfs_deque(rooms, i, j)
def bfs(self, rooms, x, y):
m = len(rooms)
n = len(rooms[0])
level = 0
q = [(x, y)]
while q:
l = len(q)
for idx in xrange(l):
i, j = q[idx]
rooms[i][j] = min(rooms[i][j], level)
for d in self.dirs:
i_t = i+d[0]
j_t = j+d[1]
if 0 <= i_t < m and 0 <= j_t < n and rooms[i_t][j_t] != -1 and rooms[i_t][j_t] >= level+1:
q.append((i_t, j_t))
q = q[l:]
level += 1
def bfs_deque(self, rooms, x, y):
from collections import deque
m = len(rooms)
n = len(rooms[0])
q = deque()
q.append((x, y, 0))
while q:
i, j, level = q.popleft()
rooms[i][j] = min(rooms[i][j], level)
for d in self.dirs:
i_t, j_t = i+d[0], j+d[1]
if 0 <= i_t < m and 0 <= j_t < n and rooms[i_t][j_t] != -1 and rooms[i_t][j_t] >= level+1:
q.append((i_t, j_t, level+1))
class Solution_error(object):
def __init__(self):
self.dirs = ((-1, 0), (1, 0), (0, -1), (0, 1))
def wallsAndGates(self, rooms):
"""
post-order DFS
:type rooms: List[List[int]]
:rtype: void Do not return anything, modify rooms in-place instead.
"""
if not rooms: return
m = len(rooms)
if not m: return
n = len(rooms[0])
visited = [[False for _ in xrange(n)] for _ in xrange(m)]
for i in xrange(m):
for j in xrange(n):
if not visited[i][j]:
self.dfs(rooms, i, j, visited)
def dfs(self, rooms, i, j, visited):
if not visited[i][j]:
visited[i][j] = True
for d in self.dirs:
nxt_i = i+d[0]
nxt_j = j+d[1]
if rooms[nxt_i][nxt_j] != -1:
rooms[nxt_i][nxt_j] = min(rooms[nxt_i][nxt_j], self.dfs(rooms, nxt_i, nxt_j, visited)+1)
return rooms[nxt_i][nxt_j]