【每日算法】Day1 leetcode73 矩阵置零

68 阅读1分钟

算法断了一段时间,但是发现还是自己的短板,决定再刷起来,一防止老年痴呆,二锻炼思维,三学习算法。这两天刷了几道二维数组的题目,先总结下。

题目一 73. 矩阵置零

思路

这个题目要求是原地修改,所以对空间有一定要求,这个题的问题是如果直接修改会导致很多数据变成0,影响了原来到底哪些数据是0,所以需要先把是0的位置记录下来,所以最简单的是使用行列两个数组,记录哪些应该设置为0,之后再把这些设置为0。

看答案前我的解法

var setZeroes = function(matrix) {
    const row = matrix.length;
    const col = matrix[0].length;
    const rowZero = [];
    const colZero = [];
    for (let i = 0; i < row; i++) {
        for (let j = 0; j < col; j++) {
            if (matrix[i][j] === 0) {
                rowZero.push(i);
                colZero.push(j);
            }
        }
    }
    for (let i = 0; i < row; i++) {
        if (rowZero.includes(i)) {
            for (let p = 0; p < col; p++) {
                matrix[i][p] = 0;
            }
        }
    }
    for (let j = 0; j < col; j++) {
        if (colZero.includes(j)) {
            for (let p = 0; p < row; p++) {
                matrix[p][j] = 0;
            }
        }
    }
    return matrix;
};

看了答案后,发现有2个地方要优化。

  1. 这个记录可以直接采用对应位置的数组置0,而不是一个个放进去。判断会快一些。
  2. 设置0的过程,直接一遍,然后判断当前行列是否应该清0,从而直接清0。

优化后:

var setZeroes = function(matrix) {
    const row = matrix.length;
    const col = matrix[0].length;
    const zeroRow = [];
    const zeroCol = [];
    for (let i = 0; i < row; i++) {
        for (let j = 0; j < col; j++) {
            if (matrix[i][j] === 0) {
                zeroRow[i] = true;
                zeroCol[j] = true;
            }
        }
    }
    for (let i = 0; i < row; i++) {
        for (let j = 0; j < col; j++) {
            if (zeroRow[i] || zeroCol[j]) {
                matrix[i][j] = 0;
            }
        }
    }
    return matrix;
}