题目链接:https://leetcode-cn.com/problems/01-matrix/
题目描述
给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离。
两个相邻元素间的距离为 1 。
第一次编辑代码:
class Solution {
public int[][] updateMatrix(int[][] matrix) {
int row = matrix.length;
int col = matrix[0].length;
int[][] ans = new int[row][col];
for(int i = 0; i < row; i++)
for(int j = 0; j < col; j++){
ans[i][j] = find(matrix,i,j,row,col);
}
return ans;
}
public int find(int[][] matrix, int i, int j, int row, int col){
if(i < 0 || i > row-1 || j < 0 || j > col-1)
return Integer.MAX_VALUE;
if(matrix[i][j] == 0)
return 0;
if(i-1 >= 0 && matrix[i-1][j] == 0)
return 1;
if(i+1 <= row-1 && matrix[i+1][j] == 0)
return 1;
if(j-1 >= 0 && matrix[i][j-1] == 0)
return 1;
if(j+1 <= col-1 && matrix[i][j+1] == 0)
return 1;
return 1 + Math.min(
Math.min(find(matrix,i-1,j,row,col),find(matrix,i+1,j,row,col)),
Math.min(find(matrix,i,j+1,row,col),find(matrix,i,j+1,row,col))
);
}
}
提交结果
执行出错。
栈溢出。
反思
考虑使用多源点广度优先遍历。
第二次编辑代码:
class Solution {
public int[][] updateMatrix(int[][] matrix) {
int row = matrix.length, col = matrix[0].length;
Queue<int[]> queue = new LinkedList<>();
for(int i = 0; i < row; i++)
for(int j = 0; j < col; j++){
if(matrix[i][j] == 0){
queue.offer(new int[]{i,j});
}else{
matrix[i][j] = -1;
}
}
int[] dx = new int[]{-1, 1, 0, 0};
int[] dy = new int[]{0, 0, -1, 1};
while(!queue.isEmpty()){
int[] cur = queue.poll();
int x = cur[0], y = cur[1];
for(int i = 0; i < 4; i++){
int newX = x + dx[i];
int newY = y + dy[i];
if(newX >= 0 && newX < row && newY >= 0 && newY < col
&& matrix[newX][newY] == -1){
matrix[newX][newY] = matrix[x][y] + 1;
queue.offer(new int[]{newX,newY});
}
}
}
return matrix;
}
}