java
994. 腐烂的橘子
在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一:
值 0 代表空单元格;
值 1 代表新鲜橘子;
值 2 代表腐烂的橘子。
每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。
返回 直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1 。
官方答案看不懂,没注释。找到个好一点能看懂的解答
代码是这个网址评论区的
思路bfs。将所有腐烂的句子入队列。然后每次循环都将队列弹出至空,并将这次传染的所有橘子入队列。也就是将同一分钟腐烂的同时出队,下一分钟腐烂的橘子同时入队。很像二叉树层次遍历的感觉。
最初ans=-1是因为最后一次腐烂完的橘子入队后,还需要循环一次把队列清空,这时候ans+1了,但是它清空之后没有能腐烂的橘子了,所以多加了1,最初就用的-1. 因为这个-1的存在还需要Math.max(res, 0),最初就没有腐烂的橘子时ans一直是-1,其实答案是0.
java
class Solution {
static int[][] changes = new int[][] { { -1, 0 }, { 1, 0 }, { 0, 1 }, { 0, -1 } };
public int orangesRotting(int[][] grid) {
int m = grid.length;
int n = grid[0].length;
// 坏橘子队列 [i,j]
Deque<int[]> queue = new ArrayDeque<>();
// 好橘子数量
int goodCount = 0;
// 遍历所有橘子
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
int x = grid[i][j];
if (x == 2) {
queue.add(new int[] { i, j });
} else if (x == 1) {
goodCount++;
}
}
}
int res = -1;
// BFS遍历
while (!queue.isEmpty()) {
int size = queue.size();
while (size-- > 0) {
int[] p = queue.poll();
int x = p[0];
int y = p[1];
for (int i = 0; i < changes.length; i++) {
int nx = x + changes[i][0];
int ny = y + changes[i][1];
// 向四周污染
if (nx >= 0 && nx <= m - 1 && ny >= 0 && ny <= n - 1 && grid[nx][ny] == 1) {
grid[nx][ny] = 2;
// 将新的坏橘子放入队列
queue.add(new int[] { nx, ny });
goodCount--;
}
}
}
res++;
}
return goodCount == 0 ? Math.max(res, 0) : -1;
}
}