一、题目
二、思路
首先将所有烂橘子入队,然后常规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 ;
}
} ;