题目链接
腐烂的橘子
题目描述
注意点
- grid[i][j] 仅为 0、1 或 2
- 每分钟,腐烂的橘子周围4个方向上相邻的新鲜橘子都会腐烂
解答思路
- 广度优先遍历找到每分钟腐烂的橘子,将第i - 1分腐烂的橘子都添加到队列中,在第i分钟,第i - 1分腐烂的橘子相邻方向的新鲜橘子也会腐烂,重复该操作直到没有新鲜橘子或队列中没有腐烂橘子为止
代码
class Solution {
public int orangesRotting(int[][] grid) {
int res = 0;
int freshSum = 0;
int row = grid.length;
int col = grid[0].length;
int[][] direction = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
Deque<int[]> deque = new ArrayDeque<>();
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (grid[i][j] == 1) {
freshSum++;
}
if (grid[i][j] == 2) {
deque.offerLast(new int[]{i, j});
}
}
}
while (freshSum > 0 && !deque.isEmpty()) {
int size = deque.size();
for (int i = 0; i < size; i++) {
int[] loc = deque.pollFirst();
for (int j = 0; j < direction.length; j++) {
int x = loc[0] + direction[j][0];
int y = loc[1] + direction[j][1];
if (x >= 0 && x < row && y >= 0 && y < col && grid[x][y] == 1) {
grid[x][y] = 2;
freshSum--;
deque.offerLast(new int[]{x, y});
}
}
}
res++;
}
return freshSum == 0 ? res : -1;
}
}
关键点
- 广度优先遍历的思想
- 队列中只存储第i - 1分腐烂的橘子,在这之前腐烂的橘子应该已经出队
- 橘子腐烂需要同步将grid该位置的状态修改为腐烂,也就是2