🧩Algo 图论
994. 腐烂的橘子
难度:🟡 Medium | 标签:图论、BFS | 状态:⬜ LeetCode 链接
思路
多源 BFS:所有腐烂橘子先入队,按层扩散。 答案 = 最后一层的层数;扩散完仍有新鲜橘子 → 返回 -1。
代码
class Solution {
public:
int orangesRotting(vector<vector<int>>& g) {
int R = g.size(), C = g[0].size(), fresh = 0;
queue<pair<int,int>> q;
for (int i = 0; i < R; ++i)
for (int j = 0; j < C; ++j) {
if (g[i][j] == 2) q.push({i, j});
else if (g[i][j] == 1) ++fresh;
}
int t = 0, dr[] = {1, -1, 0, 0}, dc[] = {0, 0, 1, -1};
while (!q.empty() && fresh) {
int sz = q.size();
for (int i = 0; i < sz; ++i) {
auto [r, c] = q.front(); q.pop();
for (int d = 0; d < 4; ++d) {
int nr = r + dr[d], nc = c + dc[d];
if (nr < 0 || nc < 0 || nr >= R || nc >= C || g[nr][nc] != 1) continue;
g[nr][nc] = 2;
--fresh;
q.push({nr, nc});
}
}
++t;
}
return fresh ? -1 : t;
}
};
复杂度
- 时间 O(R · C),空间 O(R · C)
易错 / 回顾
- 没有新鲜橘子时返回 0,不是 -1
- BFS 推进要按”层”,t 才是最少分钟数
- 不要单源 BFS——会错(多个腐烂橘子可能同时影响)
Related · 图论