Problem

Given an m x n binary matrix mat, return the distance of the nearest 0 for each cell.

The distance between two adjacent cells is 1.

Examples

Example 1: $$ \begin{bmatrix}
0 & 0 & 0\\
0 & 1 & 0\\ 0 & 0 & 0 \end{bmatrix} $$

Input: mat =[[0,0,0],[0,1,0],[0,0,0]]
Output:[[0,0,0],[0,1,0],[0,0,0]]

Example 2: $$ \begin{bmatrix}
0 & 0 & 0\\
0 & 1 & 0\\
1 & 1 & 1 \end{bmatrix} $$

Input: mat =[[0,0,0],[0,1,0],[1,1,1]]
Output:[[0,0,0],[0,1,0],[1,2,1]]

Solution

Method 1 - BFS

  • For convenience, let’s refer to cells with a value of 0 as zero-cell, those with a value of 1 as one-cell, and the distance to the nearest 0 as the distance.
  • Initially, the distance for all zero-cells is 0.
  • Using a similar approach to Topological Sort, we first process the zero-cells. We utilize a queue data structure to maintain the processing order, ensuring that cells with smaller distances are processed first. We then expand the unprocessed neighbors of the current cell and enqueue them.
  • This approach allows us to determine the minimum distance for all cells in the matrix.

Code

Java
public int[][] updateMatrix(int[][] matrix) {
	  int m = matrix.length;
	if (m == 0) {
		return matrix;
	}
	int n = matrix[0].length;

	int[][] result = new int[m][n];
	Queue<int[]> queue = new LinkedList<>(); // cells which has already been optimized
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n; j++) {
			if (matrix[i][j] == 0) {
				queue.add(new int[]{i, j});
			} else {
				result[i][j] = Integer.MAX_VALUE;
			}
		}
	}

	int[][] dirs = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
	while (!queue.isEmpty()) {
		int[] pair = queue.poll();
		int r = pair[0];
		int c = pair[1];
		for (int[] dir : dirs) {
			int newR = pair[0] + dir[0];
			int newC = pair[1] + dir[1];
			if (newR >= 0 && newR < m && newC >= 0 && newC < n) {
				if (result[newR][newC] > result[r][c] + 1) { // check if neighbor is optimized or not
					result[newR][newC] = result[r][c] + 1;
					queue.add(new int[]{newR, newC});
				}
			}
		}
	}
	return result;
}