力扣刷题——994. 腐烂的橘子 (待继续学习
994. 腐烂的橘子
这题同样打算用广度优先搜索来做,感觉难点在于记录bfs的深度
开始时写成这样
class Solution {
int[][] dirs = new int[][] { { 0, 1 }, { 0, -1 }, { 1, 0 }, { 1, -1 } };// 方向偏移量
public int orangesRotting(int[][] grid) {
int ans = 0;
boolean flag[][] = new boolean[grid.length][grid[0].length];// 记录遍历过的位置不再遍历,减小时间复杂度xxx
Queue<int[]> queue = new LinkedList<>();// 储存烂苹果的位置
// 先找到所有烂橘子的位置
for (int i = 0; i < grid.length; ++i) {
for (int j = 0; j < grid[0].length; ++j) {
if (grid[i][j] == 2) {
queue.offer(new int[] { i, j });
flag[i][j] = true;
}
}
}
while (!queue.isEmpty()) {
int[] tmp = queue.poll();
int x = tmp[0], y = tmp[1];
// 遍历四个方向
for (int i = 0; i < 4; ++i) {
int nx = x + dirs[i][0], ny = y + dirs[i][1];// 偏移后的坐标
// 检查边界
if (nx >= 0 && ny >= 0 && nx < grid.length && ny < grid[0].length && grid[nx][ny] == 1
&& flag[nx][ny] == false) {
queue.offer(new int[] {nx, ny});
flag[nx][ny] = true;
}
}
// 时间增加
ans++;
}
// 遍历检查是否还有新鲜橘子
for (int i = 0; i < grid.length; ++i) {
for (int j = 0; j < grid[0].length; ++j) {
if (grid[i][j] == 1) {
return -1;
}
}
}
return ans;
}
}
后来看网上总结,要把每一层的都一次性拿出来遍历
class Solution {
int[][] dirs = new int[][] { { 0, 1 }, { 0, -1 }, { 1, 0 }, { -1, 0 } };// 方向偏移量
public int orangesRotting(int[][] grid) {
int ans = 0;
Queue<int[]> queue = new LinkedList<>();// 储存烂苹果的位置
// 先找到所有烂橘子的位置
for (int i = 0; i < grid.length; ++i) {
for (int j = 0; j < grid[0].length; ++j) {
if (grid[i][j] == 2) {
queue.offer(new int[] { i, j });
}
}
}
while (!queue.isEmpty()) {
int size = queue.size();//当前层的橘子数量
for (int i = 0; i < size; ++i) {//取出当前层的所有橘子
int[] tmp = queue.poll();
int x = tmp[0], y = tmp[1];
// 遍历四个方向
for (int j = 0; j < 4; ++j) {
int nx = x + dirs[j][0], ny = y + dirs[j][1];// 偏移后的坐标
// 检查边界
if (nx >= 0 && ny >= 0 && nx < grid.length && ny < grid[0].length && grid[nx][ny] == 1) {
grid[nx][ny] = 2;
queue.offer(new int[] {nx, ny});
}
}
}
//注意一开始的第一层烂橘子不需要时间腐烂
if (!queue.isEmpty()) {
// 时间增加
ans++;
}
}
// 遍历检查是否还有新鲜橘子
for (int i = 0; i < grid.length; ++i) {
for (int j = 0; j < grid[0].length; ++j) {
if (grid[i][j] == 1) {
return -1;
}
}
}
return ans;
}
}
posted on 2023-02-19 17:55 pumpkinsBig 阅读(44) 评论(0) 收藏 举报
浙公网安备 33010602011771号