给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离。
两个相邻元素间的距离为 1 。
示例 1:
输入:
0 0 0 0 1 0 0 0 0
输出:
0 0 0 0 1 0 0 0 0
示例 2:
输入:
0 0 0 0 1 0 1 1 1
输出:
0 0 0 0 1 0 1 2 1
注意:
- 给定矩阵的元素个数不超过 10000。
- 给定矩阵中至少有一个元素是 0。
- 矩阵中的元素只在四个方向上相邻: 上、下、左、右。
思路:BFS 的思路,将矩阵位置为 0 的下标压进队列,并将不为 0 的元素置为 Integer 的最大值。然后进行处理,逐渐将队列中的元素出队处理,看看这个出队的元素的上下左右方位,是否为 Integer 最大值,注意要下标越界的判断。
代码:
class Solution {
public int[][] updateMatrix(int[][] matrix) {
int m = matrix.length;
int n = matrix[0].length;
Queue<int[]> queue = new LinkedList<>();
for(int i = 0;i < m;++i){
for(int j = 0;j < n;++j){
if(matrix[i][j] == 0){
queue.offer(new int[]{i,j});
}else{
matrix[i][j] = Integer.MAX_VALUE;
}
}
}
int[] dir = {{1,0},{-1,0},{0,1},{0,-1}};
while(!queue.isEmpty()){
int[] unit = queue.poll();
for(int[] pos : dir){
int x = unit[0] + pos[0];
int y = unit[1] + pos[1];
if(x < 0 || x >= m || y < 0 || y >= n || matrix[x][y] <= matrix[unit[0]][unit[1]]+1){
continue;
}
queue.offer(new int[]{x,y});
matrix[x][y] = matrix[unit[0]][unit[1]] + 1;
}
}
return matrix;
}
}