思路
根据题意,要使0元素所在的行和列都为0,那么可以先遍历矩阵,用一个辅助列表h1
记录下每一行循环时,0元素出现的列数,如果h1
为空,说明该行不存在0元素,反之存在,那么可以将该行全部置0;在每一行循环后,将h1
放到另一个辅助列表h
中,最后去重,对h
中的列置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])
h = []
for i in range(row):
h1 = [] #每次循环都置为空
for j in range(col):
if matrix[i][j] == 0:
h1.append(j)
if h1: #h1不为空,说明该行存在0元素,该行置0
matrix[i] = [0] * col
h.extend(h1) #不能用append,否则去重时会报错
h = list(set(h)) #去重
for m in h:
for n in range(row):
matrix[n][m] = 0
也可以遍历两次matrix,第一遍用集合记录哪些行,哪些列有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])
row_zero = set()
col_zero = set()
for i in range(row):
for j in range(col):
if matrix[i][j] == 0:
row_zero.add(i)
col_zero.add(j)
for i in range(row):
for j in range(col):
if i in row_zero or j in col_zero:
matrix[i][j] = 0
250217-思路-使用常数空间
关键思想: 用matrix第一行和第一列记录该行该列是否有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])
# 找寻第一行是有0
first_row_flag = 0
for j in range(col):
if matrix[0][j] == 0:
first_row_flag = 1
break
# 找第一列是否有0
first_col_flag = 0
for i in range(row):
if matrix[i][0] == 0:
first_col_flag = 1
break
# 以第一行第一列为标志位,记录每行每列是否含0
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
# 置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 first_col_flag:
for i in range(row):
matrix[i][0] = 0
if first_row_flag:
for j in range(col):
matrix[0][j] = 0