需求分析
给定一个由 0 和 1 组成的矩阵 mat ,请输出一个大小相同的矩阵,其中每一个格子是 mat 中对应位置元素到最近的 0 的距离,两个相邻元素间的距离为1
代码实现
public int[][] updateMatrix(int[][] mat) {
int row = mat.length,col = mat[0].length;
int[][] res = new int[row][col];
int stepMax = row + col;
for (int i = 0; i < row; ++i) {
for (int j = 0; j < col; ++j) {
if (mat[i][j] != 0) res[i][j] = stepMax;
}
}
for (int i = 0; i < row; ++i) {
for (int j = 0; j < col; ++j) {
if (i != 0 && res[i - 1][j] < res[i][j] - 1) res[i][j] = res[i - 1][j] + 1;
if (j != 0 && res[i][j - 1] < res[i][j] - 1) res[i][j] = res[i][j - 1] + 1;
}
}
for (int i = row - 1; i >= 0; --i) {
for (int j = col - 1; j >= 0; --j) {
if (i != row - 1 && res[i + 1][j] < res[i][j] - 1) res[i][j] = res[i + 1][j] + 1;
if (j != col - 1 && res[i][j + 1] < res[i][j] - 1) res[i][j] = res[i][j + 1] + 1;
}
}
return res;
}
时间复杂度分析
时间复杂度为 O(mn),其中 m 和 n 分别是矩阵的行数和列数
代码分析
具体实现过程如下:
-
首先获取矩阵的行数和列数,并创建一个与原矩阵同样大小的新矩阵 res,用于存储每个元素到最近的 0 的距离。
-
然后遍历原矩阵,对于每个不为 0 的元素,将其在 res 矩阵中的值设为一个较大的值,这里使用了一个 stepMax 变量,它的值为矩阵的行数和列数之和。
-
接下来进行两次遍历,第一次从左上角开始,第二次从右下角开始,对于每个位置 (i, j),分别检查其上方、左方、下方、右方的位置,如果它们到最近的 0 的距离比当前位置的距离小 1,就更新当前位置的距离。
-
最后返回新矩阵 res。