腐烂的橘子 - (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. 实际应用
    • 在实际软件开发中,数据结构和算法的选择对于程序的性能至关重要。例如,在处理大量数据时,选择合适的数据结构和算法可以显著提高程序的执行效率。
    • 许多现代软件系统和应用程序都依赖于复杂的数据结构和算法来实现其核心功能。例如,搜索引擎使用倒排索引和排名算法来返回最相关的搜索结果;图形处理软件使用图论算法来分析和操作图像;操作系统使用数据结构来管理内存和进程等。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

commvault学习(7):恢复oracle

在实际生产环境中&#xff0c;oracle的恢复方式大部分是异机恢复。 环境&#xff1a; 备份机&#xff1a;windows server2008&#xff0c;ip&#xff1a;192.168.20.56 恢复目标机&#xff1a;windows server2008&#xff0c;ip&#xff1a;192.168.20.55 CS、MA&#xff1…

进程和计划任务管理

查看系统进程信息 静态查看系统进程信息之ps命令 &#xff08;每五秒刷新一次数据&#xff09; 方法一&#xff1a;ps aux //显示所有进程 a&#xff1a;显示现行终端下的所有进程&#xff0c;包括其它用户的进程。u&#xff1a;显示进程的归属用户及内存的使用情况。x…

今天开发了一款软件,我竟然只用敲了一个字母(文末揭晓)

软件课题&#xff1a;Python实现打印100内数学试题软件及开发过程 一、需求管理&#xff1a; 1.实现语言&#xff1a;Python 2.打印纸张&#xff1a;A4 3.铺满整张纸 4.打包成exe 先看效果&#xff1a; 1. 2.电脑打印预览 3.打印到A4纸效果&#xff08;晚上拍的&#x…

Java入门基础学习笔记22——程序流程控制

程序流程控制&#xff1a;控制程序的执行顺序。 程序有哪些执行顺序&#xff1f; 顺序、分支和循环。 分支结构&#xff1a; if、switch 循环&#xff1a; for、while、do-while 顺序结构是程序中最简单最基本的流程控制&#xff0c;没有特定的语法结构&#xff0c;按照代码…

​​​【收录 Hello 算法】第 6 章 哈希表

目录 第 6 章 哈希表 本章内容 第 6 章 哈希表 Abstract 在计算机世界中&#xff0c;哈希表如同一位聪慧的图书管理员。 他知道如何计算索书号&#xff0c;从而可以快速找到目标图书。 本章内容 6.1 哈希表6.2 哈希冲突6.3 哈希算法6.4 小结

文本分类的深度注意图扩散网络 笔记

1 Title Deep Attention Diffusion Graph Neural Networks for Text Classification&#xff08;Yonghao Liu、Renchu Guan、Fausto Giunchiglia、Yanchun Liang、Xiaoyue Feng&#xff09;【EMnlp 2021】 2 Conclusion Text classification is a fundamental task with broad…

20240513,常用算法(查找,排序,拷贝替换)

做着一些和考试无关的事情 常用查找算法——续 FIND_IF find_if //按条件查找元素&#xff0c;返回迭代器POS / END()find_if(beg,end,_Fred) _Fred函数或谓词&#xff08;返回BOOL类型的仿函数&#xff09; #include<iostream> #include<string> #includ…

目标检测——YOLOv9算法解读

论文&#xff1a;YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information (2024.2.21) 作者&#xff1a;Chien-Yao Wang, I-Hau Yeh, Hong-Yuan Mark Liao 链接&#xff1a;https://arxiv.org/abs/2402.13616 代码&#xff1a;https://github.com/W…

kubernetes集群svc的代理模式-iptables修改为ipvs

一、概述\ 我们都知道&#xff0c;k8s集群的外部网络分发&#xff0c;借助kube-proxy组件来完成&#xff1b; 问题&#xff1a;我们为什么要将代理模式修改为ipvs而不继续使用iptables呐&#xff1f; 1&#xff0c;iptables底层使用四表五链完成网络代理&#xff0c;效率比较低…

HackCar – 汽车系统的攻击和防御游乐场

现代汽车配备的微控制器使用控制器局域网 (CAN) 来执行安全和豪华功能。 然而&#xff0c;由于CAN网络缺乏速度控制等线控系统的安全性&#xff0c;因此可能会通过消息注入攻击来 劫持车辆&#xff0c;从而造成生命危险。 尽管研究人员努力提出入侵检测、加密和身份验证等解…

研究幽灵漏洞及其变种(包括但不限于V1-V5)的攻击原理和基于Github的尝试

一、研究幽灵漏洞及其变种(包括但不限于V1-V5)的攻击原理 1.1 基本漏洞原理(V1) 幽灵漏洞的基本原理是由于glibc库中的gethostbyname()函数在处理域名解析时,调用了__nss_hostname_digits_dots()函数存在缓冲区溢出漏洞。 具体来说,__nss_hostname_digits_dots()使用一个固定…

牛客网刷题 | BC82 乘法表

目前主要分为三个专栏&#xff0c;后续还会添加&#xff1a; 专栏如下&#xff1a; C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读&#xff01; 初来乍到&#xff0c;如有错误请指出&#xff0c;感谢&#xff01; 描述 输出九九乘法表&am…

[GWCTF 2019]re3

int mprotect(void *addr, size_t len, int prot);实现内存区域的动态权限控制: addr&#xff1a;要修改保护权限的内存区域的起始地址。len&#xff1a;要修改保护权限的内存区域的长度&#xff08;以字节为单位&#xff09;。prot&#xff1a;要设置的新的保护权限&#xff…

宠物管理系统带万字文档

文章目录 宠物管理系统一、项目演示二、项目介绍三、19000字论文参考四、部分功能截图五、部分代码展示六、底部获取项目源码和万字论文参考&#xff08;9.9&#xffe5;带走&#xff09; 宠物管理系统 一、项目演示 宠物管理系统 二、项目介绍 基于springbootvue的前后端分离…

CentOs搭建Kubernetes集群

kubeadm minikube 还是太“迷你”了&#xff0c;方便的同时也隐藏了很多细节&#xff0c;离真正生产环境里的计算集群有一些差距&#xff0c;毕竟许多需求、任务只有在多节点的大集群里才能够遇到&#xff0c;相比起来&#xff0c;minikube 真的只能算是一个“玩具”。 Kuber…

如何利用甘特图来提高资源的是使用效率?

在项目管理中&#xff0c;甘特图是一种常用的工具&#xff0c;用于规划和跟踪项目进度。它通过条形图的形式展示项目的时间表和任务依赖关系&#xff0c;帮助项目经理和团队成员清晰地了解项目的时间线和进度。通过合理利用甘特图&#xff0c;可以显著提高资源的使用效率&#…

【C++】学习笔记——继承_1

文章目录 十一、模板进阶5. 模板的优缺点 十二、继承1. 继承的概念及定义2. 基类和派生类对象赋值转换3. 继承中的作用域4. 派生类的默认成员函数 未完待续 十一、模板进阶 5. 模板的优缺点 优点&#xff1a; 模板复用了代码&#xff0c;节省资源&#xff0c;更快的迭代开发&a…

网络安全快速入门(十二) linux的目录结构

我们前面已经了解了基础命令&#xff0c;今天我们来讲讲linux中的目录结构&#xff0c;我们在了解linux的目录结构之前&#xff0c;我们先与Windows做一个对比 12.1linux和windows的目录结构对比 在之前认识liunx的章节中&#xff0c;我们已经简单说明了linux和window的目录结构…

一文入门DNS

概述 DNS是一个缩写&#xff0c;可以代表Domain Name System&#xff0c;域名系统&#xff0c;是互联网的一项基础服务。也可以代表Domain Name Server&#xff0c;域名服务器&#xff0c;是进行域名和与之相对应的IP地址相互转换的服务器。DNS协议则是用来将域名转换为IP地址…

blender cell fracture制作破碎效果,将一个模型破碎成多个模型

效果&#xff1a; 1.打开编辑-》偏好设置。搜索cell&#xff0c;勾选上如下图所示的&#xff0c;然后点击左下角菜单里的保存设置。 2.选中需要破碎的物体&#xff0c;按快捷键f3&#xff08;快速搜索插件&#xff09;&#xff0c;搜索cell fracture。 3.调整自己需要的参数配置…