图解LeetCode——994. 腐烂的橘子

简介: 图解LeetCode——994. 腐烂的橘子

一、题目

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

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

每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。 返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1

二、示例

2.1> 示例 1:

输入】grid = [[2,1,1],[1,1,0],[0,1,1]]

输出】4

2.2> 示例 2:

输入】grid = [[2,1,1],[0,1,1],[1,0,1]]

输出】-1

解释】左下角的橘子(第 2 行, 第 0 列)永远不会腐烂,因为腐烂只会发生在 4 个正向上。

2.3> 示例 3:

输入】grid = [[0,2]]

输出】0

解释】因为 0 分钟时已经没有新鲜橘子了,所以答案就是 0 。

提示:

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

三、解题思路

根据题目描述,我们要计算出单元格中没有新鲜橘子为止所必须经过的最小分钟数。由于腐烂的橘子可以将好的橘子也变腐烂,所以,我们需要采用某种方式,将这种橘子腐烂的轮次模拟计算出来。

这里,我们首先创建一个队列,即:Deque。然后先将矩阵中腐烂的橘子保存到deque中。然后获取deque中存储的腐烂橘子的个数num那么当num个橘子从deque中出栈之后,就表示该轮次执行完毕

那么,当我们从队列deque弹出腐烂的橘子之后,我们会将该烂橘子的的新鲜橘子都变为烂橘子,即:grid[x][y] = 2。然后将刚刚变烂的句子放入到deque中,准备作为后续下一轮需要操作的烂橘子。

那么,需要补充一点的就是,当我们计算矩阵中腐烂橘子的同时,也可以同时获得新鲜的橘子的个数fresh当面当我们发现fresh等于0的时候,则说明所有的好橘子都被腐烂了,返回操作的轮次数;而当我们操作完所有的腐烂橘子,而fresh依然不为0,则说明某些新鲜的橘子是不会被传染腐烂的,则直接返回-1即可。

以上就是本题的解题思路。为了方便大家理解,请参照下图图解即可:

四、代码实现

class Solution {
    int fresh = 0, minute = 0;
    Deque<int[]> deque = new ArrayDeque();
    public int orangesRotting(int[][] grid) {
        int result = 0;
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[0].length; j++) {
                if (grid[i][j] == 2) deque.addLast(new int[]{i, j});
                if (grid[i][j] == 1) fresh++;
            }
        }
        while (fresh > 0 && !deque.isEmpty()) {
            minute++;
            int nums = deque.size();
            for (int i = 0; i < nums; i++) {
                int[] cell = deque.removeFirst();
                int x = cell[0], y = cell[1];
                rot(grid, x - 1, y); // 查看上方单元格
                rot(grid, x + 1, y); // 查看下方单元格
                rot(grid, x, y - 1); // 查看左侧单元格
                rot(grid, x, y + 1); // 查看右侧单元格
            }
        }
        return fresh > 0 ? -1 : minute; 
    }
    public void rot(int[][] grid, int x, int y) {
        if (x >= 0 && y >=0 && x < grid.length && y < grid[0].length && grid[x][y] == 1) {
            grid[x][y] = 2;
            deque.addLast(new int[]{x, y});
            fresh--;
        }
    }
}

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

相关文章
|
搜索推荐 数据挖掘 API
抖音商品详情API接口对电商的作用及收益
在电商快速发展的背景下,抖音作为全球领先的短视频平台,凭借其庞大的用户基础和高活跃度,通过商品详情API接口为电商行业开辟了新渠道。本文深入解析了抖音商品详情API接口的功能及其对电商的积极作用,包括商品信息实时同步、提升用户体验、精准营销、数据分析与优化等方面,展示了该接口如何帮助电商企业拓展销售渠道、优化商品策略、提升用户满意度、促进跨界合作与开发创新商业模式,为电商企业带来显著收益。同时,文章也探讨了实现这些收益的关键步骤及面临的挑战,强调了数据安全与隐私保护的重要性,以及创新和差异化竞争的必要性。
566 4
|
机器学习/深度学习 数据采集 人工智能
人工智能中噪声数据的产生与处理方法详解
人工智能中噪声数据的产生与处理方法详解
2175 0
|
存储 算法 C++
【C++ map结构 】std::map 和 std::unordered_map 在使用上的差异
【C++ map结构 】std::map 和 std::unordered_map 在使用上的差异
1126 0
|
Java 测试技术 开发工具
Java开发工具IntelliJ IDEA单元测试和代码覆盖率图解
原文 http://www.cnblogs.com/xiongmaopanda/p/3314660.html Java开发工具IntelliJ IDEA使用教程:单元测试和代码覆盖率 本文将展示如何使用IntelliJ IDEA开发单元测试和分析覆盖率。
3200 0
|
芯片 Windows
【嵌入式系统】独立看门狗原理+看门狗实验分析
【嵌入式系统】独立看门狗原理+看门狗实验分析
984 0
【嵌入式系统】独立看门狗原理+看门狗实验分析
|
XML Java 数据库
Spring 全家桶之 Spring Framework 5.3(四)(上)
Spring 全家桶之 Spring Framework 5.3(四)
Spring 全家桶之 Spring Framework 5.3(四)(上)
|
监控 安全 数据挖掘
AidLearning:手机端Python编程的神器
AidLearning:手机端Python编程的神器
718 0
|
人工智能 编解码
CogVideoX-Flash:智谱首个免费AI视频生成模型,支持文生视频、图生视频,分辨率最高可达4K
CogVideoX-Flash 是智谱推出的首个免费AI视频生成模型,支持文生视频、图生视频,最高支持4K分辨率,广泛应用于内容创作、教育、广告等领域。
2009 5
CogVideoX-Flash:智谱首个免费AI视频生成模型,支持文生视频、图生视频,分辨率最高可达4K
|
网络安全
避免SSH连接因超时闲置断开
可以在/etc/ssh/ssh_config里设置一下 ServerAliveInterval 60 此后该系统里的用户连接SSH时,每60秒会发一个KeepAlive请求,避免被踢。
3007 0
|
SQL 存储 数据可视化
【开源项目推荐】通用SQL数据血缘分析工具——Sqllineage
【开源项目推荐】通用SQL数据血缘分析工具——Sqllineage
2257 57

热门文章

最新文章