题目
994. 腐烂的橘子
在给定的 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] 仅为 0、1 或 2
我的代码(Python)
class Solution:
def orangesRotting(self, grid: List[List[int]]) -> int:
if not grid or not grid[0]:
return -1
m = len(grid)
n = len(grid[0])
currentCache = []
nextCache = []
minutes = 0
for i in range(m):
for j in range(n):
if grid[i][j] == 2:
currentCache.append((i, j))
# print(f'currentCache: {currentCache}')
while currentCache:
print(f'currentCache: {currentCache}')
while currentCache:
i, j = currentCache.pop()
for ii, jj in [(i - 1, j), (i, j - 1), (i + 1, j), (i, j + 1)]:
if ii < m and jj < n and ii >= 0 and jj >= 0:
if grid[ii][jj] == 1:
grid[ii][jj] = 2
nextCache.append((ii, jj))
if nextCache:
minutes += 1
currentCache = nextCache
nextCache = []
for i in range(m):
for j in range(n):
if grid[i][j] == 1:
return -1
return minutes
点评
想法不难,实现也不难。
根据200. 岛屿数量的官方解法想到了用数组来处理临近结点的问题,不过官方这次改用了生成器,看起来更有趣了。
baddif@gmail.com
AI简历优化站
AI求职跟踪器(建设中)
主站(建设中)
相关平台
Github Issues / Notion / Blog