【leetcode】73.矩阵置零

107 阅读2分钟

leetcode-73.png

思路:这里不能简单的遇到0就进行操作,进行操作之后都变成0了,那就没法玩了,首先记录下0所在的坐标,然后再去将这些坐标的行列变成0即可。

这种解法的时间复杂度是O(col*row),空间复杂度是O(n),在这个基础之上,我们还可以优化空间复杂度,达到O(1)

var setZeroes = function (matrix) {
    let zero = []
    let row = matrix.length
    let col = matrix[0].length
    // 记录出现0的坐标
    for (let i = 0; i < row; ++i) {
        for (let j = 0; j < col; ++j) {
            if (matrix[i][j] === 0) {
                zero.push([i, j])
            }
        }
    }
    for (let [x, y] of zero) {
        // 行变成0
        matrix[x] = new Array(col).fill(0)
        // 列变成0
        for(let i = 0; i < row; ++i){
            matrix[i][y] = 0
        }
    }
};

下面这种解法的时间复杂度也是O(col*row),但是空间复杂度是O(1),只需要额外的空间来存放第一列以及第一行是否存在0
注意在置为0的时候,index起始为1,24行代码处

var setZeroes = function (matrix) {
    let row = matrix.length
    let col = matrix[0].length
    let rowZero = false, colZero = false
    // 记录第一行第一列是否有0
    // 因为这里的第一行第一列需要用来存放剩下的行列是否存在0
    // 所以需要暂存第一行第一列的情况
    for (let i = 0; i < row; ++i) {
        for (let j = 0; j < col; ++j) {
            if (matrix[i][0] === 0) colZero = true
            if (matrix[0][j] === 0) rowZero = true
        }
    }
    // 把行列里面存在0的坐标,标记到第一行第一列
    for (let i = 1; i < row; ++i) {
        for (let j = 1; j < col; ++j) {
            if (matrix[i][j] === 0) {
                matrix[0][j] = 0
                matrix[i][0] = 0
            }
        }
    }
    // 第一行第一列标记为0的地方就是需要置为0的行和列
    for(let i = 1; i < row; ++i){
        for(let j = 1; j < col; ++j){
            if(matrix[0][j] === 0 || matrix[i][0] === 0){
                matrix[i][j] = 0
            }
        }
    }
    // 列存在0,那就将第一列置为0
    if(colZero){
        for(let i = 0; i < row; ++i){
            matrix[i][0] = 0
        }
    }
    // 行存在0,那就将第一行置为0
    if(rowZero){
        for(let i = 0; i < col; ++i){
            matrix[0][i] = 0
        }
    }
};