LeetCode 每日一题 ---- 【994. 腐烂的橘子】
994.腐烂的橘子
方法:多源BFS
昨天没吃完的橘子今天就坏掉了
可算是掉进橘子窝了
题目提到了一个腐烂掉全部橘子所需要的最小分钟,其实只需要满足从上往下每一步都尽最大可能腐烂到所有橘子就可以满足答案的最小分钟
一个多源BFS,第一步统计初始新鲜的橘子和腐烂的橘子,并将腐烂的橘子放入到队列 q 中,然后从 q 中取出腐烂的橘子,并向四个方向腐烂扩散,然后将新腐烂的橘子再放入到队列 q 中,直到 q 空,并且每次新腐烂橘子后前面维护的新鲜橘子的数量就减1,若最后新鲜橘子的数量不为0,则说明有的橘子不能被腐烂到,则返回 -1。
java
class Solution {
private static final int[][] DIRECTIONS = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
public int orangesRotting(int[][] grid) {
int m = grid.length;
int n = grid[0].length;
int fresh = 0;
List<int[]> q = new ArrayList<>();
for (int i = 0; i < m; i ++ ) {
for (int j = 0; j < n; j ++ ) {
if (grid[i][j] == 1) {
// 新鲜的个数
fresh ++ ;
} else if (grid[i][j] == 2) {
// 一开始就腐烂的橘子
q.add(new int[]{i, j});
}
}
}
int ans = -1;
while (!q.isEmpty()) {
ans ++ ;
List<int[]> tmp = q;
q = new ArrayList<>();
for (int[] pos : tmp) {
for (int[] d : DIRECTIONS) {
int i = pos[0] + d[0];
int j = pos[1] + d[1];
if (0 <= i && i < m && 0 <= j && j < n && grid[i][j] == 1) {
fresh -- ;
grid[i][j] = 2;
q.add(new int[]{i, j});
}
}
}
}
return fresh > 0 ? -1 : Math.max(ans, 0);
}
}
时间复杂度:
O(mn)
空间复杂度:
O(mn)