Multi-source BFS from zeros
Time O(rows × cols) Space O(rows × cols)dist = 0 for zeros (enqueued), −1 for ones. BFS fills each −1 with its parent's distance + 1.
import java.util.*;
class Solution {
public int[][] updateMatrix(int[][] mat) {
int m = mat.length, n = mat[0].length;
int[][] dist = new int[m][n];
Deque<int[]> q = new ArrayDeque<>();
for (int r = 0; r < m; r++)
for (int c = 0; c < n; c++) {
if (mat[r][c] == 0) q.offer(new int[]{r, c});
else dist[r][c] = -1;
}
int[][] dirs = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
while (!q.isEmpty()) {
int[] cell = q.poll();
for (int[] d : dirs) {
int r = cell[0] + d[0], c = cell[1] + d[1];
if (r < 0 || c < 0 || r >= m || c >= n || dist[r][c] != -1) continue;
dist[r][c] = dist[cell[0]][cell[1]] + 1;
q.offer(new int[]{r, c});
}
}
return dist;
}
}Verdict: Each cell is set once.