题目:
给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法。
注意:
不要使用额外空间
思路一:
- 使用第一行和第一列做标志位,代替额外空间记录哪一行哪一列要置零。
- 遍历数组,当遇到一个零,就把这个零所在的行列的第一个数设为零作为标记,最后再遍历一遍,将有标记的行列统一置零
- 注意:第一行第一列本身也可能有零,不仅仅是作为其他行列的标志位,所以额外用两个变量(空间复杂度o(1))记录是否有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])
row_flag=col_flag=False
#记录第一行第一列是否有零
for i in range(row):
if matrix[i][0]==0:
col_flag=True
break
for j in range(col):
if matrix[0][j]==0:
row_flag=True
break
#从第二行第二列寻找零
for i in range(1,row):
for j in range(1,col):
if matrix[i][j]==0:
matrix[i][0]=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 row_flag:
for j in range(col):
matrix[0][j]=0
if col_flag:
for i in range(row):
matrix[i][0]=0