Multi-source BFS
Time O(rows × cols) Space O(rows × cols)Queue all 2s, count 1s. Process level by level; each level that rots something is one minute. At the end, if fresh > 0 return −1.
import java.util.*;
class Solution {
public int orangesRotting(int[][] grid) {
int m = grid.length, n = grid[0].length, fresh = 0;
Deque<int[]> q = new ArrayDeque<>();
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});
else if (grid[r][c] == 1) fresh++;
}
int[][] dirs = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
int minutes = 0;
while (!q.isEmpty() && fresh > 0) {
minutes++;
for (int size = q.size(); size > 0; size--) {
int[] cell = q.poll();
for (int[] d : dirs) {
int r = cell[0] + d[0], c = cell[1] + d[1];
if (r < 0 || c < 0 || r >= m || c >= n || grid[r][c] != 1) continue;
grid[r][c] = 2;
fresh--;
q.offer(new int[]{r, c});
}
}
}
return fresh == 0 ? minutes : -1;
}
}Verdict: One BFS for all sources.