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

进阶

  • 一个直观的解决方案是使用🥈 73. 矩阵置零 - 图1的额外空间,但这并不是一个好的解决方案。
  • 一个简单的改进方案是使用🥈 73. 矩阵置零 - 图2的额外空间,但这仍然不是最好的解决方案。
  • 你能想出一个仅使用常量空间的解决方案吗?

示例 1:
image.png

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

示例 2:
image.png

  1. 输入:matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
  2. 输出:[[0,0,0,0],[0,4,5,0],[0,3,1,0]]

提示

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

题解

这道题还是 比较容易的,因为只要一个坐标为0,整行、列坐标就是0,所以需要额外的空间去标记元素的状态。因为整行或者整列置0,所以不需要给每个元素标记状态,因此不需要🥈 73. 矩阵置零 - 图5的空间,只需要标记行状态和列状态,也就是🥈 73. 矩阵置零 - 图6空间。

使用标记数组

Python

  1. class Solution:
  2. def setZeroes(self, matrix: List[List[int]]) -> None:
  3. """
  4. Do not return anything, modify matrix in-place instead.
  5. """
  6. m=[0]*len(matrix)
  7. n=[0]*len(matrix[0])
  8. for i in range(len(matrix)):
  9. for j in range(len(matrix[0])):
  10. if matrix[i][j] == 0:
  11. m[i]=n[j] = 1
  12. for i in range(len(matrix)):
  13. for j in range(len(matrix[0])):
  14. if m[i] == 1 or n[j] == 1:
  15. matrix[i][j] = 0

JavaScript

  1. /**
  2. * @param {number[][]} matrix
  3. * @return {void} Do not return anything, modify matrix in-place instead.
  4. */
  5. var setZeroes = function(matrix) {
  6. let m = new Array(matrix.length).fill(0)
  7. let n = new Array(matrix[0].length).fill(0)
  8. for(let i = 0;i < matrix.length;i++){
  9. for(let j = 0;j < matrix[0].length;j++ ){
  10. if (matrix[i][j] === 0){
  11. m[i] = n[j] = 1
  12. }
  13. }
  14. }
  15. for(let i = 0;i < matrix.length;i++){
  16. for(let j = 0;j < matrix[0].length;j++ ){
  17. if (m[i] == 1 || n[j] == 1){
  18. matrix[i][j] = 0
  19. }
  20. }
  21. }
  22. };

复杂度分析

  • 时间复杂度:🥈 73. 矩阵置零 - 图7,其中 m 是矩阵的行数,n 是矩阵的列数。我们至多只需要遍历该矩阵两次。

  • 空间复杂度:🥈 73. 矩阵置零 - 图8,其中 m 是矩阵的行数,n 是矩阵的列数。我们需要分别记录每一行或每一列是否有零出现。

使用两个标记变量