Rotting Oranges — Multi-Source BFS

Sanjeev SharmaSanjeev Sharma
1 min read

Advertisement

Problem 284 · Rotting Oranges

Difficulty: Medium · Pattern: Multi-Source BFS

Solutions

# Python
from collections import deque
def orangesRotting(grid):
    m, n = len(grid), len(grid[0])
    queue = deque()
    fresh = 0
    for r in range(m):
        for c in range(n):
            if grid[r][c] == 2: queue.append((r,c,0))
            elif grid[r][c] == 1: fresh += 1
    if fresh == 0: return 0
    dirs = [(0,1),(0,-1),(1,0),(-1,0)]
    minutes = 0
    while queue:
        r, c, t = queue.popleft()
        for dr, dc in dirs:
            nr, nc = r+dr, c+dc
            if 0<=nr<m and 0<=nc<n and grid[nr][nc]==1:
                grid[nr][nc] = 2
                fresh -= 1
                minutes = t+1
                queue.append((nr,nc,t+1))
    return minutes if fresh == 0 else -1
// Java
public int orangesRotting(int[][] grid) {
    int m=grid.length, n=grid[0].length, fresh=0, minutes=0;
    Queue<int[]> q = new LinkedList<>();
    for (int r=0;r<m;r++) for (int c=0;c<n;c++) {
        if (grid[r][c]==2) q.offer(new int[]{r,c,0});
        else if (grid[r][c]==1) fresh++;
    }
    int[][] dirs = {{0,1},{0,-1},{1,0},{-1,0}};
    while (!q.isEmpty()) {
        int[] cur = q.poll(); int r=cur[0],c=cur[1],t=cur[2];
        for (int[] d:dirs) {
            int nr=r+d[0], nc=c+d[1];
            if (nr>=0&&nr<m&&nc>=0&&nc<n&&grid[nr][nc]==1) {
                grid[nr][nc]=2; fresh--; minutes=t+1; q.offer(new int[]{nr,nc,t+1});
            }
        }
    }
    return fresh==0?minutes:-1;
}

Complexity

  • Time: O(m*n)
  • Space: O(m*n)

Advertisement

Sanjeev Sharma

Written by

Sanjeev Sharma

Full Stack Engineer · E-mopro