题目

编写一种算法,若M×N矩阵中某个元素为0,则将其所在的行与列清零。
image.png

思路

暴力法,需要注意二维数组切片是浅拷贝,需要利用copy.deepcopy进行深拷贝。

  1. class Solution:
  2. import copy
  3. def setZeroes(self, matrix: List[List[int]]) -> None:
  4. """
  5. Do not return anything, modify matrix in-place instead.
  6. """
  7. rows, cols = len(matrix), len(matrix[0])
  8. help_matrix = copy.deepcopy(matrix)
  9. for row in range(rows):
  10. for col in range(cols):
  11. if help_matrix[row][col] == 0:
  12. # 所在行,所在列全部置为0
  13. matrix[row] = [0 for _ in range(cols)]
  14. for j in range(rows):
  15. matrix[j][col] = 0

时间复杂度:O(n^2),两层循环
空间复杂度:O(n),深拷贝了一个额外的数组


更优雅的解法,减少重复置为0的操作。
第一次遍历matrix,记录哪一行和哪一列有0;
第二次遍历,将行有0的这一列全部置为0,将列有0的这一行全部置为0.

  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. row=set()
  7. column=set()
  8. for i in range(len(matrix)):
  9. for j in range(len(matrix[0])):
  10. if matrix[i][j]==0:
  11. row.add(i)
  12. column.add(j)
  13. for i in row:
  14. for j in range(len(matrix[0])):
  15. matrix[i][j]=0
  16. for j in column:
  17. for i in range(len(matrix)):
  18. matrix[i][j]=0