问题

给定一个 _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

提示:

  • m == matrix.length
  • n == matrix[0].length
  • 1 <= m, n <= 200
  • -231 <= matrix[i][j] <= 231 - 1

进阶:

  • 一个直观的解决方案是使用  O(_m__n_) 的额外空间,但这并不是一个好的解决方案。
  • 一个简单的改进方案是使用 O(_m_ + _n_) 的额外空间,但这仍然不是最好的解决方案。
  • 你能想出一个仅使用常量空间的解决方案吗?

方法一

解题思路

先遍历一遍,记录需要归零的行和列,可以使用set去重,避免不必要的循环。

/**
 * @param {number[][]} matrix
 * @return {void} Do not return anything, modify matrix in-place instead.
 */
var setZeroes = function (matrix) {
    const row = matrix.length;
    const col = matrix[0].length;
 
    const rows = new Set();
    const cols = new Set();
 
    for (let i = 0; i < row; i++) {
        for (let j = 0; j < col; j++) {
            if (matrix[i][j] === 0) {
                rows.add(i);
                cols.add(j)
            }
        }
    }
 
 
    for (let i of rows.values()) {
        for (let j = 0; j < col; j++) {
            matrix[i][j] = 0;
        }
    }
 
    for  (let i of cols.values())  {
        for (let j = 0; j < row; j++) {
            matrix[j][i] = 0;
        }
    }
    return matrix;
};