描述
给定一个由 0 和 1 组成的矩阵 mat ,请输出一个大小相同的矩阵,其中每一个格子是 mat 中对应位置元素到最近的 0 的距离。
两个相邻元素间的距离为 1 。
分析
多源BFS
与树不同,图的广度优先搜索的起点是多个的,首先要把所有的起点都加入到队列中,然后需要判断邻接的结点是否已遍历。
class Solution {
public int[][] updateMatrix(int[][] mat) {
Queue<int[]> queue = new LinkedList<>();
for (int i = 0; i < mat.length; i++) {
for (int j = 0; j < mat[0].length; j++) {
if (mat[i][j] == 0) {
queue.offer(new int[]{i,j});
}
}
}
int[][] dir = new int[][]{{-1,0},{1,0},{0,-1},{0,1}};
while (!queue.isEmpty()) {
int size = queue.size();
for (int i = 0; i < size; i++) {
int[] pos = queue.poll();
int val = mat[pos[0]][pos[1]];
for (int[] d : dir) {
int ni = pos[0] + d[0];
int nj = pos[1] + d[1];
if (ni < 0 || ni == mat.length || nj < 0 || nj == mat[0].length) {
continue;
}
if (mat[ni][nj] == 1) {
mat[ni][nj] = val - 1;
queue.offer(new int[]{ni,nj});
}
}
}
}
for (int i = 0; i < mat.length; i++) {
for (int j = 0; j < mat[0].length; j++) {
mat[i][j] *= -1;
}
}
return mat;
}
}