leecode热题100---994:腐烂的橘子

news2024/12/23 17:56:55

题目
在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一:

值 0 代表空单元格;
值 1 代表新鲜橘子;
值 2 代表腐烂的橘子。
每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。

返回 直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1 。
在这里插入图片描述
C++:

//一般当一个对象有多个属性的时候,我们会用结构体stuct写多个属性,而当只有两个属性的时候,就可以使用pair.
//pair<int, int> P;        //对象P有两个属性,都是int类型

// 思路:bfs 广度优先搜索 首先将烂橘子坐标全放到队列中去。进而广度优先搜索,进行判定。可以看代码注释。


class Solution
{
public:
	int badorange(vector<vector<int>>& gride)
	{
		// bfs 广度优先,将腐烂橘子的坐标放到队列中
		int m = gride.size();
		int n = gride[0].size();
		queue<pair<int, int>>q; // 存放腐烂橘子的坐标
		bool flag = false;      // 记录是否有好橘子,若无则直接返回0
		int goodnums = 0;
		for (int i = 0; i < m; i++)
		{
			for (int j = 0; j < n; j++)
			{
				if (gride[i][j] == 2)
				{
					q.push({ i, j });
				}
				else if (gride[i][j] == 1)
				{
					flag = true;
					goodnums++;      // 好橘子的数量
				}
			}
		}
		if (!flag)  return 0;
		int time = 0;
		while (!q.empty())
		{
			int qLen = q.size();
			flag = false;   // 记录本回合是否有好橘子变烂,若无则可直接返回,时间不进行+1
			for (int i = 0; i < qLen; i++)
			{
				[x, y] = q.front();
				q.pop();
				// 判断腐烂橘子的上下左右是否有新鲜橘子
				if (x > 0 && gride[x - 1][y] == 1)
				{
					flag = true;
					gride[x - 1][y] = 2;	// 新鲜橘子变烂
					goodnums--;				// 新鲜橘子-1
					q.push({ x - 1, y });	// 新的烂橘子坐标
				}
				if (x < m - 1 && gride[x + 1][y] == 1)
				{
					flag = true;
					gride[x + 1][y] = 2;
					goodnums--;
					q.push({ x + 1, y });
				}
				if (y > 0 && gride[x][y - 1] == 1)
				{
					flage = true;
					gride[x][y - 1] = 2;
					goodnums--;
					q.push({ x, y - 1 });
				}
				if (y < n - 1 && gride[x][y - 1] == 1)
				{
					flage = true;
					gride[x][y - 1] = 2;
					goodnums--;
					q.push({ x, y - 1 });
				}
			}
			if (flag = true)
			{
				time++;
			}
			else
				break;	// 本回合无新鲜橘子变烂,直接返回
		}
		if (goodnums == 0)
		{
			return time;
		}
		else
			return -1;
	}
};

python:

思路

# 1、先遍历一次数组获取腐烂橘子的位置,以及新鲜橘子的位置分别存在mold和fresh中
# 2、此时若没有mold且没有fresh则证明为空,返回0;若仅没有mold则证明永远不会腐烂,返回-1
# 3、接着遍历mold中的所有坐标,check他们的上下左右,如果在fresh中则该坐标需要从fresh中取出,并且加入mold。
# 4、一轮遍历完成让count++,如果mold此时为空则可以停止,mold中仍有坐标则循环3中的遍历
# 5、返回时检查fresh,如果fresh为空则说明所有橘子已经腐烂,返回count值即可,仍有fresh说明永远有橘子无法腐烂

class Solution:
    def orangesRotting(self, grid):
        maxi = len(grid)
        maxj = len(grid[0])
            
        count = -1
        mold = []
        tmp = []
        fresh = set()
        # 遍历grid获取新鲜橘子坐标fresh,腐烂坐标mold
        for i in range(maxi):
            for j in range(maxj):
                if grid[i][j] == 1:
                    fresh.add((i,j))
                elif grid[i][j] == 2:
                    mold.append([i,j])
        # 此时若没有mold且没有fresh则证明为空,返回0;若仅没有mold则证明永远不会腐烂,返回-1
        if not mold and not fresh: return 0
        if not mold: return -1

        # 腐烂橘子的函数
        def check(i, j):
            if (i,j) in fresh:
                fresh.remove((i,j))
                tmp.append((i,j))
        
        # 每轮循环检查mold中坐标的上下左右是否可以腐烂
        while mold != []:
            for x in mold:
                check(x[0]-1,x[1])
                check(x[0]+1,x[1])
                check(x[0],x[1]-1)
                check(x[0],x[1]+1)
            mold = tmp
            tmp = []
            count += 1
        
        # 如果fresh为空则说明所有橘子已经腐烂,返回count值即可,仍有fresh说明永远有橘子无法腐烂
        if len(fresh) == 0:
            return count
        else: return -1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1690351.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ABP.VNET 项目结构

想要了解ABP分层架构&#xff1a;ABP分层架构-CSDN博客 可以看此篇文章 apb.vnet 生成的项目的目录结构 .Application 项目 应用服务用于将领域(业务)逻辑暴露给展现层。 展现层通过传入DTO(数据传输对象)参数来调用应用服务&#xff0c;而应用服务通过领域对象来执行相应的…

webSocket+Node+Js实现在线聊天(包含所有代码)

这篇文章主要介绍了如何使用 webSocket、Node 和 Js 实现在线聊天功能。 重要亮点 &#x1f4bb; 技术选型&#xff1a;使用 Node.js 搭建服务器&#xff0c;利用 Express 框架和 Socket.io 库实现 WebSocket 通信。 &#x1f4c4; 实现思路&#xff1a;通过建立数组存储聊天…

Go语言直接使用Windows的IOCP API写一个echo服务器

Go的标准库中Windows下的网络是使用了IOCP的&#xff0c;参见go源码go/src/runtime/netpoll_windows.go&#xff0c;标准库为了与Epoll、kqueue等不同平台的IO模式使用统一的API&#xff0c;进行了封装。 如果想直接使用Windows的IOCP API编程&#xff0c;比如想按照&#xff…

场内期权怎么开户?佣金手续费最低是多少?

今天期权懂带你了解场内期权怎么开户&#xff1f;佣金手续费最低是多少&#xff1f;我国的首个场内期权是50ETF期权&#xff0c;随着投资者对期权产品日渐熟悉&#xff0c;投资者参与数量与交易量稳步增长。 场内期权怎么开户&#xff1f; 满足资金要求&#xff1a;根据监管要…

DLT645-97/07通信规约 | 报文解析 | 组织报文与解析报文(C++)

文章目录 一、DLT645通信规约1.DLT645-1997通信规约2.DLT645-2007通讯规约3.DLT645-1997与DLT645-2007的区别 二、DLT645通信规约报文解析1.DLT645-1997通信规约报文解析2.DLT645-2007通信规约报文解析 三、C代码组织报文与解析报文 一、DLT645通信规约 DLT645协议&#xff0c;…

LeetCode 131题详解:高效分割回文串的递归与动态规划方法

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容&#xff0c;和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣&#xff01; 推荐&#xff1a;数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航&#xff1a; LeetCode解锁100…

每日一题(1)

在看一本08年出版的书的时候&#xff0c;看到了这样一个问题&#xff0c;感觉答案很奇怪&#xff1a; public class demo_p22 {public static void main(String args[]){int sCook1,sFish2;//各技能标记character ch1new character();if(ch1.haveSkill(sCook))System.out.print…

大数据量上传FTP

背景 笔者有一个需求是把将近一亿条数据上传到FTP服务器中&#xff0c;这些数据目前是存储在mysql中&#xff0c;是通过关联几张表查询出来的&#xff0c;查询出来的数据结果集一共是6个字段。要求传输的时候拆分成一个个小文件&#xff0c;每个文件大小不能超过500M。我的测试…

谷歌蜘蛛池是什么?

或称为谷歌爬虫池&#xff0c;是一项专门针对谷歌搜索引擎优化&#xff08;SEO&#xff09;的先进技术&#xff0c;这种技术的主要目的是通过建立庞大的网站群体和复杂的链接结构来吸引和维持谷歌的爬虫程序的注意力&#xff0c;其核心是通过这种结构优化&#xff0c;增强特定网…

使用B2M 算法批量将可执行文件转为灰度图像

参考论文 基于二进制文件的 C 语言编译器特征提取及识别 本实验使用 B2M 算法将可执行文件转为灰度图像&#xff0c;可执行文件转为灰度图的流程如图 4-3 所示。将 可执行文件每 8 位读取为一个无符号的的整型常量&#xff0c;一个可执行文件得到一个一维向量&#xff0c; …

mac版本Phpstudy本地环境安装Discuz教程【2024】

此方法适用于m1版本的mac版本Phpstudy本地环境安装Discuz&#xff0c;当然同样使用更高版本的mac端。网上各种安装教程参差不齐&#xff0c;根本解决不了小白的入门需求&#xff0c;以下是最新且直接明了的安装教程。 Phpstudy本地环境安装Discuz教程&#xff1a; 1、安装Phps…

1075: 求最小生成树(Prim算法)

解法&#xff1a; 总结起来&#xff0c;Prim算法的核心思想是从一个顶点开始&#xff0c;一步一步地选择与当前最小生成树相邻的且权值最小的边&#xff0c;直到覆盖所有的顶点&#xff0c;形成一个最小生成树。 #include<iostream> #include<vector> using names…

【管理篇 / 升级】❀ 14. FortiOS 7.4固件升级新规后的7.4.4版本的升级 ❀ FortiGate 防火墙

【简介】相信看过上一篇文章的都已经知道了&#xff0c;FortiOS 7.4版本的固件升级和降级都增加了条件&#xff0c;那就是需要设备在服务期内&#xff0c;但是小版本的升级是允许的&#xff0c;例如7.4.0升级到7.4.1、7.4.2&#xff0c;现在最新版本7.4.4来了。 获得FortiOS 7.…

【C++】牛客——OR64 求和

✨题目链接&#xff1a; OR64 求和 ✨题目描述 输入两个整数 n 和 m&#xff0c;从数列1&#xff0c;2&#xff0c;3.......n 中随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来 ✨输入描述: 每个测试输入包含2个整数,n和m ✨输出描述: 按每个组合的字典序排列…

【系统架构师】-案例篇(十五)SOA、微服务与数据库

1、可复用构件应具备哪些属性 可用性&#xff1a;构件必须易于理解和使用。 质量&#xff1a;构件及其变形必须能正确工作。 适应性&#xff1a;构件应该易于通过参数化等方式在不同语境中进行配置。 可移植性&#xff1a;构件应能在不同的硬件运行平台和软件环境中工作。 可变…

数组-区间合并

一、题目描述 二、题目思路 这里提供满足基本要求的解题思路&#xff1a; 1.先对列表内按照start大小升序排序&#xff0c;这里创建Comparator接口的实现类&#xff0c;重写compare方法。 2.遍历intervals&#xff0c;设置laststart、lastend两个变量与当前区间相比较&#…

LVGL显示中文字体及其它语言文字详细笔记教程

在前面几篇博客文章中&#xff0c;已经对LVGL的移植和使用进行了较为详细的介绍&#xff0c;在本文中将讲解如何在LVGL的控件中显示中文字体及其它语言字体。 LVGL在VScode中安装模拟器运行配置笔记教程_vscode lvgl-CSDN博客 LVGL移植到STM32 MCU平台详细经验笔记教程-CSDN博…

Day36 代码随想录打卡|二叉树篇---翻转二叉树

题目&#xff08;leecode T226&#xff09;&#xff1a; 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 方法&#xff1a; 迭代法 翻转二叉树&#xff0c;即从根节点开始&#xff0c;一一交换每个节点的左右孩子节点&#xff0c;然后…

【Linux】-Zookeeper安装部署[17]

简介 apache ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件&#xff0c;提供的功能包括&#xff1a;配置维护、域名服务、分布式同步、组服务等。 除了为Hadoop和H…