自己是用模拟法写的,其实和题解bfs差不多,下面几个优化点
- 1.用队列装载腐烂橘子,并及时出队,队列为空,所有的感染橘子都完成任务
- 2.第一次遍历记录新鲜橘子个数,以这个数据为基础,判断新鲜橘子是否都可以被感染
和二叉树层级遍历几乎相同,注意一层的遍历时队列目前的元素个数
class Solution {
int[][] grid;
Queue<int[]> con = new LinkedList<>();
int freshCount = 0;
public int orangesRotting(int[][] grid) {
// 初始化
this.grid = grid;
int res = 0;
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[0].length; j++) {
int orange = grid[i][j];
if (orange == 1) freshCount++;
if (orange == 2) con.add(new int[]{i, j});
}
}
// 开始周期
while (freshCount > 0 && !con.isEmpty()) {
// 周期(遍历一层,并将这一层出队)
spread();
res++;
}
if (freshCount > 0) return -1;
else return res;
}
//四周的橘子
void spread() {
// System.out.println(con.size());
int size = con.size();
for (int i = 0; i < size; i++) {
int[] ar = con.poll();
int x = ar[0];
int y = ar[1];
deal(x, y + 1);
deal(x, y - 1);
deal(x - 1, y);
deal(x + 1, y);
}
}
// 改变橘子状态
void deal(int x, int y) {
// System.out.println(x+" "+y);
if (notOutBound(x, y) && grid[x][y] == 1) {
grid[x][y] = 2;
con.add(new int[]{x, y});
freshCount--;
}
}
boolean notOutBound(int x, int y) {
boolean condition_x = 0 <= x && x < grid.length;
boolean condition_y = 0 <= y && y < grid[0].length;
return condition_x && condition_y;
}
}