给定一个m×n的矩阵,如果一个元素为0,则将其所在行和列的所有的元素都设为0,请使用原地算法。
示例 1:
输入:
[
[1,1,1],
[1,0,1],
[1,1,1]
]
输出:
[
[1,0,1],
[0,0,0],
[1,0,1]
]
示例 2:
输入:
[
[0,1,2,0],
[3,4,5,2],
[1,3,1,5]
]
输出:
[
[0,0,0,0],
[0,4,5,0],
[0,3,1,0]
]
进阶:
- 一个直接的解决方案是使用 O(mn) 的额外空间,但这并不是一个好的解决方案。
- 一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。
- 你能想出一个常数空间的解决方案吗?
解题:这个题的要求是使用原地算法,即不使用额外的空间。
1.考虑利用原矩阵的首行首列存储0元素所在的行和列的位置。即,如果(i,j)位置的元素为0,那么第i行和第j列都要置0,因此映射到首行首列的位置为(0,j),(i,0)。
2.同时也要考虑到首行和首列是否存在0的情况,如果存在,经过1的操作,该0可能被覆盖.。
3.设置两个flag,判断首行和首列本身是否存在0元素。如果存在设置为True,然后决定首行和首列是否置零。(这一点要最先处理)
def setZeroes(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
# 设置两个Flag,判断首行首列是否存在0元素
row,col=False,False
for i in range(len(matrix)):
if matrix[i][0]==0:
row=True
for j in range(len(matrix[0])):
if matrix[0][j]==0:
col=True
# 将0元素映射到首行首列
for i in range(len(matrix)):
for j in range(len(matrix[0])):
if matrix[i][j]==0:
matrix[i][0]=0
matrix[0][j]=0
# 根据首行首列的0将除了首行首列外的对应行列的元素置零
for i in range(1,len(matrix)):
if matrix[i][0]==0:
for j in range(len(matrix[0])):
matrix[i][j]=0
for j in range(1,len(matrix[0])):
if matrix[0][j]==0:
for i in range(len(matrix)):
matrix[i][j]=0
# 根据Flag判断是否将首行首列置零
if col:
for j in range(len(matrix[0])):
matrix[0][j]=0
if row:
for i in range(len(matrix)):
matrix[i][0]=0
print(matrix)