【leetcode hot 100 994】腐烂的橘子

devtools/2025/3/25 16:01:22/

多源广度优先搜索

  • 所有的腐烂橘子在广度优先搜索上是等价于同一层的节点的。
  • 假设这些腐烂橘子刚开始是新鲜的,而有一个腐烂橘子(我们令其为超级源点)会在下一秒把这些橘子都变腐烂,而这个腐烂橘子刚开始在的时间是 −1,那么按照广度优先搜索的算法,下一分钟也就是第 0分钟的时候,这个腐烂橘子会把它们都变成腐烂橘子,然后继续向外拓展,所以其实这些腐烂橘子是同一层的节点。那么在广度优先搜索的时候,我们将这些腐烂橘子都放进队列里进行广度优先搜索即可,最后每个新鲜橘子被腐烂的最短时间 dis[x][y] 其实是以这个超级源点的腐烂橘子为起点的广度优先搜索得到的结果。
  • 为了确认是否所有新鲜橘子都被腐烂,可以记录一个变量 cnt 表示当前网格中的新鲜橘子数,广度优先搜索的时候如果有新鲜橘子被腐烂,则 cnt=cnt−1 ,最后搜索结束时如果 cnt 大于 0,说明有新鲜橘子没被腐烂,返回 −1 ,否则返回所有新鲜橘子被腐烂的时间的最大值即可,也可以在广度优先搜索的过程中把已腐烂的新鲜橘子的值由 1 改为 2,最后看网格中是否有值为 1 即新鲜的橘子即可。
java">class Solution {// 用于上下左右移动int[] row = new int[]{0, 1, 0, -1};int[] col = new int[]{1, 0, -1, 0};public int orangesRotting(int[][] grid) {int r = grid.length;int c = grid[0].length;// 先把所有烂了的橘子放入队列中Queue<Integer> queue = new ArrayDeque<>();Map<Integer, Integer> map = new HashMap<>();  // <橘子, 第几秒烂的>for(int i=0; i<r; i++){for(int j=0; j<c; j++){if(grid[i][j]==2){int location = i*c + j;   // 用一个数标识二维数组的位置queue.add(location);map.put(location, 0);}}}// 烂橘子感染所有好橘子int ret = 0;while(!queue.isEmpty()){int node = queue.remove();int node_r = node/c;int node_c = node%c;for(int k=0; k<4; k++){// 得到四周的橘子int i = node_r + row[k];int j = node_c + col[k];if(i>=0 && i<r && j>=0 && j<c && grid[i][j]==1){ //记得判断ij的范围// 好的橘子被感染grid[i][j] = 2;int location = i*c+j;queue.add(location);map.put(location, map.get(node)+1);ret = map.get(location);}}}// 查看是否有好的橘子for(int[] row:grid){for(int v:row){if(v==1){return -1;}}}return ret;}
}

注意:

  • queue用于广度优先遍历;map用于存储<腐烂的橘子location,第几秒烂的>
  • 在感染四周的好橘子的时候,要记得判断ij的范围
  • LinkedListArrayDeque的区别:
    • 操作:
      ArrayDequeadd() remove()
      LinkedListoffer() poll() peek()

    • 底层实现:
      ArrayDeque:基于可变长的数组和双指针来实现。
      LinkedList:基于双向链表来实现。

    • 支持的元素
      ArrayDeque:不支持存储 null 数据。
      LinkedList:支持存储 null 数据。

    • 引入版本
      ArrayDeque:在 JDK 1.6 中被引入。
      LinkedList:早在 JDK 1.2 中就已经存在。

    • 插入性能
      ArrayDeque:插入时可能存在扩容过程,但均摊后的插入操作依然为 O(1)。
      LinkedList:每次插入数据时均需要申请新的堆空间,均摊性能相比更慢。

参考:

Java ArrayDeque 与 LinkedList 的区别?


http://www.ppmy.cn/devtools/169145.html

相关文章

Java并发编程面试题:并发工具类(10题)

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

同旺科技USB to I2C 适配器 ---- 多从机设备混合调试

所需设备&#xff1a; 内附链接 1、同旺科技USB to I2C 适配器 1、还在为一条I2C总线上出现多个从机设备而烦恼吗&#xff1f;现在这些都可以轻松解决了&#xff0c;在 "发送数据" 栏里面&#xff0c;修改指令的从机地址就可以了&#xff0c;同时支持7Bit、8Bit地址…

正则表达式:文本处理的瑞士军刀

正则表达式&#xff1a;文本处理的瑞士军刀 正则表达式&#xff08;Regular Expression&#xff0c;简称 Regex&#xff09;是一种用于匹配、查找和操作文本的强大工具。它通过定义一种特殊的字符串模式&#xff0c;可以快速地在文本中搜索、替换或提取符合特定规则的内容。正…

基于WebAssembly的浏览器密码套件

目录 一、前言二、WebAssembly与浏览器密码套件2.1 WebAssembly技术概述2.2 浏览器密码套件的需求三、系统设计思路与架构3.1 核心模块3.2 系统整体架构图四、核心数学公式与算法证明4.1 AES-GCM加解密公式4.2 SHA-256哈希函数五、异步任务调度与GPU加速设计5.1 异步任务调度5.…

gitlab-ci.yml文件详解

什么是.gitlab-ci.yml文件 从7.12版本开始&#xff0c;GitLab CI使用YAML文件(.gitlab-ci.yml)来管理项目配置。该文件存放于项目仓库的根目录&#xff0c;并且包含了你的项目如何被编译的描述语句。YAML文件使用一系列约束叙述定义了Job启动时所要做的事情。 Job Job是.git…

「0基础学爬虫」爬虫基础之抓包工具的使用

抓包工具概述 抓包工具&#xff0c;顾名思义&#xff0c;就是抓取网络数据包信息的工具。抓包工具最初主要应用于测试工作中&#xff0c;通过抓包工具查看网络数据包&#xff0c;并进行分析&#xff0c;来定位数据传输中的问题。随着不断发展&#xff0c;抓包工具的功能不断拓…

开发SAPUI5 Fiori应用并部署到SAP系统

首先新建一个项目文件夹 在VScode中打开 打开SAP Fiori&#xff08;需要先下载安装&#xff0c;参考上上一篇文章&#xff09; ,选择已添加的SAP S4 ERP系统 ,点击创建Firoi应用。 如果没有添加系统的&#xff0c;点击添加按钮&#xff0c;添加即可&#xff0c;注意&#xff…

条件变量,锁,共享数据的关系

条件变量、共享数据和锁之间的三方耦合关系源于多线程环境下对资源访问的同步需求。以下是关键点分析&#xff1a; 条件变量中通常会对共享数据进行判断和处理&#xff0c;如果不加锁就会出现数据竞争的问题&#xff0c;所以并不是条件变量要跟锁一起使用&#xff0c;而是上锁为…