技术提高是一个循序渐进的过程,所以我讲的leetcode算法题从最简单的level开始写的,然后> 到中级难度,最后到hard难度全部完。目前我选择C语言,Python和Java作为实现语言,因为这三种语言还是比较典型的。由于篇幅和> 精力有限,其他语言的实现有兴趣的朋友请自己尝试。初级难度说的差不多的时候,我打算再加点其他内容,我可能会从操作系统到协议栈,从分布式> 聊到大数据框架,从大数据聊到人工智能,... ...。
如果有任何问题可以在文章后评论或者私信给我。
我会持续分享下去,敬请您的关注。
LeetCode 994. 腐烂的橘子(Rotting Oranges)
问题描述:在给定的网格中,每个单元格可以有以下三个值之一:
每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐烂。
返回直到单元格中没有新鲜橘子为止所必须经过的"最小分钟数"。如果不可能,返回 -1。
注:
示例:
C语言实现:先吐槽一下。
一拿到这道题,我以为是一个优化问题,因为题目中提到到,让我们求"最小"分钟数。后来通过几个case的验证结果来看根本不是什么优化问题,不存在所谓的最值问题。
我开始的理解是每一分钟只有一个坏柿子4周的好柿子会变,而题目的真实意图是:同一分钟所有坏柿子周围的好柿子都会变坏。这是两个完全不一样的题目。所以出题方不够严谨呀。
理解了题目的真实意图后,这道题就比较好解了。我们可以将网格中所有相邻的好柿子和坏柿子连起来,组成一个无向图。
(下图就是示例中的网格到图的转化遍历的过程)
然后,我们注意观察分析好柿子变坏柿子的过程。
每一分钟,只有坏柿子直接连接的好柿子会被感染,变成新的坏柿子。
然后新的坏柿子在下一分钟再感染它相连的好柿子,如此下去。
我们会发现,这实际上就是对图的遍历过程,而且这种遍历是广度优先的遍历形式。
图的广度优先遍历类似树的层序遍历,如果我们把某一阶段的坏柿子看着一层的话,那么下一分钟被感染的柿子,可以被看成下一层。
这样求感染的时间就转化成了求遍历层数。
既然是“层序遍历”,我们就要找到遍历的起始层。显然我们应该以图中的坏柿子节点作为遍历的起始层。
所以解题的第一步是遍历整个网格找到所有的坏柿子,将其压入队列中。
那么什么时候会返回-1呢?答案是,如果网格中有两个或两个以上完全无连接的非空图,且至少有一个图中没有坏柿子,这就使得这个图中的好柿子不会被感染。但是问题是这个图我们不太好找。
我们可以在上面遍历找坏柿子的时候统计所有好柿子的数量,然后当遍历的时候,有好柿子被感染就减1,一直到遍历结束,如果结果是依然有好柿子就说明,存在这样的一个没有坏柿子的非空图。
具体代码如下:
Java语言实现:Java 的实现和C语言的实现一致,不再撰述。代码如下:
Python语言实现:Python 的实现和C语言的实现一致,不再撰述。代码如下:
谢谢大家一直以来的关注和支持!
我一直在努力的写好每一篇文章,画好每一份插图。但是作为一个996从业人员,时间精力十分有限。所以针对评论部分,以后只回答粉丝的问题和私信。希望仅仅是路过的朋友能够体谅,希望更多人关注《》,谢谢!
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved