题目链接: https://leetcode-cn.com/problems/rotting-oranges/.
第一次做的时候,通过遍历grid来统计每一次好橘子的个数,由值为2的节点开始向外感染。如果好橘子的个数在t1和t2时间内一样,代表好橘子无法被遍历到,return -1。
由于这种方法需要不断地遍历整个grid(统计好橘子数量),所以时间上损耗较大。
class Solution(object):
def orangesRotting(self, grid):
#统计好橘子个数
good_orange = self.calculate_good_orange(grid)
time = 0
temp = 0
while good_orange > 0:
time += 1
for i in range(len(grid)):
for j in range(len(grid[i])):
if grid[i][j] == time + 1:
if i >=1 and grid[i-1][j] == 1: grid[i-1][j] = time + 2
if j >=1 and grid[i][j-1] == 1:grid[i][j-1] = time + 2
if i + 1 < len(grid) and grid[i+1][j] == 1: grid[i+1][j] = time + 2
if j + 1 < len(grid[i]) and grid[i][j+1] == 1: grid[i][j+1] = time + 2
if good_orange == self.calculate_good_orange(grid):
return -1
good_orange = self.calculate_good_orange(grid)
return time
def calculate_good_orange(self, grid):
res = 0
for i in grid:
for j in i:
if j == 1:
res += 1
return res
第二次做,通过BFS的层序遍历来统计,性能提高不少。
class Solution(object):
def orangesRotting(self, grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
'''
本质上是通过BFS,记录层数
'''
m = len(grid)
n = len(grid[0])
good_orange = 0
queue = []
for i in range(m):
for j in range(n):
if grid[i][j] == 2: queue.append((i,j)) #相当于腐烂橘子是初始点,放入queue
if grid[i][j] == 1: good_orange += 1
layer = 0
while good_orange > 0 and len(queue) > 0:
layer += 1
for i in range(len(queue)):
curr = queue.pop(0)
if curr[0] - 1 >= 0 and grid[curr[0]- 1][curr[1]] == 1:
grid[curr[0] - 1][curr[1]] = 2
queue.append((curr[0] - 1, curr[1]))
good_orange -= 1
if curr[1] - 1 >= 0 and grid[curr[0]][curr[1] - 1] == 1:
grid[curr[0]][curr[1] - 1] = 2
queue.append((curr[0], curr[1] - 1))
good_orange -= 1
if curr[0] + 1 < m and grid[curr[0] + 1][curr[1]] == 1:
grid[curr[0] + 1][curr[1]] = 2
queue.append((curr[0] + 1, curr[1]))
good_orange -= 1
if curr[1] + 1 < n and grid[curr[0]][curr[1] + 1] == 1:
grid[curr[0]][curr[1] + 1] = 2
queue.append((curr[0], curr[1] + 1))
good_orange -= 1
if good_orange == 0: return layer
else: return -1