73. Set Matrix Zeroes

你快乐吗?

Posted by bbkgl on September 26, 2019

73. Set Matrix Zeroes


99%,差不多100%,第一个版本解不是常数空间复杂度,这次更新常数复杂度的,讲一下思路。

  1. 矩阵中某个数为零,则将该数所在行的第一个数置零,所在列的第一个数置零,即matrix[0][j] = matrix[i][0] = 0;,这样并不会影响该列该行首个数的取值,因为他们最后都会被置零。即让首行首列记录哪一列有零,哪一行有零
  2. 遍历矩阵中非首行首列的每个元素,如果所在行首或者列首元素为零,则说明该行该列应该都为零,将该元素置零,最后达到目的
  3. 第一步操作可能会让首行首列是否有零这个信息损失掉,因为首行首列被用来存储其他信息了,会改变他们的取值,所以再定义两个变量row0,col0记录首行首列是否有零,并且这一步需要放在前面
  4. 总共定义了四个int变量,符合常数空间复杂度的要求
class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        int m = matrix.size();
        if (m == 0) return ;
        int n = matrix[0].size();
        bool row0 = false, col0 = false;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (matrix[i][j] == 0) {
                    if (i == 0) row0 = true;
                    if (j == 0) col0 = true;
                    matrix[0][j] = matrix[i][0] = 0;
                }
            }
        }
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                if (matrix[0][j] == 0 || matrix[i][0] == 0) 
                    matrix[i][j] = 0;
            }
        }
        if (col0)
            for (int i = 0; i < m; i++) matrix[i][0] = 0;
        if (row0)
            for (int j = 0; j < n; j++) matrix[0][j] = 0;
    }
};