力扣第七十三题-矩阵置零

158 阅读2分钟

「这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战

前言

力扣第七十三题 矩阵置零 如下所示:

给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法

示例 1:

输入: matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出: [[1,0,1],[0,0,0],[1,0,1]]

示例 2:

输入: matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
输出: [[0,0,0,0],[0,4,5,0],[0,3,1,0]]

一、思路

通过题目我们可以得到一个关键的信息:0 所在的行和列都置为 0

我们知道 0 所在的行和列都要置为 0,所以我们需要知道哪些行和哪些列需要置为 0。我们可以使用两个一维布尔数组来存储这个信息 boolean[] rowFlagboolean[] colFlag

大致的步骤如下所示:

  1. 存储 0 的位置:遍历二维数组 matrix,如果 martrix[i][j] == 0,则将 rowFlag[i]colFlag[j] 置为 true
  2. 原地修改数组:再次遍历二维数组,如果 rowFlag[i] == truecolFlag[j] == true时,将 martrix[i][j] 置为 0 即可

举个例子

此处以 matrix = [[1,1,1],[1,0,1],[1,1,1]] 作为例子

  1. 存储 0 的位置:遍历 matrix后,可以将 rowFlag[1]colFlag[1] 赋值为 true
  2. 原地修改:再次遍历 matrix,只要 rowFlag[i] == true || colFlag[j] == true 就将 matrix[i][j] 置为 0
  3. 返回修改后的结果 [[1,0,1],[0,0,0],[1,0,1]] 即可

二、实现

实现代码

实现代码与思路中保持一致

    public void setZeroes(int[][] matrix) {
        int rowLen = matrix.length;
        int colLen = matrix[0].length;
        boolean[] rowFlag = new boolean[rowLen];
        boolean[] colFlag = new boolean[colLen];
        // 存储0的位置
        for (int i=0; i<rowLen; i++) {
            for (int j=0; j<colLen; j++) {
                if(matrix[i][j] == 0) {
                    rowFlag[i] = colFlag[j] = true;
                }
            }
        }
        // 原地修改
        for (int i=0; i<rowLen; i++) {
            for (int j = 0; j < colLen; j++) {
                if (rowFlag[i] || colFlag[j]) {
                    matrix[i][j] = 0;
                }
            }
        }
    }

测试代码

    public static void main(String[] args) {
        int[][] matrix = {{1,1,1},{1,0,1},{1,1,1}};
        new Number73().setZeroes(matrix);
    }

结果

image.png

三、总结

我是用了 m x n 的空间来存储 0 的位置的,你是否可以使用更小的存储空间实现原地修改呢?(提示:可以将首行首列作为存储 0 的标志)

感谢看到最后,非常荣幸能够帮助到你~♥

如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~