LeetCode994腐烂的橘子(相关话题:矩阵dfs和bfs)

题目描述

在给定的 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

DFS解法

使用深度优先搜索(DFS)来解决这个问题是不太直观的,因为DFS通常用于探索或搜索路径问题,例如在迷宫中寻找路径,而这个问题更适合用BFS来模拟橘子腐烂的过程。然而,如果非要用DFS,我们需要稍微改变问题的解决方式。

在DFS的情境下,我们可以对每个新鲜橘子(值为1的单元格)应用DFS,来找出它被腐烂的最短时间。在这个过程中,我们会遇到两个主要问题:

  1. 重复计算:相同的新鲜橘子可能会被多次计算。
  2. 无法保证最优解:DFS无法保证在每一步都选择最快的腐烂路径。

下面是使用DFS解决这个问题的Java代码。请注意,这种方法可能不如BFS那样高效和直观,而且可能在某些情况下无法找到最优解。

public class Solution {public int orangesRotting(int[][] grid) {int rows = grid.length;int cols = grid[0].length;int maxTime = 0;  // 记录所有橘子腐烂所需的最大时间// 遍历网格中的每个单元格for (int r = 0; r < rows; r++) {for (int c = 0; c < cols; c++) {// 对于每个新鲜橘子,使用DFS来找出其腐烂所需的最短时间if (grid[r][c] == 1) {int time = dfs(grid, r, c, rows, cols);// 如果某个橘子无法腐烂,则返回-1if (time == Integer.MAX_VALUE) {return -1;}// 更新所有橘子腐烂所需的最大时间maxTime = Math.max(maxTime, time);}}}return maxTime;}private int dfs(int[][] grid, int r, int c, int rows, int cols) {// 检查边界条件和空单元格if (r < 0 || r >= rows || c < 0 || c >= cols || grid[r][c] == 0) {return Integer.MAX_VALUE;}// 如果找到腐烂的橘子,返回0,因为它不需要额外时间来腐烂if (grid[r][c] == 2) {return 0;}// 临时将当前单元格标记为0,以避免重复访问grid[r][c] = 0;// 递归地探索四个方向int left = dfs(grid, r, c - 1, rows, cols);int right = dfs(grid, r, c + 1, rows, cols);int up = dfs(grid, r - 1, c, rows, cols);int down = dfs(grid, r + 1, c, rows, cols);// 恢复当前单元格的值grid[r][c] = 1;// 找出四个方向上的最小腐烂时间int minTime = Math.min(Math.min(left, right), Math.min(up, down));// 返回最小时间加1(表示当前橘子腐烂所需的总时间)// 如果四周都不能腐烂,则返回最大值return minTime == Integer.MAX_VALUE ? minTime : minTime + 1;}
}

BFS解法

class Solution {public int orangesRotting(int[][] grid) {int rows = grid.length, cols = grid[0].length;Queue<int[]> queue = new LinkedList<>();int freshCount = 0;// 初始化队列,计算新鲜橘子的数量for (int r = 0; r < rows; r++) {for (int c = 0; c < cols; c++) {if (grid[r][c] == 2) {queue.offer(new int[]{r, c});} else if (grid[r][c] == 1) {freshCount++;}}}int minutesPassed = 0;int[][] directions = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};  // 四个方向// BFSwhile (!queue.isEmpty() && freshCount > 0) {minutesPassed++;int size = queue.size();for (int i = 0; i < size; i++) {int[] point = queue.poll();int x = point[0], y = point[1];for (int[] d : directions) {int nx = x + d[0], ny = y + d[1];if (0 <= nx && nx < rows && 0 <= ny && ny < cols && grid[nx][ny] == 1) {grid[nx][ny] = 2;freshCount--;queue.offer(new int[]{nx, ny});}}}}return freshCount == 0 ? minutesPassed : -1;}
}

相关文章

团灭LeetCode跳跃游戏(相关话题:贪心,BFS)_跳跃游戏is bfs-CSDN博客 

算法模板(二)(相关话题:广度优先搜索BFS)_bfs的搜索代价有哪些可能性-CSDN博客

LeetCode695之岛屿的最大面积(相关话题:深度优先,广度优先)_着色法问题 广度优先求小岛面积-CSDN博客

LeetCode之团灭字典序相关题目_leetcode 字典序 题-CSDN博客 

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

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

相关文章

获取Windows10系统原始安装日期

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 目标 获取Windows10系统最原始的安装日期&#xff1b;例如&#xff1a;刚买电脑时安装系统的时间。 步骤 第一步&#xff0c;请打开PowerShell&#xff0c;单击Windows P…

“推荐大战:抖音vs.快手”——背后的秘密全揭晓!

大家好&#xff0c;我是小米&#xff0c;一个热衷于技术分享的小伙伴。最近在面试的时候遇到了一个非常有趣的问题&#xff0c;也是很多人关心的话题——字节跳动产品面试题&#xff1a;说一下抖音和快手的推荐策略有什么不同&#xff1f;今天&#xff0c;就让我们一起来揭开这…

使用opencv+tesseract识别图片中的表格

描述 在java环境中使用opencv和tesserac识别一个图片表格 环境&#xff1a;opencv和tesseract安装在linux环境下&#xff0c;docker将运行springboot服务 opencv和tesseract的安装和docker加载可参考之前的文章 过程 将图片进行预处理&#xff0c;过滤掉颜色等干扰元素 提…

我的2023年度总结(一)

在本文开始之前&#xff0c;先对我2023年的所为进行一些道歉&#xff1a; 部分工作中的客户/合作伙伴&#xff0c;在2023年我可能时长怠慢了您的消息。但我真不是故意的(有时可能在忙其他事情)。2024年&#xff0c;如有任何问题请尽可能抛过来吧。部分粉丝朋友&#xff0c;甚至…

【Java开发岗面试】八股文—Java框架(Spring+SpringMVC+MyBatis+SpringBoot)

声明&#xff1a; 背景&#xff1a;本人为24届双非硕校招生&#xff0c;已经完整经历了一次秋招&#xff0c;拿到了三个offer。本专题旨在分享自己的一些Java开发岗面试经验&#xff08;主要是校招&#xff09;&#xff0c;包括我自己总结的八股文、算法、项目介绍、HR面和面试…

ctfshow 新手必刷菜狗杯 谜之栅栏题解记录

知识点&#xff1a;图片比较 拿到之后&#xff0c;有两个图片&#xff0c;直观看不出什么&#xff0c;尝试用工具比较。 用010editor打开其中一个&#xff0c;010editor的工具里面就有比较文件选项&#xff0c;比较两个文件&#xff0c;发现有一处不同。题目说栅栏&#xff0c…

基于时空的Ramsar湿地自动淹没映射利用Google Earth Engine

题目:Spatiotemporal‑based automated inundation mapping of Ramsar wetlands using Google Earth Engine 期刊:Scientific Reports 第一作者:Manish KumarGoyal 发表单位:University of Nebraska 发表日期:2023年 1. 摘要 研究背景:湿地是生态系统中最关键的组成…

如果你是这样选择项目的,那么再创业也不会成功的。2024新兴创业项目,2024普通人失业怎么创业

普通人怎么创业的&#xff1f;我昨天晚上吃饭的时候想了一个项目&#xff0c;觉得很可以&#xff0c;去干干怎么样&#xff1f;只能说死定了。没有任何数据支撑&#xff0c;想象出来的项目&#xff0c;它的成功率会非常低&#xff0c;因为在博概率&#xff0c;而且成功率不会超…

Avalonia学习(十五)-OxyPlot

今天开始继续Avalonia练习。展示一些样例&#xff0c;尤其是第三方库的使用。 本节&#xff1a;OxyPlot 1.引入OxyPlot.Avalonia 2.项目引入 在Main方法里增加OxyPlotModule.EnsureLoaded()方法调用。 public static void Main(string[] args) {OxyPlotModule.EnsureLoade…

别找了!前端那些好用的网站都在这里了!【文末送书】

&#x1f340;前言 好用的网站千千万万&#xff0c;如果你还发现好用的网站&#xff0c;欢迎在评论区中留言分享&#x1f601;&#xff0c;赠书活动在文末哟&#xff0c;中奖者可以从给出的五本书中任意挑选自己喜欢的那本 文章目录 &#x1f340;前言 &#x1f340;一、渐变…

深度学习 | 注意力机制、自注意力机制

卷积神经网络的思想主要是通过卷积层对图像进行特征提取&#xff0c;从而达到降低计算复杂度的目的&#xff0c;利用的是空间特征信息&#xff1b;循环神级网络主要是对序列数据进行建模&#xff0c;利用的是时间维度的信息。 而第三种 注意力机制 网络&#xff0c;关注的是数据…

认识计算机网络——计算机网络的概念

计算机网络是指将多台计算机通过通信介质连接起来&#xff0c;以便共享资源、交换信息和进行协作的技术体系。在现代社会中&#xff0c;计算机网络已经成为了各个领域的重要基础设施&#xff0c;改变了人们的生活方式和工作方式。本文将介绍计算机网络的基本概念、组成要素和发…