持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情
前言
今天的题目为中等,题目比较简单,通过模拟就能够简单解决。
每日一题
今天的题目是 面试题 01.08. 零矩阵,难度为中等
编写一种算法,若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]
]
题解
标记
题目的要求比较简单,当二维数组中存在0的时候,就把0的这一行和这一列都变为0,那么首先想到的最简单的解法,就是标记,我们可以记录下0出现的位置,当每个0出现的时候,记录下它的行和列并且保存起来,然后二次遍历原数组,当双重遍历的时候碰到的当前的行和列某一个是被标记过的,就把当前位置的元素置为0,直到数组循环结束。
比如说例子中的第一个数组,那么就是在首次遍历到 matrix[1][1] 的时候,把这个位置的行和列进行标记,第二次遍历数组的时候,只要碰到了行或者是列等于1,就把当前位置的元素置为0.比方说 matrix[1][0] matrix[0][1] ...等等,只要其中一个满足就更改。
题目要求在原地修改,所以函数不需要返回值,直接原地修改数组。
/**
Do not return anything, modify matrix in-place instead.
*/
function setZeroes(matrix: number[][]): void {
if(matrix.length==0) return
let n = matrix.length;
let m = matrix[0].length
const row = new Array(m).fill(0);
const col = new Array(n).fill(0);
for (let i=0;i<n;i++) {
for (let j=0;j<m;j++) {
if (matrix[i][j] === 0) {
row[i] = col[j] = 1;
}
}
}
for (let i=0;i<n;i++) {
for (let j=0;j<m;j++) {
if (row[i] || col[j]) {
matrix[i][j] = 0;
}
}
}
};