Leetcode

73. Set Matrix Zeroes

Leeter 2021. 10. 17. 06:02

Description:

Given an m x n integer matrix matrix, if an element is 0, set its entire row and column to 0's, and return the matrix.

You must do it in place.

 

'''
[1] naive - using additional table)


additional=[[0 for _ in range(len(matrix[0]))] for _ in range(len(matrix))]

# set 1, if mat[row][col]==0
for row in range(len(matrix)):
    for col in range(len(matrix[row])):
        if matrix[row][col]==0:
            additional[row][col]=1

for i in range(len(matrix)):
    for j in range(len(matrix[i])):
        if additional[i][j]==1:
            
            for col in range(len(matrix[0])):
                matrix[i][col]=0
            for row in range(len(matrix)):
                matrix[row][j]=0

return matrix

- T/C: O(m*n*(m+n)) # if all elements of matrix are 0
- S/C: O(m*n)   # for additional matrix
'''

'''
[2] using set)

because the entire row(or col) should be 0, keep row and col where matrix[row][col]==0

ROW=len(matrix)
COL=len(matrix[0])

rows=set()
cols=set()

for i in range(ROW):
    for j in range(COL):
        if matrix[i][j]==0:
            rows.add(i)
            cols.add(j)

for i in range(ROW):
    for j in range(COL):
        if i in rows or j in cols:
            matrix[i][j]=0


- T/C: O(m*n)
- S/C: O(m+n)  #for two sets
'''

'''
[3] flag )

using first row and first col as flag

if matrix[i][j]==0:
    matrix[i][0]=0
    matrix[0][j]=0
    
and then, traversal matrix and set matrix zeros
* matrix[0][0] is special. the whole elements of matrix could be zeros, if considering matrix[0][0](==0) at the first
* so, should be treat first row and first col at the last time.
* and, it is needed to record wheter first_row and first_col need to be set zero or not

m=len(matrix)
n=len(matrix[0])

first_row=False
first_col=False
for i in range(m):
    for j in range(n):
        if matrix[i][j]==0:
            matrix[i][0]=0
            if i==0:
                first_row=True
            matrix[0][j]=0
            if j==0:
                first_col=True
            
for i in range(1,m):
    if matrix[i][0]==0:
        for j in range(n):
            matrix[i][j]=0

for j in range(1,n):
    if matrix[0][j]==0:
        for i in range(m):
            matrix[i][j]=0

if first_row:
    for i in range(n):
        matrix[0][i]=0
                
if first_col:
    for i in range(m):
        matrix[i][0]=0


- T/C: O(m*n)
- S/C: O(1)
'''


class Solution:
    def setZeroes(self, matrix: List[List[int]]) -> None:
        """
        Do not return anything, modify matrix in-place instead.
        """
        m=len(matrix)
        n=len(matrix[0])

        first_row=False
        first_col=False
        for i in range(m):
            for j in range(n):
                if matrix[i][j]==0:
                    matrix[i][0]=0
                    if i==0:
                        first_row=True
                    matrix[0][j]=0
                    if j==0:
                        first_col=True
            
        for i in range(1,m):
            if matrix[i][0]==0:
                for j in range(n):
                    matrix[i][j]=0

        for j in range(1,n):
            if matrix[0][j]==0:
                for i in range(m):
                    matrix[i][j]=0

        if first_row:
            for i in range(n):
                matrix[0][i]=0
                
        if first_col:
            for i in range(m):
                matrix[i][0]=0