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