You are given an m x n
grid
where each cell can have one of three values:
0
representing an empty cell,1
representing a fresh orange, or2
representing a rotten orange.
Every minute, any fresh orange that is 4-directionally adjacent to a rotten orange becomes rotten.
Return the minimum number of minutes that must elapse until no cell has a fresh orange. If this is impossible, return -1
.
Example 1:
Input: grid = [[2,1,1],[1,1,0],[0,1,1]]
Output: 4
Example 2:
Input: grid = [[2,1,1],[0,1,1],[1,0,1]]
Output: -1
Explanation: The orange in the bottom left corner (row 2, column 0) is never rotten, because rotting only happens 4-directionally.
Example 3:
Input: grid = [[0,2]]
Output: 0
Explanation: Since there are already no fresh oranges at minute 0, the answer is just 0.
Constraints:
m == grid.length
n == grid[i].length
1 <= m, n <= 10
grid[i][j]
is0
,1
, or2
.
這道題說給的一個 mxn
大小的格子上有些新鮮和腐爛的橘子,每一分鍾腐爛的橘子都會傳染給其周圍四個中的新鮮橘子,使得其也變得腐爛。現在問需要多少分鍾可以使得所有的新鮮橘子都變腐爛,無法做到時返回 -1。由於這里新鮮的橘子自己不會變腐爛,只有被周圍的腐爛橘子傳染才會,所以當新鮮橘子周圍不會出現腐爛橘子的時候,那么這個新鮮橘子就不會腐爛,這才會有返回 -1 的情況。這道題就是個典型的廣度優先遍歷 Breadth First Search,並沒有什么太大的難度,先遍歷一遍整個二維數組,統計出所有新鮮橘子的個數,並把腐爛的橘子坐標放入一個隊列 queue,之后進行 while 循環,循環條件是隊列不會空,且 freshLeft 大於0,使用層序遍歷的方法,用個 for 循環在內部。每次取出隊首元素,遍歷其周圍四個位置,越界或者不是新鮮橘子都跳過,否則將新鮮橘子標記為腐爛,加入隊列中,並且 freshLeft 自減1。每層遍歷完成之后,結果 res 自增1,最后返回的時候,若還有新鮮橘子,即 freshLeft 大於0時,返回 -1,否則返回 res 即可,參見代碼如下:
class Solution {
public:
int orangesRotting(vector<vector<int>>& grid) {
int res = 0, m = grid.size(), n = grid[0].size(), freshLeft = 0;
queue<vector<int>> q;
vector<vector<int>> dirs{{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
if (grid[i][j] == 1) ++freshLeft;
else if (grid[i][j] == 2) q.push({i, j});
}
}
while (!q.empty() && freshLeft > 0) {
for (int i = q.size(); i > 0; --i) {
auto cur = q.front(); q.pop();
for (int k = 0; k < 4; ++k) {
int x = cur[0] + dirs[k][0], y = cur[1] + dirs[k][1];
if (x < 0 || x >= m || y < 0 || y >= n || grid[x][y] != 1) continue;
grid[x][y] = 2;
q.push({x, y});
--freshLeft;
}
}
++res;
}
return freshLeft > 0 ? -1 : res;
}
};
Github 同步地址:
https://github.com/grandyang/leetcode/issues/994
類似題目:
參考資料:
https://leetcode.com/problems/rotting-oranges/
https://leetcode.com/problems/rotting-oranges/discuss/238681/Java-Clean-BFS-Solution-with-comments