Featured image of post Rotting Oranges

Rotting Oranges

994. 腐烂的橘子

分析

  1. 初始状态
    • 遍历整个网格 grid,找到所有腐烂橘子(值为 2),并将其坐标加入队列 q
    • 初始化时间计数器 res-1,表示腐烂传播的分钟数
  2. 广度优先搜索BFS扩散
    • 使用 BFS 模拟腐烂橘子的扩散过程,每次遍历队列中的腐烂橘子,将其四周的相邻新鲜橘子(值为 1)腐烂,并将新腐烂的橘子加入队列
    • 每完成一次队列的扩散操作,时间计数器 res1
  3. 检查剩余新鲜橘子
    • 遍历网格,若仍存在新鲜橘子(值为 1),返回 -1
    • 否则返回 res,表示所有橘子腐烂所需的最小分钟数

时间复杂度

  • 遍历网格:初始状态下遍历所有单元格 O(n * m)
  • BFS 扩散:每个橘子最多入队一次,时间复杂度为 O(n * m)

总时间复杂度 O(n * m)

空间复杂度

  • 队列:队列中存储橘子的坐标,最多为 O(m * n)

总空间复杂度:O(m * n)

C++代码

 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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
class Solution
{
public:
    int orangesRotting(vector<vector<int>>& grid)
    {
        using PII = std::pair<int, int>;
        std::queue<PII> q;
        int n = grid.size(), m = grid[0].size();

        // 将所有初始腐烂橘子的坐标加入队列
        for (int i = 0; i < n; ++i)
            for (int j = 0; j < m; ++j)
                if (grid[i][j] == 2)
                    q.push({i, j});

        int res = 0;
        if (!q.empty()) --res; // 队列非空,初始化分钟数为 -1
        int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};

        // BFS 扩散腐烂
        while (!q.empty()) {
            ++res; // 每遍历一层队列,时间加 1
            int len = q.size();
            while (len--) {
                PII tmp = q.front();
                q.pop();
                int x = tmp.first, y = tmp.second;

                // 遍历四个方向
                for (int i = 0; i < 4; ++i) {
                    int a = x + dx[i], b = y + dy[i];
                    if (a < 0 || a >= n || b < 0 || b >= m || grid[a][b] != 1)
                        continue;
                    q.push({a, b});     // 加入新腐烂的橘子
                    grid[a][b] = 2;     // 标记为腐烂
                }
            }
        }

        // 检查是否有剩余新鲜橘子
        for (int i = 0; i < n; ++i)
            for (int j = 0; j < m; ++j)
                if (grid[i][j] == 1)
                    return -1; // 仍有新鲜橘子,返回 -1

        return res; // 返回所需的分钟数
    }
};
Built with Hugo
Theme Stack designed by Jimmy