矩阵置零

141 阅读3分钟

这是我参与2022首次更文挑战的第16天,活动详情查看:2022首次更文挑战

leetcode 矩阵置零

给定一个 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的时候,我们需要记录下当前0元素所在的行和列下标,同样可以使用一个数组记录下来,最后从新遍历一次数组,当遇到之前记录下需要设置为0的元素下标时,给当前元素赋值为0即可。

class Solution {
    public void setZeroes(int[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;
        boolean[] row = new boolean[m];
        boolean[] col = new boolean[n];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (matrix[i][j] == 0) {
                    row[i] = col[j] = true;
                }
            }
        }
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (row[i] || col[j]) {
                    matrix[i][j] = 0;
                }
            }
        }
    }
}

或者: 对于前面使用数组来记录0元素所在的行和列的方法的空间复杂度为O(m+n),时间成本有点高,所以可以考虑优化下,主要是需要记录每一行每一列是否有0元素,那么可以直接使用原数组来记录,利用数组的第一行和第一列来记录,这样就可以省略额外的空间了,但是原数组的第一行和第一列就不知道是不是原本就有0元素的了,所以还需要使用两个变量记录下第一行和第一列是否有0元素。具体的先判断二维数组第一行、第一列是否有0元素存在,然后遍历其他元素用第一行和第一列记录下0元素,最后再遍历一次把0元素所在行列赋值为0,最后对于第一行、第一列的元素,如果有0元素的,那么也要把整行或者列设置为0。

class Solution {
    public void setZeroes(int[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;
        boolean flagCol0 = false;
        boolean flagRow0 = false;
        for (int i = 0; i < m; i++) {
            if (matrix[i][0] == 0) {
                flagCol0 = true;
            }
        }
        for (int j = 0; j < n; j++) {
            if (matrix[0][j] == 0) {
                flagRow0 = true;
            }
        }
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                if (matrix[i][j] == 0) {
                    matrix[i][0] = matrix[0][j] = 0;
                }
            }
        }
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                if (matrix[i][0] == 0 || matrix[0][j] == 0) {
                    matrix[i][j] = 0;
                }
            }
        }
        if (flagCol0) {
            for (int i = 0; i < m; i++) {
                matrix[i][0] = 0;
            }
        }
        if (flagRow0) {
            for (int j = 0; j < n; j++) {
                matrix[0][j] = 0;
            }
        }
    }
}