leetcode刷题记录-面试题 01.08. 零矩阵

71 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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;
            }
        }
    }
};

image.png