542.01行列
0と1からなる行列が与えられると、各要素は、最も近いゼロを検索します。
二つの隣接するエレメント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 0 1
。1。1。1
出力:
0 0 0
0 0 1
1 1 2。
注:
行列の要素の所定数は1万人以上ではありません。
マトリックス内の指定された少なくとも一つの要素がゼロです。
4つの方向に隣接する唯一の行列要素:上、下、左、右。
class Solution {
private int row;
private int col;
private int[][] vector = new int[][]{{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
/**
* DP(两次遍历,可 AC)
*/
public int[][] updateMatrix(int[][] matrix) {
row = matrix.length;
col = matrix[0].length;
// 第一次遍历,正向遍历,根据相邻左元素和上元素得出当前元素的对应结果
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (matrix[i][j] == 1) {
matrix[i][j] = row + col;
}
if (i > 0) {
matrix[i][j] = Math.min(matrix[i][j], matrix[i - 1][j] + 1);
}
if (j > 0) {
matrix[i][j] = Math.min(matrix[i][j], matrix[i][j - 1] + 1);
}
}
}
// 第二次遍历,反向遍历,根据相邻右元素和下元素及当前元素的结果得出最终结果
for (int i = row - 1; i >= 0; i--) {
for (int j = col - 1; j >= 0; j--) {
if (i < row - 1) {
matrix[i][j] = Math.min(matrix[i][j], matrix[i + 1][j] + 1);
}
if (j < col - 1) {
matrix[i][j] = Math.min(matrix[i][j], matrix[i][j + 1] + 1);
}
}
}
return matrix;
}
}