边工作边刷题:70天一遍leetcode: day 24

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
                
原文地址:https://www.cnblogs.com/absolute/p/5678004.html