2020/3/21 打卡
题目
给定一个 m x 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]
]
思路
我们利用矩阵的第一行和第一列保存该行或者列是否应被置为0。
(1)定义flag_line=False,判断第一行是否需要置00。定义flag_row=False,判断第一列是否需要置0。
(2)遍历第一列,若第一列中存在0,将flag_row=True,表示需要将第一列置0。
(3)遍历第一行,若第一行中存在0,将flag_line=True,表示需要将第一行置0。
(4)遍历矩阵,遍历区间,行区间[1,m),列区间[1,m),若matrix[i][j]==0,则将对应的行和列记录下来,即将第一行和第一列中对应的位置置为0。matrix[i][0]=matrix[0][j]=0
(5)再遍历一次矩阵,若当前位置的行或列索引对应的第一行或者第一列处为0,即matrix[i][0]==0 or matrix[0][j]==0,将此位置置为0。
(6)根据flag_line,判断是否需要将第一行置为0。
(7)根据flag_row,判断第一列是否需要置0。
时间复杂度:O(M*N)
空间复杂度:O(1)
代码
class Solution:
def setZeroes(self, matrix):
"""
Do not return anything, modify matrix in-place instead.
"""
# 定义flag_line=False,判断第一行是否需要置00。定义flag_row=False,判断第一列是否需要置0。
flag_line=False
flag_row=False
m=len(matrix)
n=len(matrix[0])
#遍历第一列,若第一列中存在0,将flag_row=True,表示需要将第一列置0。
for i in range(m):
if(matrix[i][0]==0):
flag_row=True
break
#遍历第一行,若第一行中存在0,将flag_line=True,表示需要将第一行置0。
for i in range(n):
if(matrix[0][i]==0):
flag_line=True
break
#遍历矩阵,遍历区间,行区间[1,m),列区间[1,m),若matrix[i][j]==0,则将对应的行和列记录下来,即将第一行和第一列中对应的位置置为0。matrix[i][0]=matrix[0][j]=0
for i in range(1,m):
for j in range(1,n):
if(matrix[i][j]==0):
matrix[i][0]=matrix[0][j]=0
#再遍历一次矩阵,若当前位置的行或列索引对应的第一行或者第一列处为0,即matrix[i][0]==0 or matrix[0][j]==0,将此位置置为0。
for i in range(1,m):
for j in range(1,n):
if(matrix[i][0]==0 or matrix[0][j]==0):
matrix[i][j]=0
#根据flag_line,判断是否需要将第一行置为0。 根据flag_row,判断第一列是否需要置0。
if(flag_row):
for i in range(m):
matrix[i][0]=0
if(flag_line):
for i in range(n):
matrix[0][i]=0