题目:
编写一种算法,若M × N矩阵中某个元素为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]
]
解题思路:
要将matrix中元素为0的一行和一列全都变为0,那么我们就要知道0所在的行和列并记录下来。
因此,使用两个map来保存元素为0的行和列,遍历完整个matrix时,两个map集合中的key就是我们分别要清零的行和列(而且不会重复清零,因为map集合中没有重复的key)。
步骤:
直接看代码。
/**
* @param {number[][]} matrix
* @return {void} Do not return anything, modify matrix in-place instead.
*/
var setZeroes = function(matrix) {
// 先定义两个map集合,分别存放行和列
let row = new Map();
let col = new Map();
// 遍历matrix,将元素为0的行和列存入map中
for (let i = 0; i < matrix.length; i++) {
for (let j = 0; j < matrix[0].length; j++) {
if (matrix[i][j] === 0) {
row.set(i,1)
col.set(j,1)
}
}
}
// 遍历行map,将存在的行全都清零
for (let [key, value] of row) {
for (let i = 0; i < matrix[0].length; i++) {
matrix[key][i] = 0;
}
}
// 遍历列map,将存在的列全都清零
for (let [key, value] of col) {
for (let i = 0; i < matrix.length; i++) {
matrix[i][key] = 0;
}
}
//最后返回清零的matrix
return matrix;
};