Walls and Gates — Multi-Source BFS from All Gates

Sanjeev SharmaSanjeev Sharma
1 min read

Advertisement

Problem 286 · Walls and Gates

Difficulty: Medium · Pattern: Multi-Source BFS

Fill rooms (INF) with minimum distance to nearest gate (0). Walls = -1.

Solutions

# Python
from collections import deque
def wallsAndGates(rooms):
    m, n = len(rooms), len(rooms[0])
    queue = deque()
    INF = 2**31-1
    for r in range(m):
        for c in range(n):
            if rooms[r][c] == 0: queue.append((r,c))
    dirs = [(0,1),(0,-1),(1,0),(-1,0)]
    while queue:
        r, c = queue.popleft()
        for dr, dc in dirs:
            nr, nc = r+dr, c+dc
            if 0<=nr<m and 0<=nc<n and rooms[nr][nc]==INF:
                rooms[nr][nc] = rooms[r][c]+1
                queue.append((nr,nc))
// Java
public void wallsAndGates(int[][] rooms) {
    int m=rooms.length, n=rooms[0].length, INF=Integer.MAX_VALUE;
    Queue<int[]> q=new LinkedList<>();
    for (int r=0;r<m;r++) for (int c=0;c<n;c++) if (rooms[r][c]==0) q.offer(new int[]{r,c});
    int[][] dirs={{0,1},{0,-1},{1,0},{-1,0}};
    while (!q.isEmpty()) {
        int[] cur=q.poll();
        for (int[] d:dirs) {
            int nr=cur[0]+d[0], nc=cur[1]+d[1];
            if (nr>=0&&nr<m&&nc>=0&&nc<n&&rooms[nr][nc]==INF) {
                rooms[nr][nc]=rooms[cur[0]][cur[1]]+1; q.offer(new int[]{nr,nc});
            }
        }
    }
}

Complexity

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

Advertisement

Sanjeev Sharma

Written by

Sanjeev Sharma

Full Stack Engineer · E-mopro