跳到主要内容

73. 矩阵置零

题目描述

给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 **原地 ** 算法。

示例 1:

示例 1

输入matrix = [[1,1,1],[1,0,1],[1,1,1]]

输出[[1,0,1],[0,0,0],[1,0,1]]

示例 2:

示例 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]]

提示:

  • m == matrix.length
  • n == matrix[0].length
  • 1 <= m, n <= 200
  • -231 <= matrix[i][j] <= 231 - 1

进阶:

  • 一个直观的解决方案是使用 O(mn) 的额外空间,但这并不是一个好的解决方案。
  • 一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。
  • 你能想出一个仅使用常量空间的解决方案吗?

出处LeetCode

解法一:原地标记

思路

我们可以使用矩阵的第一行和第一列来标记该行和该列是否需要置零。但是,我们需要注意的是,第一行和第一列的第一个元素是重合的,因此我们需要额外一个变量来标记第一列是否需要置零。

实现

function setZeroes(matrix: number[][]): void {
const m = matrix.length;
const 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] = 0;
matrix[0][j] = 0;
}
}
}

for (let i = 1; i < m; i++) {
for (let j = 1; j < n; j++) {
if (matrix[i][0] === 0 || matrix[0][j] === 0) {
matrix[i][j] = 0;
}
}
}

if (matrix[0][0] === 0) {
for (let j = 0; j < n; j++) {
matrix[0][j] = 0;
}
}

if (flagCol0) {
for (let i = 0; i < m; i++) {
matrix[i][0] = 0;
}
}
}

复杂度分析

  • 时间复杂度:O(mn)O(mn)
  • 空间复杂度:O(1)O(1)