Rotting Oranges — Multi-Source BFS
Advertisement
Problem 284 · Rotting Oranges
Difficulty: Medium · Pattern: Multi-Source BFS
Solutions
# Python
from collections import deque
def orangesRotting(grid):
m, n = len(grid), len(grid[0])
queue = deque()
fresh = 0
for r in range(m):
for c in range(n):
if grid[r][c] == 2: queue.append((r,c,0))
elif grid[r][c] == 1: fresh += 1
if fresh == 0: return 0
dirs = [(0,1),(0,-1),(1,0),(-1,0)]
minutes = 0
while queue:
r, c, t = queue.popleft()
for dr, dc in dirs:
nr, nc = r+dr, c+dc
if 0<=nr<m and 0<=nc<n and grid[nr][nc]==1:
grid[nr][nc] = 2
fresh -= 1
minutes = t+1
queue.append((nr,nc,t+1))
return minutes if fresh == 0 else -1
// Java
public int orangesRotting(int[][] grid) {
int m=grid.length, n=grid[0].length, fresh=0, minutes=0;
Queue<int[]> q = new LinkedList<>();
for (int r=0;r<m;r++) for (int c=0;c<n;c++) {
if (grid[r][c]==2) q.offer(new int[]{r,c,0});
else if (grid[r][c]==1) fresh++;
}
int[][] dirs = {{0,1},{0,-1},{1,0},{-1,0}};
while (!q.isEmpty()) {
int[] cur = q.poll(); int r=cur[0],c=cur[1],t=cur[2];
for (int[] d:dirs) {
int nr=r+d[0], nc=c+d[1];
if (nr>=0&&nr<m&&nc>=0&&nc<n&&grid[nr][nc]==1) {
grid[nr][nc]=2; fresh--; minutes=t+1; q.offer(new int[]{nr,nc,t+1});
}
}
}
return fresh==0?minutes:-1;
}
Complexity
- Time: O(m*n)
- Space: O(m*n)
Advertisement