原文:73. 矩阵置零(leetcode 解题) - 每天一个JavaScript小知识@Js中文网 · 码农进阶题库

原文地址:https://www.javascriptc.com/interview-tips/zh_cn/leetcode/leetcode-javascript-solution-073/

题目:

难度:Middle

相关话题:数组

给定一个m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地 算法

示例1:

输入:
[
 [1,1,1],
 [1,0,1],
 [1,1,1]
]
输出:
[
 [1,0,1],
 [0,0,0],
 [1,0,1]
]

示例2:

输入:
[
 [0,1,2,0],
 [3,4,5,2],
 [1,3,1,5]
]
输出:
[
 [0,0,0,0],
 [0,4,5,0],
 [0,3,1,0]
]

进阶:

  • 一个直接的解决方案是使用 O(m n )的额外空间,但这并不是一个好的解决方案。

  • 一个简单的改进方案是使用 O(m +n ) 的额外空间,但这仍然不是最好的解决方案。

  • 你能想出一个常数空间的解决方案吗?


思路:

  1. O(mn)空间:重新创造一个新的matrix即可。
  2. O(m+n)空间:遍历matrix,发现0,就保存当前的行和列,最后将保存的行和列置零。
  3. O(1)空间:使用一个变量记录第一行初始是否有0,然后遍历,发现0,将当前列的第一行设置为0, 并且当前行也要重置为0

    最后将第一行存在0的列全部设置为0,并且如果第一行初始有0,重置为0

/**
 * @来源: Javascript中文网 - 前端进阶资源教程 https://www.javascriptc.com/
 * @介绍:一个致力于帮助开发者用代码改变世界为使命的平台,每天都可以在这里找到技术世界的头条内容
 * @param {number[][]} matrix
 * @return {void} Do not return anything, modify matrix in-place instead.
 */
var setZeroes = function(matrix) {
    // let rowC=[],
    //     colC=[]
    // for(let i=0;i<matrix.length;i++){
    //     for(let j=0;j<matrix[0].length;j++){
    //         if(matrix[i][j]===0){
    //             rowC[i]=true
    //             colC[j]=true
    //         }
    //     }
    // }
    // for(let i=0;i<matrix.length;i++){
    //     for(let j=0;j<matrix[0].length;j++){
    //         if(rowC[i])matrix[i][j]=0
    //     }
    // }
    //  for(let j=0;j<matrix[0].length;j++){
    //     for(let i=0;i<matrix.length;i++){
    //         if(colC[j])matrix[i][j]=0
    //     }
    // }
    let clearTop=matrix[0].includes(0)
    for(let i=1;i<matrix.length;i++){
        if(matrix[i].includes(0)){
            for(let j=0;j<matrix[i].length;j++){
                if(matrix[i][j]===0) matrix[0][j]=0
                else matrix[i][j]=0
            }
        }
    }
    for(let i=0;i<matrix[0].length;i++){
        if(matrix[0][i]===0){
            for(let j=1;j<matrix.length;j++){
                matrix[j][i]=0
            }
        }
    }
    if(clearTop){
        for(let i=0;i<matrix[0].length;i++){
            matrix[0][i]=0
        }
    }
};