Skip to content

Commit 6bb320f

Browse files
authored
Update 0994-腐烂的橘子.py
1 parent 4c8e128 commit 6bb320f

File tree

1 file changed

+21
-41
lines changed

1 file changed

+21
-41
lines changed
Lines changed: 21 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,23 @@
1-
class Solution(object):
2-
def orangesRotting(self, grid):
3-
"""
4-
:type grid: List[List[int]]
5-
:rtype: int
6-
"""
7-
from collections import deque
8-
if not grid or not grid[0]:
9-
return 0
10-
11-
m, n = len(grid), len(grid[0])
12-
dx = [1, -1, 0, 0]
13-
dy = [0, 0, 1, -1]
14-
15-
queue = deque()
16-
for i in range(m):
17-
for j in range(n):
18-
if grid[i][j] == 2:
19-
queue.append((i, j))
1+
1. 首先分别将腐烂的橘子和新鲜的橘子保存在两个集合中
2+
2. 模拟广度优先搜索的过程方法是判断在每个腐烂橘子的四个方向上是否有新鲜橘子如果有就腐烂它
3+
每腐烂一次时间加 1并剔除新鲜集合里腐烂的橘子
4+
3. 当橘子全部腐烂时结束循环
205

21-
res = 0
22-
while queue:
23-
for i in range(len(queue)):
24-
pair = queue.popleft()
25-
x0, y0 = pair[0], pair[1]
26-
for k in range(4):
27-
x = x0 + dx[k]
28-
y = y0 + dy[k]
6+
class Solution:
7+
def orangesRotting(self, grid: List[List[int]]) -> int:
8+
row = len(grid)
9+
col = len(grid[0])
10+
rotten = {(i, j) for i in range(row) for j in range(col) if grid[i][j] == 2} # 腐烂集合
11+
fresh = {(i, j) for i in range(row) for j in range(col) if grid[i][j] == 1} # 新鲜集合
12+
time = 0
13+
while fresh:
14+
if not rotten: return -1
15+
rotten = {(i + di, j + dj) for i, j in rotten for di, dj in [(0, 1), (0, -1), (1, 0), (-1, 0)] if (i + di, j + dj) in fresh} # 即将腐烂的如果在新鲜的集合中,就将它腐烂
16+
fresh -= rotten # 剔除腐烂的
17+
time += 1
18+
return time
2919

30-
if 0 <= x < m and 0 <= y < n and grid[x][y] == 1:
31-
grid[x][y] = 2
32-
queue.append((x, y))
33-
if not queue:
34-
break
35-
res += 1
36-
for i in range(m):
37-
for j in range(n):
38-
if grid[i][j] == 1:
39-
return -1
40-
return res
41-
42-
43-
20+
作者z1m
21+
链接https://leetcode.cn/problems/rotting-oranges/solution/yan-du-you-xian-sou-suo-python3-c-by-z1m/
22+
来源力扣LeetCode
23+
著作权归作者所有商业转载请联系作者获得授权非商业转载请注明出处

0 commit comments

Comments
 (0)