每日一题 LeetCode 73. 矩阵置零 java题解

题目

https://leetcode-cn.com/problems/set-matrix-zeroes/
每日一题 LeetCode 73. 矩阵置零 java题解_第1张图片

分析

用第一行和第一列来标记每行/每列是否存在0。但这样会覆盖第一行第一列本身的0,所以我们用两个常量来标记第一行和第一列本身是否有0;

代码

class Solution {
    public void setZeroes(int[][] matrix) {
        int m = matrix.length, n = matrix[0].length;
        boolean flagCol0 = false, flagRow0 = false;
        //第一列是否有0
        for (int i = 0; i < m; i++) {
            if (matrix[i][0] == 0) {
                flagCol0 = true;
            }
        }
        //第一行是否有0
        for (int j = 0; j < n; j++) {
            if (matrix[0][j] == 0) {
                flagRow0 = true;
            }
        }
        //标记行列有0
        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;
                }
            }
        }
        //只要它的行列出现0,他就为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;
                }
            }
        }
        //第一列原来有0
        if (flagCol0) {
            for (int i = 0; i < m; i++) {
                matrix[i][0] = 0;
            }
        }
        //第一行原来有0
        if (flagRow0) {
            for (int j = 0; j < n; j++) {
                matrix[0][j] = 0;
            }
        }
    }
}

复杂度

时间复杂度:O(mn),其中 m 是矩阵的行数,n 是矩阵的列数。我们至多只需要遍历该矩阵两次。
空间复杂度:O(1),我们只需要常数空间存储若干变量。

你可能感兴趣的:(LeetCode,leetcode,java,数据结构,算法)