代码思路:
这里用矩阵的第一行和第一列来标记是否含有0的元素,但这样会导致原数组的第一行和第一列被修改,无法记录它们是否原本包含 0。因此我们需要额外使用两个标记变量分别记录第一行和第一列是否原本包含 0。
class Solution:
def setZeroes(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
row = len(matrix) #代表矩阵的行
col = len(matrix[0]) #代表矩阵第一列
row0_flag = False #额外行变量记录行是否含0
col0_flag = False #额外列变量记录列是否含0
for j in range(col):
if matrix[0][j] == 0: #对于第一行各个列含0
row0_flag = True
break
for i in range(row):
if matrix[i][0] == 0: #对于第一列各个行含0
col0_flag =True
break
for i in range(1,row): #第一行到最后一行
for j in range(1,col): #第一列到最后一列
if matrix[i][j] == 0: #如果有一个值为0
#则这一行这一列都为0
matrix[i][0] = matrix[0][j] = 0
for i in range(1,row):
for j in range(1,col):
if matrix[i][0] == 0 or matrix[0][j] == 0:
matrix[i][j] = 0
if row0_flag: #如果行flag成立,那么第一行所有全为0
for j in range(col):
matrix[0][j] = 0
if col0_flag: #如果列flag成立,那么第一列所有全为0
for i in range(row):
matrix[i][0] = 0