題目: LeetCode - 994. Rotting Oranges
題目說明
給一個二維陣列,裡面只含有 0、1、2。0 代表該座標沒有東西,1 代表該座標有一顆正常的橘子,2 代表該座標有一顆腐敗的橘子,腐敗的橘子每經過一天會使得上下左右四顆橘子也腐敗,求讓所有橘子都腐敗需要的天數,若無法使所有橘子腐敗就回傳 -1。
解題思路
先遍歷一次整個陣列,紀錄新鮮橘子的個數,腐敗橘子的座標使用 Queue 存放。接著把所有座標拿出並感染上下左右正常的橘子,再把新腐敗的橘子座標存入 Queue,清空一次 Queue 代表經過了一天,最後判斷是否還有未腐敗的橘子即可。
參考解法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| class Solution { public: int orangesRotting(vector<vector<int>>& grid) { int height = grid.size(), width = grid[0].size(), fresh = 0, days = 0; int offset[] = {1, 0, -1, 0, 1}; queue<pair<int, int>> _q; for(int i = 0; i < height; ++i) for(int j = 0; j < width; ++j) if(grid[i][j] == 1) ++fresh; else if(grid[i][j] == 2) _q.emplace(j, i); while(!_q.empty() && fresh) { int size = _q.size(); while(size--) { int x = _q.front().first, y = _q.front().second; _q.pop(); for(int i = 0; i < 4; ++i) { int dx = x + offset[i], dy = y + offset[i + 1]; if(dx < 0 || dx >= width || dy < 0 || dy >= height || grid[dy][dx] != 1) continue; --fresh; grid[dy][dx] = 2; _q.emplace(dx, dy); } } ++days; } return fresh ? -1 : days; } };
|
2020-08-19 重寫
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| class Solution { public: int orangesRotting(vector<vector<int>>& grid) { int height = grid.size(), width = grid[0].size(), fresh = 0, days = 0, size; int offset[] = {1, 0, -1, 0, 1}; queue<pair<int, int>> q; for(int i = 0; i < height; ++i) for(int j = 0; j < width; ++j) if(grid[i][j] == 1) ++fresh; else if(grid[i][j] == 2) q.emplace(j, i); while((size = q.size()) && fresh && ++days) while(size--) { auto [x, y] = q.front(); q.pop(); for(int i = 0; i < 4; ++i) { int dx = x + offset[i], dy = y + offset[i + 1]; if(dx < 0 || dx >= width || dy < 0 || dy >= height || grid[dy][dx] != 1) continue; grid[dy][dx] = 2; --fresh; q.emplace(dx, dy); } } return fresh ? -1 : days; } };
|