每天记录自己学习到并练习的算法,使用python
一、
1.今天学习是leetcode第994题腐烂的橘子原链接在这
2.使用的是bfs(广度优先遍历)+队列(先进先出)完成的
题目:
[
[2,1,1],
[1,1,0],
[0,1,1]
]
2-腐烂,1-新鲜,0-空
每分钟任何与腐烂的橘子相邻的新鲜橘子都会腐烂,返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1,没有新鲜橘子返回0
直接上代码
class Solution:
def orangesRotting(self, grid: List[List[int]]) -> int:
#如果没有新鲜橘子
l = [y for i in grid for y in i]
if 1 not in l:
return 0
x = len(grid) #行
y = len(grid[0]) #列
time = 0
#四个方向
locs = [(-1,0), (1, 0), (0, -1), (0, 1)]#上下左右
#模拟一个队列
q = []
#把所有腐烂的橘子放入队列中
for i in range(x):
for j in range(y):
if grid[i][j] == 2:
#从最右端加入
q.append((i, j, 0))
#遍历队列里所有腐烂的橘子,直到为空
while q:
#从左端弹出
i, j , time= q.pop(0)
for loc in locs:
loc_i, loc_j = i+loc[0], j+loc[1]
#判断腐烂的橘子上下左右是否有新鲜橘子,有的话就会腐烂
if 0 <= loc_i < x and 0 <= loc_j < y and grid[loc_i][loc_j] == 1:
grid[loc_i][loc_j] = 2
q.append((loc_i, loc_j, time+1))
#最后判断还有没有新鲜橘子
for g in grid:
if 1 in g:
return -1
return time