原题链接🔗:腐烂的橘子
难度:中等⭐️⭐️
题目
在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一:
- 值 0 代表空单元格;
- 值 1 代表新鲜橘子;
- 值 2 代表腐烂的橘子。
每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。
返回 直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1 。
示例 1:
输入:grid = [[2,1,1],[1,1,0],[0,1,1]]
输出:4
示例 2:
输入:grid = [[2,1,1],[0,1,1],[1,0,1]]
输出:-1
解释:左下角的橘子(第 2 行, 第 0 列)永远不会腐烂,因为腐烂只会发生在 4 个方向上。
示例 3:
输入:grid = [[0,2]]
输出:0
解释:因为 0 分钟时已经没有新鲜橘子了,所以答案就是 0 。
提示:
- m == grid.length
- n == grid[i].length
- 1 <= m, n <= 10
- grid[i][j] 仅为 0、1 或 2
题解
- 解题思路:
LeetCode 上的 “腐烂的橘子” 问题是一个模拟问题,属于中等难度。这个问题的目的是模拟一个过程,其中一些橘子可能开始腐烂,并且腐烂的橘子可以影响周围的橘子,使它们也腐烂。
问题描述: 在一个给定的二维数组中,每个单元格可以包含一个未腐烂的橘子(用 1 表示)或者一个腐烂的橘子(用 2 表示)。每分钟,任何与腐烂的橘子相邻的未腐烂的橘子都会腐烂。注意,腐烂的橘子不会继续腐烂。你需要找出使所有橘子腐烂所需的最少分钟数。
解题思路:
- 分析问题:首先,我们需要理解问题的要求和橘子腐烂的规则。
- 初始化:记录所有腐烂橘子的位置和数量。
- 模拟过程:
- 从腐烂的橘子开始,每分钟检查它们周围的橘子,如果它们是未腐烂的,就将它们标记为腐烂。
- 同时记录下所有未腐烂的橘子,因为它们可能在下一轮被腐烂的橘子影响。
- 更新状态:每分钟结束后,更新所有腐烂橘子的状态,并将之前未腐烂的橘子标记为腐烂。
- 循环结束条件:如果所有的橘子都腐烂了,结束循环。
- 返回结果:返回循环的轮数,即所需的最少分钟数。
算法步骤:
- 记录初始状态:找到所有腐烂橘子的位置,并记录未腐烂橘子的数量。
- 模拟腐烂过程:
- 对于每个腐烂的橘子,检查其上下左右四个方向的橘子。
- 如果发现未腐烂的橘子,将其标记为腐烂,并更新未腐烂橘子的计数。
- 更新时间:每分钟结束时,所有标记为腐烂的橘子都变为腐烂状态。
- 检查结束条件:如果未腐烂的橘子计数为0,即所有橘子都已腐烂,返回当前分钟数。
- 重复步骤2-4,直到所有橘子都腐烂。
- c++ demo:
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
class Solution {
public:
int orangesRotting(vector<vector<int>>& grid) {
int row = grid.size();
if (row == 0) return 0;
int col = grid[0].size();
queue<pair<int, int>> rotten;
vector<vector<int>> fresh(row, vector<int>(col, 0));
int totalFresh = 0, minutes = 0;
// 计算初始腐烂和新鲜橘子的数量
for (int i = 0; i < row; ++i) {
for (int j = 0; j < col; ++j) {
if (grid[i][j] == 2) {
rotten.push({ i, j });
}
else if (grid[i][j] == 1) {
totalFresh++;
fresh[i][j] = 1;
}
}
}
// 四个方向的移动
vector<pair<int, int>> directions = { {0, 1}, {1, 0}, {0, -1}, {-1, 0} };
while (!rotten.empty() && totalFresh > 0) {
int size = rotten.size();
for (int k = 0; k < size; ++k) {
auto [x, y] = rotten.front();
rotten.pop();
for (auto& dir : directions) {
int newX = x + dir.first, newY = y + dir.second;
if (newX >= 0 && newX < row && newY >= 0 && newY < col && fresh[newX][newY] == 1) {
fresh[newX][newY] = 0;
totalFresh--;
rotten.push({ newX, newY });
}
}
}
minutes++;
}
return totalFresh == 0 ? minutes : -1;
}
};
int main() {
Solution solution;
vector<vector<int>> grid = {
{2, 1, 1},
{1, 1, 0},
{0, 1, 1}
};
cout << "Minimum minutes required for all oranges to rot: " << solution.orangesRotting(grid) << endl;
return 0;
}
- 输出结果:
Minimum time to rot all oranges: 4
- 代码仓库地址:orangesRotting