Files
leetcode/0073-set-matrix-zeroes/0073-set-matrix-zeroes.py
T

63 lines
2.3 KiB
Python

class Solution:
def setZeroes(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
# Total complexities:
# O(mn) time
# O(1) space
# Prepare first row/col for marking
firstEntry = matrix[0][0]
# - use m[0][0] as indicator for first row and col
NO_ZEROES_IN_FIRST_ROW_OR_COL = 1
ZERO_IN_FIRST_ROW = 2
ZERO_IN_FIRST_COL = 3
ZERO_IN_FIRST_ROW_AND_COL = 4
matrix[0][0] = NO_ZEROES_IN_FIRST_ROW_OR_COL
if firstEntry == 0:
matrix[0][0] = ZERO_IN_FIRST_ROW_AND_COL
else:
print(f"cp0")
# Search first col for 0s - O(n)
for i in range(1, len(matrix)):
print(f"cp1")
if matrix[i][0] == 0:
matrix[0][0] = ZERO_IN_FIRST_COL
break
# Search first row for 0s - O(m)
for j in range(1, len(matrix[0])):
if matrix[0][j] == 0:
if matrix[0][0] == ZERO_IN_FIRST_COL:
matrix[0][0] = ZERO_IN_FIRST_ROW_AND_COL
else:
matrix[0][0] = ZERO_IN_FIRST_ROW
break
# Find all zeros outside the first row/col - O(mn)
for i in range(1, len(matrix)):
for j in range(1, len(matrix[i])):
if matrix[i][j] == 0:
# Use the first row/col as markers
matrix[i][0] = 0
matrix[0][j] = 0
# Zero center as needed - O(mn)
for i in range(1, len(matrix)):
for j in range(1, len(matrix[i])):
if matrix[i][0] == 0 or matrix[0][j] == 0:
matrix[i][j] = 0
# Set first row/col if needed
if matrix[0][0] == ZERO_IN_FIRST_ROW or matrix[0][0] == ZERO_IN_FIRST_ROW_AND_COL:
for j in range(1, len(matrix[0])):
matrix[0][j] = 0
if matrix[0][0] == ZERO_IN_FIRST_COL or matrix[0][0] == ZERO_IN_FIRST_ROW_AND_COL:
for i in range(1, len(matrix)):
matrix[i][0] = 0
matrix[0][0] = firstEntry if matrix[0][0] == NO_ZEROES_IN_FIRST_ROW_OR_COL else 0