542. 01 Matrix
Given a matrix consists of 0 and 1, find the distance of the nearest 0 for each cell.
The distance between two adjacent cells is 1.
Example 1:
Input:
0 0 0
0 1 0
0 0 0
Output:
0 0 0
0 1 0
0 0 0
Example 2:
Input:
0 0 0
0 1 0
1 1 1
Output:
0 0 0
0 1 0
1 2 1
解法
先对矩阵进行处理,将非零元素记为Integer.MAX_VALUE。零元素入队列。
从队列中取出元素,从上下左右四个方向,分别判断下表是否出界,每个方向上的值是否<=队列中的值+1,如果不满足,该方向的元素入队列,并值+1。
public class Solution {
public List<List<Integer>> updateMatrix(List<List<Integer>> matrix) {
if (matrix == null || matrix.size() == 0) {
return matrix;
}
if (matrix.get(0) == null || matrix.get(0).size() == 0) {
return matrix;
}
int m = matrix.size();
int n = matrix.get(0).size();
Queue<int[]> queue = new LinkedList<>();
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (matrix.get(i).get(j) == 0) {
queue.offer(new int[]{i, j});
} else {
matrix.get(i).set(j, Integer.MAX_VALUE);
}
}
}
int[][] dirs = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; // 上下左右
while (!queue.isEmpty()) {
int cell[] = queue.poll();
for (int[] d : dirs) {
int r = cell[0] + d[0];
int c = cell[1] + d[1];
// 下标越界继续一个方向
if (r < 0 || r >= m || c < 0 || c >= n) {
continue;
}
int value = matrix.get(r).get(c); // 上下左右取到的值
int temp = matrix.get(cell[0]).get(cell[1]) + 1; // 队列中取出的值+1
if (value <= temp) {
continue;
}
queue.offer(new int[]{r, c});
matrix.get(r).set(c, temp);
}
}
return matrix;
}
}