难度 中等
这道题花了不少时间,关键是要找对算法。开始尝试过用队列和迭代,都超时了。思路大概就是x,y的距离等于它四周的最小距离+1。先将0写入,再分别从左上到右下,从右下到左上来遍历更新最小距离。
执行用时 :8 ms, 在所有 Java 提交中击败了94.86%的用户
内存消耗 :43.2 MB, 在所有 Java 提交中击败了100.00%的用户
public int[][] updateMatrix(int[][] matrix) {
int[][] result = new int[matrix.length][matrix[0].length];
for(int i = 0; i < matrix.length; i++){
for(int j = 0; j < matrix[0].length; j++){
if(matrix[i][j] == 0){
result[i][j] = 0;
}else{
result[i][j] = 200;
}
}
}
for(int i = 0; i < matrix.length; i++){
for(int j = 0; j < matrix[0].length; j++){
if(i > 0){
result[i][j] = Math.min(result[i][j], (result[i-1][j]+1));
}
if(j > 0){
result[i][j] = Math.min(result[i][j], (result[i][j-1]+1));
}
}
}
for(int i = matrix.length-1; i >= 0; i--){
for(int j = matrix[0].length-1; j >= 0; j--){
if(i < matrix.length - 1){
result[i][j] = Math.min(result[i][j], (result[i+1][j]+1));
}
if(j < matrix[0].length - 1){
result[i][j] = Math.min(result[i][j], (result[i][j+1]+1));
}
}
}
return result;
}