难度:中等 日期:2023年5月28日
给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。
示例 1:
输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出:[[1,0,1],[0,0,0],[1,0,1]]示例 2:
输入:matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
输出:[[0,0,0,0],[0,4,5,0],[0,3,1,0]]
方法一:使用set结构标记数组
思路:将需要设为 0 的行 和 列 分别储存在对应的set结构中,然后遍历矩阵当当前行 或 列 在set结构中后,就将其值设置为0
var setZeroes = function(matrix) {
let setX = new Set();
let setY = new Set();
let n = matrix.length;let m = matrix[0].length;
for(let i = 0;i<n;i++){
for(let j = 0; j < m;j++){
if(matrix[i][j]===0){
setX.add(i);
setY.add(j);
}
}
}
for(let i = 0; i < n;i++){
for(let j = 0; j < m;j++){
if(setX.has(i) || setY.has(j)){
matrix[i][j] = 0;
}
}
}
};
结果
方法二:使用一个标记变量
思路:用一个变量标记矩阵第一个列的每一个行是否存在0值,当遇到矩阵中遇到0值时,将当前值所在的行 与 列的第一项都设为0,全部遍历完以后,再次遍历,判断当前值的行与列的首项是否为0,如果是则将当前值设为0
注意:如果只是判断当前值的首项是否为0就将该值设置为0的问题在于,如果例如首行有元素为0,就会把举证[0][0]位置的值设置为0,这种时候,当二次遍历的时候,矩阵所有第一列的元素也会被设置为0,因此,这里用一个变量标记是否初始的时候首列就有0值,从而确定是否需要将首列设置为0
var setZeroes = function(matrix) {
const m = matrix.length, n = matrix[0].length;
let flagCol0 = false;
for (let i = 0; i < m; i++) {
if (matrix[i][0] === 0) {
flagCol0 = true;
}
for (let j = 1; j < n; j++) {
if (matrix[i][j] === 0) {
matrix[i][0] = matrix[0][j] = 0;
}
}
}
for (let i = m - 1; i >= 0; i--) {
for (let j = 1; j < n; j++) {
if (matrix[i][0] === 0 || matrix[0][j] === 0) {
matrix[i][j] = 0;
}
}
if (flagCol0) {
matrix[i][0] = 0;
}
}
};
结果