矩阵置零
描述:
题解:
思路一:使用标记数组
我们可以用两个数组分别记录每一行和每一列是否有零出现。具体实现就是遍历这个矩阵,发现元素为0就将它所在的行和列设置为true
,代表有0出现。
拿示例2来举例子,就是如下的样子:
//开始时
arrRow = [false, false, false] //行数组
arrCol = [false, false, false, false] //列数组
//遍历整个矩阵后,将元素为0的所在行和列都设置为true
arrRow = [true, false, false]
arrCol = [true, false, false, true]
然后再次遍历该矩阵,如果元素所在的行为0或列为0,就将它置零,代码如下:
if (arrRow[row] || arrCol[col]) {
matrix[row][col] = 0
}
ES6
export function setZeroes(matrix) {
const m = matrix.length, n = matrix[0].length
// 使用两个标记数组分别存放row和col是否有零出现
const arrRow = new Array(m).fill(false)
const arrCol = new Array(n).fill(false)
for (let row = 0; row < m; row++) {
for (let col = 0; col < n; col++) {
if (matrix[row][col] == 0) {
arrRow[row] = arrCol[col] = true
}
}
}
// 再次遍历数组,用标记数组来更新原数组即可
for (let row = 0; row < m; row++) {
for (let col = 0; col < n; col++) {
if (arrRow[row] || arrCol[col]) {
matrix[row][col] = 0
}
}
}
}
时间复杂度:O(mn),空间复杂度:O(m+n)