Set Matrix Zeroes
可以利用一个rowList数组,记录每一行出现零的位置的列数,这样最后再重新set所有的就行了,边数0边set是肯定不对的
class Solution(object):
def setZeroes(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: void Do not return anything, modify matrix in-place instead.
"""
n = len(matrix)
if not n:
return
m = len(matrix[0])
if not m:
return
rowList = [[] for _ in xrange(n)]
for i in xrange(n):
for j in xrange(m):
if not matrix[i][j]:
rowList[i].append(j)
for index, colList in enumerate(rowList):
if colList:
matrix[index] = [0] * m
for col in colList:
for i in xrange(n):
matrix[i][col] = 0
此题如果想O(1)空间的话,首先我们必须先不管每列的头元素,检查其他元素,如果为0则把这个元素对应的行头和列头元素都设为0,第二遍我们倒序for循环,逐个元素排查,只要它对应的行头或者列头元素为0则我们将其设为0,对于列头元素这里则使用col1元素来判断应该设定的结果,这么做已经不是什么算法问题了,纯粹是array类一贯的小trick
class Solution(object):
def setZeroes(self, matrix):
n = len(matrix)
if not n:
return
m = len(matrix[0])
col1 = 1
for i in xrange(n):
if not matrix[i][0]:
col1 = 0
for j in xrange(1, m):
if not matrix[i][j]:
matrix[i][0] = 0
matrix[0][j] = 0
for i in xrange(n - 1, -1, -1):
for j in xrange(m - 1, 0, -1):
if matrix[i][0] == 0 or matrix[0][j] == 0:
matrix[i][j] = 0
if not col1:
matrix[i][0] = 0
简单来说算法分三步
- 检查第一列有没有0
- 对每个元素的行头列头进行修改,如果元素为0的话
- 重新再遍历大修,第一列的值单独的通过col变量来修改