美文网首页Leetcode
Leetcode.73.Matrix Zeroes

Leetcode.73.Matrix Zeroes

作者: Jimmy木 | 来源:发表于2019-08-21 10:40 被阅读0次

题目

给定一个m*n的矩阵, 如果某个数为0, 则将该行和列都置为0.

Input: [[1,1,1],[1,0,1],[1,1,1]]
Output: [[1,0,1],[0,0,0],[1,0,1]]

思路1

最简单的方式, 先遍历, 将为0的行和列存在set中, 再将set中的行和列设置为0.

时间复制度O(m*n), 空间复杂度O(m+n)

void setZeroes(vector<vector<int>>& matrix) {
  // 找出为0的行和列
  int m = matrix.size();
  if (m == 0) {
      return;
  }
  int n = matrix[0].size();
  set<int> zeroRows;
  set<int> zeroCols;
  for (int i = 0;i < m; i++) {
      for (int j = 0;j < n; j++) {
          if(matrix[i][j] == 0) {
              zeroRows.insert(i);
              zeroCols.insert(j);
          }
      }
  }

  for (int i = 0;i < m; i++) {
      for (int j = 0;j < n; j++) {
          if(zeroRows.find(i) != zeroRows.end() || zeroCols.find(j) != zeroCols.end()) {
              matrix[i][j] = 0; 
          }
      }
  }
}

思路2

主要优化空间复杂度, 利用矩阵本身的第一行和第一列用于存储需要置为0的位置. 第一行和第一列的情况需要用其他参数记录.

时间复制度O(m*n), 空间复杂度O(1).

void setZeroes(vector<vector<int>>& matrix) {
    int m = matrix.size();
    if (m == 0) {
        return;
    }
    int n = matrix[0].size();
    int64_t rowZero = 0, colZero = 0;

    bool isFirstRowZero = false;
    bool isFirstColZero = false;
    for (int i = 0;i < m; i++) {
        for (int j = 0;j < n; j++) {
            if(matrix[i][j] == 0) {
                matrix[0][j] = 0;
                matrix[i][0] = 0;
                if (i == 0) {
                    isFirstRowZero = true;
                }
                if (j == 0) {
                    isFirstColZero = true;
                }
            }
        }
    }
  for (int i = 1;i < m; i++) {
      if (matrix[i][0] == 0) {
          for (int j = 1;j < n; j++) {
              matrix[i][j] = 0;
         }
      }
  }
  for (int j = 1;j < n; j++) {
      if (matrix[0][j] == 0) {
          for (int i = 1;i < m; i++) {
              matrix[i][j] = 0;
          }
      }
  }
  if (isFirstRowZero) {
      for (int i = 1;i < n; i++) {
          matrix[0][i] = 0;
      }
  }
  if (isFirstColZero) {
      for (int i = 1;i < m; i++) {
          matrix[i][0] = 0;
      }
  }
}

总结

不止优化时间复杂度, 优化空间复杂度也很重要.

往往通过巧妙的办法记录空间, 比如位运算可以大大减少空间, 但位运算容易越界.

相关文章

网友评论

    本文标题:Leetcode.73.Matrix Zeroes

    本文链接:https://www.haomeiwen.com/subject/jbfbsctx.html