0286. Walls and Gates
Last updated
Last updated
**Input:** rooms = [[2147483647,-1,0,2147483647],[2147483647,2147483647,2147483647,-1],[2147483647,-1,2147483647,-1],[0,-1,2147483647,2147483647]]
**Output:** [[3,-1,0,1],[2,2,1,-1],[1,-1,2,-1],[0,-1,3,4]]**Input:** rooms = [[-1]]
**Output:** [[-1]]**Input:** rooms = [[2147483647]]
**Output:** [[2147483647]]**Input:** rooms = [[0]]
**Output:** [[0]]class Solution {
public void wallsAndGates(int[][] rooms) {
// edge case
if (rooms.length == 0 || rooms[0].length == 0) return;
Queue<int[]> q = new LinkedList<int[]>();
int row = rooms.length;
int col = rooms[0].length;
// walk, get gates
for (int r = 0; r < row; r++) {
for (int c = 0; c < col; c++) {
if (rooms[r][c] == 0) q.offer(new int[] {r, c});
}
}
// BFS
int layer = 0;
while (!q.isEmpty()) {
layer++;
int len = q.size();
for (int i = 0; i < len; i++) {
int[] head = q.poll();
int r = head[0]; int c = head[1];
if (r < row-1 && rooms[r+1][c] > layer) {
rooms[r+1][c] = layer;
q.offer(new int[] {r+1, c});
}
if (r > 0 && rooms[r-1][c] > layer) {
rooms[r-1][c] = layer;
q.offer(new int[] {r-1, c});
}
if (c < col-1 && rooms[r][c+1] > layer){
rooms[r][c+1] = layer;
q.offer(new int[] {r, c+1});
}
if (c > 0 && rooms[r][c-1] > layer) {
rooms[r][c-1] = layer;
q.offer(new int[] {r, c-1});
}
}
}
}
}
/**
walk, get 0s
BFS, if val > layer, set val = layer, offer to queue
**/