算法之数字重建

114 阅读1分钟

需求分析

给定一个由 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 分别是矩阵的行数和列数

代码分析

具体实现过程如下:

  1. 首先获取矩阵的行数和列数,并创建一个与原矩阵同样大小的新矩阵 res,用于存储每个元素到最近的 0 的距离。

  2. 然后遍历原矩阵,对于每个不为 0 的元素,将其在 res 矩阵中的值设为一个较大的值,这里使用了一个 stepMax 变量,它的值为矩阵的行数和列数之和。

  3. 接下来进行两次遍历,第一次从左上角开始,第二次从右下角开始,对于每个位置 (i, j),分别检查其上方、左方、下方、右方的位置,如果它们到最近的 0 的距离比当前位置的距离小 1,就更新当前位置的距离。

  4. 最后返回新矩阵 res。