思路:这里不能简单的遇到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
}
}
};