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

输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出:[[1,0,1],[0,0,0],[1,0,1]]
示例 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.lengthn == matrix[0].length1 <= m, n <= 200-231 <= matrix[i][j] <= 231 - 1
首先想到直接复制一个一样的矩阵
python
class Solution:
def setZeroes(self, matrix: List[List[int]]) -> None:
m, n = len(matrix), len(matrix[0])
# 复制一个完全一样的矩阵
copy = [row[:] for row in matrix]
# 遍历原矩阵
for i in range(m):
for j in range(n):
if copy[i][j] == 0: # 用copy来判断
# 将原矩阵的整行整列设为0
for k in range(n): # 行置零
matrix[i][k] = 0
for k in range(m): # 列置零
matrix[k][j] = 0
下面是使用O(m+n)的额外空间
python
class Solution:
def setZeroes(self, matrix: List[List[int]]) -> None:
m,n=len(matrix),len(matrix[0])
rz=[False]*m
cz=[False]*n
for i in range(m):
for j in range(n):
if matrix[i][j]==0:
rz[i]=True
cz[j]=True
for i in range(m):
for j in range(n):
if rz[i] or cz[j]:
matrix[i][j]=0
这里是用俩个全为false的数组存储这一行和这一列是否有0存在。
遍历metrix,如果当前位置为0,那么rz对应的这一行至True,代表这一行有0,列也一样。
最后如果这一行或者一列为true,那这个元素就置零。