首先将所有gate推入队列。 然后,为每个gate更新其相邻单元,并将其推入队列。 重复上述步骤,直到队列中没有剩余。还需要注意的语法点是,我们定义的GATE和EMPTY变量必须放在函数外面。代码如下:
class Solution {
private static final int GATE = 0;
private static final int EMPTY = Integer.MAX_VALUE;
public void wallsAndGates(int[][] rooms) {
if(rooms.length == 0 || rooms[0].length == 0){
return;
}
int m = rooms.length;
int n = rooms[0].length;
Queue<int[]> queue = new LinkedList<>();
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
if(rooms[i][j] == GATE){
queue.offer(new int[] {i, j});
}
}
}
while(!queue.isEmpty()){
int[] point = queue.poll();
int row = point[0];
int col = point[1];
if(row - 1 >= 0 && rooms[row - 1][col] == EMPTY){
rooms[row - 1][col] = rooms[row][col] + 1;
queue.offer(new int[] {row - 1, col});
}
if(row + 1 < m && rooms[row + 1][col] == EMPTY){
rooms[row + 1][col] = rooms[row][col] + 1;
queue.offer(new int[] {row + 1, col});
}
if(col - 1 >= 0 && rooms[row][col - 1] == EMPTY){
rooms[row][col - 1] = rooms[row][col] + 1;
queue.offer(new int[] {row, col - 1});
}
if(col + 1 < n && rooms[row][col + 1] == EMPTY){
rooms[row][col + 1] = rooms[row][col] + 1;
queue.offer(new int[] {row, col + 1});
}
}
}
}