LeetCode 994. 腐烂的橘子 [Hot 100] —— 多源BFS
中等
在给定的 m x n
网格 grid
中,每个单元格可以有以下三个值之一:
- 值
0
代表空单元格; - 值
1
代表新鲜橘子; - 值
2
代表腐烂的橘子。
每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。
返回 直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1
。
示例 1:
输入:grid = [[2,1,1],[1,1,0],[0,1,1]]
输出:4
示例 2:
输入:grid = [[2,1,1],[0,1,1],[1,0,1]]
输出:-1
解释:左下角的橘子(第 2 行, 第 0 列)永远不会腐烂,因为腐烂只会发生在 4 个方向上。
示例 3:
输入:grid = [[0,2]]
输出:0
解释:因为 0 分钟时已经没有新鲜橘子了,所以答案就是 0 。
多源BFS
class Solution {
public int orangesRotting(int[][] grid) {
if (grid == null || grid.length == 0) return 0;
int rows = grid.length;
int cols = grid[0].length;
int freshOranges = 0;
Queue<int[]> queue = new LinkedList<>();
// 初始化队列,将所有腐烂的橘子位置加入队列,并统计新鲜橘子数量
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (grid[i][j] == 2) {
queue.offer(new int[]{i, j});
} else if (grid[i][j] == 1) {
freshOranges++;
}
}
}
// 如果没有新鲜橘子,直接返回0
if (freshOranges == 0) return 0;
// 四个方向
int[][] directions = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
int minutes = 0;
// 多源BFS
while (!queue.isEmpty()) {
int size = queue.size();
boolean hasRotten = false;
// 处理当前队列中所有腐烂的橘子(同一时间步骤)
for (int i = 0; i < size; i++) {
int[] curr = queue.poll();
for (int[] dir : directions) {
int newRow = curr[0] + dir[0];
int newCol = curr[1] + dir[1];
// 检查边界和是否是新鲜橘子
if (newRow >= 0 && newRow < rows && newCol >= 0 && newCol < cols
&& grid[newRow][newCol] == 1) {
// 腐烂这个橘子
grid[newRow][newCol] = 2;
freshOranges--;
queue.offer(new int[]{newRow, newCol});
hasRotten = true;
}
}
}
// 如果本轮有橘子被腐烂,时间加1
if (hasRotten) {
minutes++;
}
}
// 如果还有新鲜橘子,返回-1,否则返回时间
return freshOranges == 0 ? minutes : -1;
}
}
版权申明
本文系作者 @xiin 原创发布在To Future$站点。未经许可,禁止转载。
暂无评论数据