leetcode: 73. Set Matrix Zeroes

来源:互联网 发布:二手玫瑰知乎 编辑:程序博客网 时间:2024/06/03 23:41

Q

Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.

Follow up:
Did you use extra space?
A straight forward solution using O(mn) space is probably a bad idea.
A simple improvement uses O(m + n) space, but still not the best solution.
Could you devise a constant space solution?

AC

class Solution(object):    def setZeroes(self, matrix):        """        :type matrix: List[List[int]]        :rtype: void Do not return anything, modify matrix in-place instead.        """        if not matrix:            return matrix        # find all (row, col) value 0 and put to stack        stack = []        rows = len(matrix)        cols = len(matrix[0])        for row in xrange(rows):            for col in xrange(cols):                if matrix[row][col] == 0:                    stack.append((row, col))        # calc 0 rows and cols        rows_zero = set([x[0] for x in stack])        cols_zero = set([x[1] for x in stack])        # set rows zero and cols zero        for i in rows_zero:            matrix[i] = [0] * cols        for j in cols_zero:            for i in xrange(rows):                matrix[i][j] = 0# Time:  O(m * n)# Space: O(1)class Solution2(object):    def setZeroes(self, matrix):        first_col = reduce(lambda acc, i: acc or matrix[i][0] == 0, xrange(len(matrix)), False)        first_row = reduce(lambda acc, j: acc or matrix[0][j] == 0, xrange(len(matrix[0])), False)        for i in xrange(1, len(matrix)):            for j in xrange(1, len(matrix[0])):                if matrix[i][j] == 0:                    matrix[i][0], matrix[0][j] = 0, 0        for i in xrange(1, len(matrix)):            for j in xrange(1, len(matrix[0])):                if matrix[i][0] == 0 or matrix[0][j] == 0:                    matrix[i][j] = 0        if first_col:            for i in xrange(len(matrix)):                matrix[i][0] = 0        if first_row:            for j in xrange(len(matrix[0])):                matrix[0][j] = 0if __name__ == "__main__":    matrix = [ [1, 0, 1, 1], [1, 1, 0, 1], [1, 1, 1, 0], [1, 1, 1, 1]]    Solution().setZeroes(matrix)    assert matrix == [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [1, 0, 0, 0]]


原创粉丝点击