Runtime: 7ms, 26.64% Memory: 17.82MB, 45.13%
from collections import deque
class Solution:
def orangesRotting(self, grid: List[List[int]]) -> int:
rows, columns = len(grid), len(grid[0])
directions = [(-1, 0), (1, 0), (0, -1), (0, 1)]
queue = deque()
fresh = 0
minutes = 0
visited = set()
for row in range(len(grid)):
for column in range(len(grid[0])):
if grid[row][column] == 2:
queue.append((row, column))
if grid[row][column] == 1:
fresh += 1
while queue:
for cell in range(len(queue)):
head = queue.popleft()
row = head[0]
column = head[1]
visited.add((row, column))
if grid[row][column] == 2:
for dx, dy in directions:
nr = row + dx
nc = column + dy
if nr < 0 or nr >= rows:
continue
if nc < 0 or nc >= columns:
continue
if (nr, nc) in visited:
continue
if grid[nr][nc] == 1:
grid[nr][nc] = 2
fresh = fresh -1
queue.append((nr, nc))
# if we added something or while above uses fresh > 0
if queue:
minutes = minutes + 1
if fresh == 0:
return minutes
return -1