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

简单来说算法分三步

  1. 检查第一列有没有0
  2. 对每个元素的行头列头进行修改,如果元素为0的话
  3. 重新再遍历大修,第一列的值单独的通过col变量来修改

results matching ""

    No results matching ""