给定一个 m x n 的矩阵,如果一个元素为 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]]
这个问题可以使用原地算法在一行一行地遍历矩阵的同时解决。当我们发现一个元素为0时,我们需要将这个元素所在行和列的所有元素都设为0。为了防止在遍历过程中越界,我们需要记录行和列的起始和结束位置。
具体来说,我们可以从第一行开始,从左到右遍历每一列。在遍历过程中,如果我们发现一个元素为0,则将该元素所在行和列的所有元素都设为0。为了不越界,我们需要确保每次只修改当前遍历到的元素以及它右边和下边的元素。
当我们处理完第一行后,我们可以将行和列的起始位置向右移动一位,然后从第二行开始重复上述过程,直到处理完所有行。
以下是实现这个算法的Python代码:
def setZeroes(matrix):
if not matrix:
return []
m = len(matrix)
n = len(matrix[0])
first_row = True
first_col = True
for i in range(m):
for j in range(n):
if matrix[i][j] == 0:
matrix[i][j] = 0
if first_row:
first_row = False
for k in range(m):
matrix[k][j] = 0
if first_col:
first_col = False
for k in range(n):
matrix[i][k] = 0
return matrix
代码注释: