给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离。
两个相邻元素间的距离为 1 。
这道题,乍看很像是最短路径的问题,我们想是否可以按照这种思想来处理该问题;如果采用动态规划的思想来处理,索引下标为i,j的点根据它周围点来得出;
这个思想和Dijkstra中的relax方法很想,假定matrix[m][n],是matrix[i][j]的邻接点,那么dist[i][j]=min(dist[i][j],dist[m][n]+1),因为矩阵中的点可能有四个邻接点;
我们可以采用两遍动态规划:
- 第一遍,自上而下,自左向右,比较该点和左边的点以及上边的点;
- 第二遍,自下而上,自右向左,比较该点和右边的点以及上边的点;
下边是代码实现:
class Solution {
public int[][] updateMatrix(int[][] matrix) {
//16:33
int rows = matrix.length;
int cols = matrix[0].length;
int dist[][] = new int[rows][cols];
//初始化
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (matrix[i][j] == 0) {
dist[i][j] = 0;
} else
dist[i][j] = Integer.MAX_VALUE - 10000;
}
}
//动态规划,自上而下,比较左边和上边
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (i > 0) {
dist[i][j] = Integer.min(dist[i - 1][j] + 1, dist[i][j]);
}
if (j > 0) {
dist[i][j] = Integer.min(dist[i][j - 1] + 1, dist[i][j]);
}
}
}
//动态规划,自下而上,自右而左,比较右边和左边
for(int i=rows-1;i>=0;i--){
for(int j=cols-1;j>=0;j--){
if(i<rows-1){
dist[i][j]=Integer.min(dist[i][j],dist[i+1][j]+1);
}
if(j<cols-1){
dist[i][j]=Integer.min(dist[i][j],dist[i][j+1]+1);
}
}
}
return dist;
}
}