- 题目要求:
-
思路:
- 维护一个cur用来保存当前的烂橘子
- 遍历一遍给定的数组,如果是烂橘子,把横纵坐标append到cur数组中
- 定义一个time用来保存时间
- 使用while循环遍历cur,当cur中还有元素时,继续循环,cur中存放的是烂橘子的数组下标,遍历这些烂橘子,遍历每个烂橘子的时候再遍历这个烂橘子的上下左右四个格子,如果有新鲜的橘子,把这个新鲜的橘子变为烂橘子,把这个新的烂橘子append到nex数组中
- 遍历结束后,把nex数组赋给cur数组,把时间+1,这时候cur中还有元素,所以继续while循环
- 当cur中没有元素的时候,遍历grid数组,看数组中是否还有新鲜橘子,如果有,返回-1,如果没有,返回时间time
- 核心代码:
cur = []
for i in range(len(grid)):
for j in range(len(grid[0])):
if grid[i][j] == 2:
cur.append((i, j))
# 初始化为-1,因为cur中最后一次遍历的时候保存了数组中最后有好橘子变成烂橘子的那些橘子,这些橘子还有遍历一次,但是已经不会腐烂其他的橘子了
time = -1
while cur:
nex = []
for i, j in cur:
for x, y in [(0, -1), (-1, 0), (1, 0), (0, 1)]:
tmp_i = i + x
tmp_j = j + y
# 判断一下边界
if tmp_i >= 0 and tmp_i < len(grid) and tmp_j >= 0 and tmp_j < len(grid[0]):
if grid[tmp_i][tmp_j] == 1:
grid[tmp_i][tmp_j] = 2
nex.append((tmp_i,tmp_j))
time += 1
cur = nex
for i in grid:
if 1 in i:
return -1
return time
-
完整代码:
- 有一种corner case是如果grid只有一个格子,里面如果是一个0或是一个2,那么时间就是0
class Solution:
def orangesRotting(self, grid: List[List[int]]) -> int:
if len(grid) == 1 and len(grid[-1]) == 1 and grid[0][0] != 1:
return 0
cur = []
for i in range(len(grid)):
for j in range(len(grid[0])):
if grid[i][j] == 2:
cur.append((i, j))
time = -1
while cur:
nex = []
for i, j in cur:
for x, y in [(0, -1), (-1, 0), (1, 0), (0, 1)]:
tmp_i = i + x
tmp_j = j + y
if tmp_i >= 0 and tmp_i < len(grid) and tmp_j >= 0 and tmp_j < len(grid[0]):
if grid[tmp_i][tmp_j] == 1:
grid[tmp_i][tmp_j] = 2
nex.append((tmp_i,tmp_j))
time += 1
cur = nex
for i in grid:
if 1 in i:
return -1
return time
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。