Skip to main content

矩阵置零

题目

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

提示:
  • m == matrix.length
  • n == matrix[0].length
  • 1 <= m, n <= 200
  • -2³¹ <= matrix[i][j] <= 2³¹ - 1
进阶:
  • 一个直观的解决方案是使用 O(m * n) 的额外空间, 但这并不是一个好的解决方案.
  • 一个简单的改进方案是使用 O(m + n) 的额外空间, 但这仍然不是最好的解决方案.
  • 你能想出一个仅使用常量空间的解决方案吗?
示例

73-set-zeroes-1

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

73-set-zeroes-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]]

题解

朴素做法是创建 rowscols 两个 HashSet, 遍历二维数组. 如果 matrix[i][j]0, 把 ij 分别存到 rowscols 之中. 这样再次遍历时, 如果 i 或者 j 存在于 HashSet 中, 说明该元素所在的行或列存在 0, 那自然该元素也要变成 0.

/**
* @param {number[][]} matrix
* @return {void} Do not return anything, modify matrix in-place instead.
*/
var setZeroes = function (matrix) {
const m = matrix.length
const n = matrix[0].length

const rows = new Set()
const cols = new Set()
for (let i = 0; i < m; i++) {
for (let j = 0; j < n; j++) {
if (matrix[i][j] === 0) {
rows.add(i)
cols.add(j)
}
}
}

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

复杂度分析

  • 时间复杂度: O(m * n)
  • 空间复杂度: O(m + n)