Description
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
Note:
- The number of elements of the given matrix will not exceed 10,000.
- There are at least one 0 in the given matrix.
- The cells are adjacent in only four directions: up, down, left and right.
问题描述
给定由0和1组成的矩阵, 找出每个方块最近的0的距离
两个相邻的方块的距离为1(相邻指的是上下左右四个方向)
问题分析
两种解法, Dijkstra和动态规划
Dijkstra
动态规划:两轮循环, 第一轮从矩阵的左上角开始遍历, 找出每个方块考虑到左边和上边的最小的距离, 第二轮从矩阵的右下角开始遍历, 找出每个方块考虑到右边和下边的最小的距离, 整合在一起, 即可得到最小距离
解法1(Dijkstra)
class Solution {
public int[][] updateMatrix(int[][] matrix) {
if(matrix == null || matrix.length == 0 || matrix[0].length == 0) return new int[0][0];
int m = matrix.length, n = matrix[0].length;
int[][] dist = new int[m][n];
Queue<int[]> queue = new LinkedList<>();
for(int i = 0;i < m;i++){
for(int j = 0;j < n;j++){
dist[i][j] = Integer.MAX_VALUE;
if(matrix[i][j] == 0){
dist[i][j] = 0;
queue.add(new int[]{i, j});
}
}
}
int[][] dirs = {{0, -1}, {1, 0}, {0, 1}, {-1, 0}};
while(!queue.isEmpty()){
int[] pair = queue.poll();
for(int[] dir : dirs){
int newi = pair[0] + dir[0];
int newj = pair[1] + dir[1];
if(newi >= 0 && newi < m && newj >= 0 && newj < n && (dist[pair[0]][pair[1]] + 1 < dist[newi][newj])){
dist[newi][newj] = dist[pair[0]][pair[1]] + 1;
queue.offer(new int[]{newi, newj});
}
}
}
return dist;
}
}
解法2
class Solution {
public int[][] updateMatrix(int[][] matrix) {
if(matrix == null || matrix.length == 0 || matrix[0].length == 0) return new int[0][0];
int m = matrix.length, n = matrix[0].length;
int[][] dist = new int[m][n];
//第一轮循环
for(int i = 0;i < m;i++){
for(int j = 0;j < n;j++){
dist[i][j] = Integer.MAX_VALUE - 1;
if(matrix[i][j] == 0){
dist[i][j] = 0;
}else{
if(i > 0) dist[i][j] = Math.min(dist[i][j], dist[i - 1][j] + 1);
if(j > 0) dist[i][j] = Math.min(dist[i][j], dist[i][j - 1] + 1);
}
}
}
//第二轮循环
for(int i = m - 1;i >= 0;i--){
for(int j = n - 1;j >= 0;j--){
if(i + 1 < m) dist[i][j] = Math.min(dist[i][j], dist[i + 1][j] + 1);
if(j + 1 < n) dist[i][j] = Math.min(dist[i][j], dist[i][j + 1] + 1);
}
}
return dist;
}
}