腐烂的橘子 - (LeetCode)

一、概述

994. 腐烂的橘子 - 力扣(LeetCode),今天刷到这道题,开始按照自己实现的思路写了一次,通过了调试,但是提交的时候,来了一个大的数据,就没有通过测试,百思不得其解,看了网上的思路,使用了java的Queue队列对象来进行解题,平时都没什么机会使用Queue队列,这次认真学习了Queue队列对象,代码优化后节省了一般的代码很多,而且优化了解题的思路。

先学习下Queue队列对象。

二、队列学习

队列的概念

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表。
队列具有先进先出的特点 FIFO(FirstIn First Out)
入队列:进行插入操作的一端称为队尾(Tail/Rear)
出队列:进行删除操作的一端称为队头(front)

队列的术语

队尾:插入元素的一段
队头:删除元素的一段
入队:向队列中插入新的元素,新的元素入队后就会成为新的队尾。
出队:从队列中删除元素,元素被删除(出队)后,它的下一个元素就会成为新的队头。

三、普通队列(Queue)

队列可以使用数组或链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。

队列的方法

入队列:add()、offer()

相同:未超出容量,从队尾压入元素,返回压入的那个元素。
区别:在超出容量时,add()方法会对抛出异常,offer()返回false
出队列:remove()、poll()

相同:容量大于0的时候,删除并返回队头被删除的那个元素。
区别:在容量为0的时候,remove()会抛出异常,poll()返回null
获取队头元素(不删除):element()、peek()

相同:容量大于0的时候,都返回队头元素。但是不删除。
区别:容量为0的时候,element()会抛出异常,peek()返回null。

方法的使用

代码示例

import java.util.LinkedList;
import java.util.Queue;public class TestDemo {public static void main(String[] args) {Queue<Integer> queue = new LinkedList<>();queue.add(1);queue.offer(2);System.out.println(queue.peek());System.out.println(queue.element());System.out.println(queue.poll());System.out.println(queue.remove());}
}运行结果:
1
1
1
2

四、题目

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

  • 值 0 代表空单元格;
  • 值 1 代表新鲜橘子;
  • 值 2 代表腐烂的橘子。

每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。

返回 直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1 。

示例 1:

输入:grid = [[2,1,1],[1,1,0],[0,1,1]]
输出:4

示例 2:

输入:grid = [[2,1,1],[0,1,1],[1,0,1]]
输出:-1
解释:左下角的橘子(第 2 行, 第 0 列)永远不会腐烂,因为腐烂只会发生在 4 个方向上。

示例 3:

输入:grid = [[0,2]]
输出:0
解释:因为 0 分钟时已经没有新鲜橘子了,所以答案就是 0 。

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 10
  • grid[i][j] 仅为 01 或 2

五、解题思路

1、创建时间变量来计时。

2、新鲜橘子计数,用于最后判断没被感染的橘子🍊。

3、创建Queue队列,用于存储坏的橘子🍊,循环先找出等于2坏的橘子🍊,并加入队列。

4、判断Queue队列是否存在坏的橘子🍊,不存在则直接返回0。

4、循环Queue队列,对当前数组的上下左右方向判断等于1的新鲜橘子,把新鲜的橘子改为坏的橘子,并加入队列,用于Queue循环处理不断感染新鲜的橘子。

5、最后判断是否还存在新鲜的橘子🍊,存在则返回-1,否则返回分钟数。

六、代码

class Solution {public int orangesRotting(int[][] grid) {//创建时间变量来计时int minute = 0;//新鲜橘子计数,用于最后判断没被感染的橘子int good = 0;Queue<int[]> queue = new LinkedList<>();//先找出坏的橘子for (int x = 0; x < grid.length; x++) {for (int y = 0; y < grid[x].length; y++) {if (grid[x][y] == 2) {queue.add(new int[]{x, y});System.out.println("x:" + x + ",y:" + y);} else if (grid[x][y] == 1) {good++;}}}if (queue.size() == 0) return good == 0 ? 0 : -1;//用来记录坐标,上下左右int[] dx = {-1, 1, 0, 0};int[] dy = {0, 0, -1, 1};while (!queue.isEmpty()) {//开始一分钟的扩散minute++;int size = queue.size();for (int cou = 0; cou < size; cou++) { //取出所有的坏果//扩散处理int[] cell = queue.poll();int x = cell[0], y = cell[1];for (int i = 0; i < 4; i++) {int nx = x + dx[i];int ny = y + dy[i];//边界判断,以及只能感染好果也就是 grid[newx][newy] 等于一的if (nx >= 0 && nx < grid.length && ny >= 0 && ny < grid[0].length && grid[nx][ny] == 1) {grid[nx][ny] = 2;               //将水果感染good--;                             //好的水果数量减一queue.add(new int[]{nx, ny});   //将新的坐标存入到集合,进行下一次感染(遍历)System.out.println("nx:" + nx + ",ny:" + ny);}}}}return good > 0 ? -1 : minute - 1;}
}

数据结构和算法是计算机科学中两个紧密相关的概念,它们之间的关系可以用以下几个点来阐述:

  1. 定义与关系
    • 数据结构:是计算机中存储、组织数据的方式。数据结构决定了数据如何被存储、访问和操作,以及数据之间的逻辑关系。常见的数据结构包括数组、链表、栈、队列、树、图等。
    • 算法:是一系列解决问题的步骤或指令。算法是对数据进行操作的过程或方法,它是为了解决特定问题而设计的。算法的效率(时间复杂度和空间复杂度)通常与所使用的数据结构密切相关。
  2. 相互依赖
    • 数据结构的选择直接影响算法的效率。例如,使用链表实现插入和删除操作通常比使用数组更高效,因为链表不需要移动其他元素。同样,树和图等复杂数据结构可以支持更高效的搜索和遍历算法。
    • 算法的设计也需要考虑数据结构的特性。例如,排序算法的选择可能会根据输入数据的特性(如是否已部分排序、是否包含重复元素等)而有所不同。
  3. 优化与改进
    • 优化数据结构可以改进算法的性能。例如,通过使用哈希表(一种特殊类型的数组)可以显著减少查找操作的时间复杂度。
    • 改进算法也可以使数据结构得到更有效的利用。例如,通过优化搜索算法,可以更快地遍历和查询树或图等复杂数据结构。
  4. 实际应用
    • 在实际软件开发中,数据结构和算法的选择对于程序的性能至关重要。例如,在处理大量数据时,选择合适的数据结构和算法可以显著提高程序的执行效率。
    • 许多现代软件系统和应用程序都依赖于复杂的数据结构和算法来实现其核心功能。例如,搜索引擎使用倒排索引和排名算法来返回最相关的搜索结果;图形处理软件使用图论算法来分析和操作图像;操作系统使用数据结构来管理内存和进程等。

综上所述,数据结构和算法是相互依存、相互影响的两个概念。在设计和实现高效、稳定的软件系统时,需要充分考虑数据结构和算法的选择和优化。

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

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

相关文章

牛顿/高斯牛顿/LM法与最小二乘

最小二乘分为线性最小二乘和非线性最小二乘 最小二乘目标函数都是min||f(x)||2 若f(x) ax b&#xff0c;就是线性最小二乘&#xff1b;若f(x) ax2 b / ax2 bx 之类的&#xff0c;就是非线性最小二乘&#xff1b; 求解线性最小二乘&#xff0c;【参考】 求解非线性最小二…

【多人协作】场景模拟(一)

文章目录 实现多人协作场景&#xff1a;操作流程1开发人员a和b克隆仓库到本地2在本地仓库建立分支并与远程分支建立链接3开发人员工作并提交代码4将合并dev分支与master分支 实现多人协作 多人协作开发是git的最核心也是最重要的操作。多人协作也就意味着同一时间里&#xff0…

游戏私域运营干货必看 | 《 2023 中国移动游戏私域运营指南》下载

在新游竞争越发激烈、买量效率持续走低、用户注意力资源紧缺等悬而未决的现实困境下&#xff0c;游戏企业必须在存量市场中&#xff0c;寻找一条可行、可复制的出路。 为了一探究竟&#xff0c;网易云商分别面向国内 23 家中大型研运一体化游戏公司&#xff0c;与 2000 位真实…

红黑树!!

文章目录 1.红黑树的概念2.红黑树的几种情况2.1 情况一&#xff1a;cur为红&#xff0c;p为红&#xff0c;g为黑&#xff0c;u存在且为红(p为parent&#xff0c;g为grandfather&#xff0c;u为uncle)2.2 情况二&#xff1a;cur为红&#xff0c;p为红&#xff0c;g为黑&#xff…

MATLAB支持向量机:函数或变量 ‘svmtrain‘ 无法识别解决方法

我的MATLAB版本是2020a&#xff0c;在运行程序时出现了一下报错 若在运行程序时出现了以下报错&#xff1a; 支持向量机程序在MATLAB执行代码的时候发现有错误。 试一下help&#xff0c;如下图所示&#xff0c;SVM_L和svmtrain均找不到。 打开matlab帮助文档&#xff1a; 可…

C# XPTable in .net6(XPTable控件使用说明八)

经过作者schoetbi、armin-pfaeffle的努力&#xff0c;XPTable已经可以在 winform .net6 .net8的环境下使用&#xff0c;版本升级到了2.0&#xff0c;这样就可以在winform下同时使用XPTABLE和EFcore, 这样就可以解决大部分的场景了。

【HMGD】GD32/STM32 DMA接收不定长串口数据

单片机型号&#xff1a;GD32F303系列 CubeMX配置 配置串口参数 开启DMA 开启中断 示例代码 使用到的变量 uint8_t RX_Buff_FLAG 0; uint8_t RX_Buff[300] {0}; uint8_t TX_Buff[300] {0};串口接收空闲函数 // 串口接收空闲函数 void HAL_UARTEx_RxEventCallback(UART_H…

邮件地址采集软件有哪些-邮箱地址采集软件

邮件地址采集软件是帮助用户收集、管理和使用邮件地址的工具&#xff0c;它们在商业营销、市场调研、网络爬虫等领域有着广泛的应用。以下是一些常见的邮件地址采集软件&#xff1a; 易邮件地址搜索大师&#xff1a;易邮件地址搜索大师是一款搜索邮件地址和手机号码的软件&…

数据库开发记录

一.MySQL相关 1.Spatial Data相关

OpenAI发布最强大模型GPT-4o:对所有用户免费

OpenAI 最新推出的 GPT-4o 模型在实现更自然的人机交互方面迈出了重要一步。GPT-4o的“o” 源自拉丁语“全方位”&#xff0c;意思是“一切”。活动期间 OpenAI, 米拉穆拉蒂该公司技术总监上台展示了新的语言模型。她强调&#xff0c;拥有 OpenAI 帐户的每个人都可以免费使用新…

安装adobe系列,提示错误代码146解决办法

安装Adobe系列产品如PS、PR、Lrc等产品时&#xff0c;会因为各种各样的错误导致安装失败&#xff01;今天小编为大家带来的是安装adobe系列&#xff0c;提示错误代码146解决办法&#xff0c;收藏起来吧&#xff01; 方法一&#xff1a;就是传说中的万能大法&#xff0c;关机重启…

【MySQL】sql表设计的注意事项

程序员的实用神器 文章目录 程序员的实用神器强烈推荐引言注意事项强烈推荐专栏集锦写在最后 强烈推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站:人工智能 推荐一个个人工作&#x…

五、Linux二进制安装MariaDB 六、MariaDB主从复制

目录 五、Linux二进制安装MariaDB1 卸载mariadb1.1 卸载相关的服务(mysql和mariadb都查询一下)1.2 查找MySQL和mariadb相关的文件目录 2 安装mariadb2.1 mariadb下载地址2.2 将安装包放入到服务器中并解压 (我放到opt下)2.3 将解压后的目录移动到安装目录下2.4 创建数据目录(根…

高效且安全的传输工具:FileLink跨网文件传输

在数字化时代&#xff0c;文件传输已成为我们日常工作和生活不可或缺的一部分。无论是企业内部的资料共享&#xff0c;还是企业对外的文件交换&#xff0c;都需要一个高效、稳定且安全的传输工具。而FileLink跨网文件传输正是满足这些需求的理想选择。 FileLink跨网文件传输 首…

雇佣 K 位工人的总代价

题目链接 雇佣 K 位工人的总代价 题目描述 注意点 costs[i]是雇佣第 i 位工人的代价每一轮雇佣后&#xff0c;剩余工人的下标可能会发生变化一位工人只能被选择一次如果剩余员工数目不足 candidates 人&#xff0c;那么下一轮雇佣他们中代价最小的一人如果有多位代价相同且最…

IOS 苹果IAP(内购)之创建沙盒账号

IOS 苹果IAP&#xff08;内购&#xff09;之创建沙盒账号 沙盒账号是什么&#xff1f;沙盒账号创建的前提条件沙盒账号创建沙盒账号使用流程沙盒账号注意事项 沙盒账号是什么&#xff1f; 如果IOS应用里面用到了苹果应用内付费&#xff08;IAP&#xff09;功能&#xff0c;那么…

上位机图像处理和嵌入式模块部署(树莓派4b的替代品)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 实话实说&#xff0c;树莓派4b的产品力还是比较优秀的&#xff0c;价格还算适中。但是和国产卡片电脑比起来&#xff0c;则逊色不少。功能差不多的…

第四篇 Asciidoc - MindMap 思维导图 不是事

MindMap 是一种对思维的简单抽象,说到底,就是一个树状结构。 以下是一个样例: Figure 1. MindMap示例 我们的目录结构、模块结构、分类结构等等,都是树型结构,它非常普遍,因此 MindMap 是笔记软件中,获得最多支持的一种图。 精确地说,这类图,是对思维结构的一种映射…

BES 平台 SDK之 美格信Dongle 连接

前言: 最近项目到了试产阶段,需要用到美格信的Dongel 来测试ANC 相关功能。在此简单介绍下如何连接Dongel 的操作步骤。 一:硬件材料清单 1.美格信dongle 一台 2.待测机器 二:软件工具 1.BES_Designer_Tool_v1.0.782 2.美格信驱动安装包 :libusb-win32-devel-filter-1.2…

C语言易错提醒选择题精选

Ⅰ 易错题 1.设有double p;&#xff0c;为变量p声明一个引用名称rp,则定义语句为 double& rpp; 2.已知‘A’一‘Z’的ASCII码为65—90&#xff0c;当执行“char ch14*52&#xff1b;cout<<ch<<endl;”语句序列后得到的输出结H &#xff0c;72对应ASCII码中…