一、题目
二、思路
- 首先将所有烂橘子入队,然后常规BFS遍历,注意
while
的截止条件除了队列为空,新鲜橘子数量大于0(没新鲜橘子也没必要继续遍历,保证时间计算的正确性),这两者一个不满足就可以停止 - 每分钟进行一次【腐烂扩散】,使用BFS对二维图进行遍历,注意和二叉树的层次遍历不一样(二叉树则是只有一个根节点,这里可能有多个腐烂橘子-根节点)。
auto [x, y] = q.front()
是C++17引入的新语法,结构化绑定,可以从数组、元组或结构体中一次性解包多个值,并将他们绑定到多个变量上,比如这里就是声明了x
和y
变量,然后将这2个变量绑定到元组中。如果不这么使用,可以直接通过first
和second
访问pair元素的数值。auto& dir: directions
是C++11的语法,&
表示引用,直接auto dir则是按值访问,前者可以避免不必要的复制,并且允许你修改容器的容器。
三、代码
class Solution {
public:int orangesRotting(vector<vector<int>>& grid) {int m = grid.size();int n = grid[0].size();vector<pair<int, int>> directions = {{0,1}, {0,-1}, {1,0},{-1,0}};int fresh_num = 0;queue<pair<int, int>>q;for(int i=0; i < m;i++){for(int j=0; j < n; j++){if (grid[i][j] == 1)fresh_num += 1;if (grid[i][j] == 2)q.push({i, j});}}int minutes = 0;while(!q.empty() && fresh_num > 0){int q_num = q.size();for(int i=0; i< q_num; i++){ pair<int, int>one = q.front();q.pop(); int x = one.first;int y = one.second;for(auto& dir: directions){int nx = x + dir.first;int ny = y + dir.second;if(nx >= 0 && nx < m && ny >= 0 && ny < n && grid[nx][ny] == 1){ grid[nx][ny] = 2;q.push({nx, ny});fresh_num -= 1;}}}minutes += 1;}return fresh_num == 0?minutes:-1;}
};