
/**
腐烂传染:每次腐烂的橘子会传染其四周的橘子,一共需要多少次所有橘子都腐烂。
广搜BFS:
首先遍历grid,将所有"腐烂的橘子"添加到队列中,记录当前队列中元素个数(区分圈层)。
再依次取出当前队列中的元素,并将其四周的"橘子"入队,修改状态为腐烂。
重复上述过程知道队列为空,代表全部腐烂,每圈代表传染一次,自增记录即可。
访问过的"橘子"设置为2,避免重复访问。
细节优化:
初始化时维护变量 freshCount判断初始有无新鲜橘子,以及处理结束后是否还有无法被感染的橘子。
维护布尔变量 isEventOccurred判断该轮是否有橘子被感染,有才自增结果;
false代表已经全部感染或有无法被感染的,此时无需增加结果
*/
class Solution {
private int res;
//避免重复传参
private int[][] grid;
private int row;
private int column;
public int orangesRotting(int[][] grid) {
/**
腐烂传染:每次腐烂的橘子会传染其四周的橘子,一共需要多少次所有橘子都腐烂。
广搜BFS:
首先遍历grid,将所有"腐烂的橘子"添加到队列中,记录当前队列中元素个数(区分圈层)。
再依次取出当前队列中的元素,并将其四周的"橘子"入队,修改状态为腐烂。
重复上述过程知道队列为空,代表全部腐烂,每圈代表传染一次,自增记录即可。
访问过的"橘子"设置为2,避免重复访问。
细节优化:
初始化时维护变量 freshCount判断初始有无新鲜橘子,以及处理结束后是否还有无法被感染的橘子。
维护布尔变量 isEventOccurred判断该轮是否有橘子被感染,有才自增结果;
false代表已经全部感染或有无法被感染的,此时无需增加结果
*/
this.grid = grid;
this.row = grid.length;
this.column = grid[0].length;
//记录新鲜橘子数
int freshCount = 0;
//便于处理 方向的转换
int[][] directions = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
//初始化 遍历,将所有"腐烂的橘子"入队
Queue<int[]> queue = new ArrayDeque<>();
for(int i = 0; i < row; i++) {
for(int j = 0; j < column; j++) {
if(grid[i][j] == 2) {
queue.add(new int[]{i,j});
} else if(grid[i][j] == 1) {
freshCount++;
}
}
}
if(freshCount == 0) return 0; //初始无新鲜橘子
//开始处理
while(!queue.isEmpty()) {
//记录当前size 区分圈层
int size = queue.size();
boolean isEventOccurred = false;
//处理当前层
for(int i = 0; i < size; i++) {
int[] curr = queue.poll();
int x = curr[0];
int y = curr[1];
//处理四个方向
for(int[] dic : directions) {
int newX = x + dic[0];
int newY = y + dic[1];
//边界限制 是否有被感染的橘子
if(newX >= 0 && newX < row && newY >= 0 && newY < column && grid[newX][newY] == 1) {
//被感染 维护各变量
grid[newX][newY] = 2;
isEventOccurred = true;
freshCount--;
queue.add(new int[]{newX,newY});
}
}
}
if(isEventOccurred) {
res++;
}
}
if(freshCount > 0) return -1;
return res;
}
}
231

被折叠的 条评论
为什么被折叠?



