题目:
难度: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(mn)
空间:重新创造一个新的matrix
即可。O(m+n)
空间:遍历matrix
,发现0
,就保存当前的行和列,最后将保存的行和列置零。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
}
}
};