Multi-source BFS from all rotten oranges.
function orangesRotting(grid): m, n = len(grid), len(grid[0]) queue = [] fresh = 0 for i in range(m): for j in range(n): if grid[i][j] == 2: queue.append((i, j, 0)) elif grid[i][j] == 1: fresh += 1 minutes = 0 while queue: i, j, time = queue.pop(0) minutes = max(minutes, time) for di, dj in [(-1,0),(1,0),(0,-1),(0,1)]: ni, nj = i + di, j + dj if 0 <= ni < m and 0 <= nj < n and grid[ni][nj] == 1: grid[ni][nj] = 2 fresh -= 1 queue.append((ni, nj, time + 1)) return minutes if fresh == 0 else -1
time and space.