leetcode994 腐烂的橘子

一、问题描述

二、解题思路

由于本题的腐烂操作为就近、同时并且需要求最小分钟数,所以本题本质上是一个多源bfs问题,多源bfs的核心在出队列时对批次进行计数,而不是按单纯节点数进行计数,解题思路如下:

(1)首先,遍历grid,统计橘子的总数,将腐烂的橘子加入队列;

(2)接下来进行多源bfs广度优先搜索:

<1>统计当前队列中元素的数量,即当前分钟能进行辐射腐烂的橘子数量。更新orange的值为当前新鲜的橘子数量。bool变量rotted用于标记当前分钟是否有橘子腐烂;

<2>将当前队列中的所有元素出队,于此同时,将其四周新鲜的橘子加入队列,即进行腐烂操作,如果本轮进行了腐烂操作,就将rotted更新为true。本分钟的腐烂操作完成后,根据rotted的值更新time;

<3>如果orange==0,即新鲜的橘子数量为0,就返回time。否则,表示不可能全部腐烂。返回-1。

三、代码实现

cpp 复制代码
class Solution {
    int N,M;
    vector<vector<bool>> visited;
public:
    int orangesRotting(vector<vector<int>>& grid) {
        //多源BFS->按批次计数
        //全局变量初始化
        N=grid.size();
        M=grid[0].size();

        queue<pair<int,int>> q;
        int orange=0;
        //统计橘子的数量,将腐烂的橘子加入队列
        for(int i=0;i!=N;i++)
            for(int j=0;j!=M;j++){
                if(grid[i][j]==1) orange++;
                else if(grid[i][j]==2){
                    q.push({i,j});
                    orange++;
                }
            }

        int dx[4]={0,1,0,-1};
        int dy[4]={-1,0,1,0};
        int time=0;
        while(!q.empty()){
            //当前分钟腐烂的橘子数
            int bad=q.size();
            orange-=bad;
            //本轮是否腐烂新橘子
            bool rotted=false;
            while(bad--){
                pair<int,int> cur=q.front();q.pop();
                int cur_x=cur.first;
                int cur_y=cur.second;
                for(int i=0;i!=4;i++){
                    int new_x=cur_x+dx[i];
                    int new_y=cur_y+dy[i];
                    if(new_x>=0&&new_x<N&&new_y>=0&&new_y<M&&grid[new_x][new_y]==1){
                        q.push({new_x,new_y});
                        grid[new_x][new_y]=2;
                        rotted=true;
                    }
                }
            }
            if(rotted) time++;
        }
        return orange==0?time:-1;
    }
};
相关推荐
船厂电气自动化ai大模型几秒前
AI大模型与数学/第63课:矩阵定义、矩阵加法、标量乘法(逐级精讲)
数据结构·人工智能·深度学习·线性代数·算法
余额瞒着我当琳13 分钟前
算法修炼 chapter 2 双指针进阶、盛最多水的容器、有效三角形的个数、两数之和、三数之和、四数之和
算法
你压到我腿毛了66615 分钟前
C语言冒泡算法(Bubble sort)
c语言·数据结构·算法
xxwxx__1 小时前
C++ list 深度解析:从使用原理到模拟实现
开发语言·c++·list
Chester_19991 小时前
CSP202303C.LDAP
开发语言·c++·蓝桥杯·stl
靠沿1 小时前
贪心算法专题(三)
算法·贪心算法
super大力张1 小时前
MOE基于结构的药物设计(七):Ligand R-Vectors——如何判断配体可以从哪里继续生长?
数据库·算法·cadd·moe·svl·基于结构的药物设计
j7~2 小时前
【C++】《unordered系列关联式容器以及哈希底层、哈希冲突、闭散列与开散列完整解析》
c++·哈希算法·开散列·闭散列·unordered_map·unordered_set·哈希底层结构
Tongsr2 小时前
别只混淆代码:用 Kaleido 加固整个 Android Release AAB
前端·算法·github
高亦真2 小时前
今天是学习嵌入式的第34天
linux·学习·算法