Set Matrix Zeroes
要点:用第一行和第一列来记录本行/列的情况。这里的catch是第一行/列本身的情况会被wipe掉。比如第一行都是1,那么其他列为0会置其为0。这样第一行的信息就没了。用一个变量就可以先记录行列信息。
错误点
- 这题之所以总是有confusion,是因为在记录的时候用了另一个小技巧:如果第一行的某一个值已经是0了,那么最终这一列代表的总是0,所以记录的0/1和最终的列情况是一致的。但是这是列信息,而不是对应的第一行的最终情况,因为其他行的同列也可能会把这个设成0。
- 在最后set行列的时候,不包括第一行/列(因为第一行/列的最终情况是由开始的两个变量决定的,而没有被set成0的位置仍可能保留)。
- 而记录的时候包括(因为第一行的0也会reset列,对列同样)
- 因为要分三步走,行列一定别弄混
class Solution(object):
def setZeroes(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: void Do not return anything, modify matrix in-place instead.
"""
m = len(matrix)
n = len(matrix[0])
# mark first row/col
firstRow, firstCol = True, True
for i in range(n):
if matrix[0][i]==0:
firstRow = False
break
for i in range(m):
if matrix[i][0]==0:
firstCol = False
break
# mark row/col
for i in range(m):
for j in range(n):
if matrix[i][j]==0:
matrix[0][j]=0
matrix[i][0]=0
# set all rows/cols
for j in range(1,n):
if matrix[0][j]==0:
for i in range(1,m):
matrix[i][j]=0
for i in range(1,m):
if matrix[i][0]==0:
for j in range(1,n):
matrix[i][j]=0
if not firstRow:
for i in range(n):
matrix[0][i]=0
if not firstCol:
for i in range(m):
matrix[i][0]=0