Set Matrix Zeroes In Place in DSA Python - Time & Space Complexity
We want to know how the time to set zeroes in a matrix grows as the matrix size increases.
How does the number of steps change when the matrix gets bigger?
Analyze the time complexity of the following code snippet.
def set_zeroes(matrix):
rows, cols = len(matrix), len(matrix[0])
col_zero = False
for r in range(rows):
if matrix[r][0] == 0:
col_zero = True
for c in range(1, cols):
if matrix[r][c] == 0:
matrix[r][0] = 0
matrix[0][c] = 0
for r in range(1, rows):
for c in range(1, cols):
if matrix[r][0] == 0 or matrix[0][c] == 0:
matrix[r][c] = 0
if matrix[0][0] == 0:
for c in range(cols):
matrix[0][c] = 0
if col_zero:
for r in range(rows):
matrix[r][0] = 0
This code sets entire rows and columns to zero if any element in them is zero, using the first row and column as markers.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Nested loops scanning rows and columns of the matrix.
- How many times: Each element is checked or updated a few times, roughly proportional to the total number of elements (rows x columns).
As the matrix size grows, the number of steps grows roughly with the number of elements.
| Input Size (n x m) | Approx. Operations |
|---|---|
| 10 x 10 = 100 | About 300 to 400 steps |
| 100 x 100 = 10,000 | About 30,000 to 40,000 steps |
| 1000 x 1000 = 1,000,000 | About 3,000,000 to 4,000,000 steps |
Pattern observation: The steps grow roughly in direct proportion to the number of elements, so doubling rows and columns quadruples the work.
Time Complexity: O(n x m)
This means the time grows proportionally to the total number of elements in the matrix.
[X] Wrong: "Since we only mark zeros in the first row and column, the time complexity is less than scanning the whole matrix twice."
[OK] Correct: We still scan almost every element multiple times to mark and then update, so the total steps scale with the entire matrix size.
Understanding this helps you explain how to efficiently update large grids without extra space, a common real-world problem.
"What if we used extra space to store zero positions instead of marking in place? How would the time complexity change?"
Practice
Set Matrix Zeroes In Place problem?Solution
Step 1: Understand the problem requirement
The problem asks to change the matrix so that if any element is zero, all elements in that element's row and column become zero.Step 2: Identify the correct description
Modify the matrix so that if an element is 0, its entire row and column become 0. exactly describes this transformation, while others describe unrelated operations.Final Answer:
Modify the matrix so that if an element is 0, its entire row and column become 0. -> Option BQuick Check:
Set matrix zeroes means zero rows and columns [OK]
- Confusing with matrix transpose
- Thinking only the zero element changes
- Trying to sum or sort instead
Solution
Step 1: Analyze each initialization method
matrix = [[0]*3]*3 creates shallow copies of the same row, causing changes in one row to affect others. matrix = [[0 for _ in range(3)] for _ in range(3)] creates independent rows correctly. matrix = [0]*3 for _ in range(3) is invalid syntax. matrix = [0,0,0]*3 creates a flat list, not a matrix.Step 2: Choose the correct matrix initialization
Only matrix = [[0 for _ in range(3)] for _ in range(3)] correctly creates a 3x3 matrix with independent rows filled with zeros.Final Answer:
matrix = [[0 for _ in range(3)] for _ in range(3)] -> Option DQuick Check:
Use nested list comprehension for independent rows [OK]
- Using [[0]*3]*3 causes shared references
- Incorrect syntax in option C
- Flat list instead of 2D matrix
Set Matrix Zeroes In Place logic on this matrix?[[1, 2, 3], [4, 0, 6], [7, 8, 9]]
Solution
Step 1: Identify zero positions
The zero is at position (1,1) (second row, second column).Step 2: Set entire row 1 and column 1 to zero
Row 1 becomes [0,0,0]. Column 1 elements at rows 0 and 2 become zero, changing matrix to [[1,0,3],[0,0,0],[7,0,9]].Final Answer:
[[1, 0, 3], [0, 0, 0], [7, 0, 9]] -> Option AQuick Check:
Zero at (1,1) zeroes row 1 and column 1 [OK]
- Not zeroing the entire column
- Changing elements not in zero row/column
- Confusing row and column indices
def setZeroes(matrix):
rows = len(matrix)
cols = len(matrix[0])
zero_rows = set()
zero_cols = set()
for i in range(rows):
for j in range(cols):
if matrix[i][j] == 0:
zero_rows.add(i)
zero_cols.add(j)
for i in zero_rows:
for j in range(cols):
matrix[i][j] = 0
for j in zero_cols:
for i in range(rows):
matrix[i][j] = 0
Solution
Step 1: Analyze space usage
The code uses sets zero_rows and zero_cols to store indices, which uses extra space proportional to matrix size.Step 2: Understand in-place requirement
The problem requires modifying the matrix without extra space (in-place). Using sets violates this.Final Answer:
It uses extra space, not in-place modification. -> Option CQuick Check:
Extra sets mean not in-place [OK]
- Ignoring extra space used by sets
- Thinking diagonal needs special handling
- Assuming empty matrix causes error here
[[1,2,3],[4,0,6],[7,8,9]] in place to set zeroes without using extra space for rows and columns? Which approach is correct?Solution
Step 1: Use first row and column as markers
Mark zeros in first row and column to remember which rows and columns to zero later, avoiding extra space.Step 2: Update matrix based on markers
After marking, iterate matrix to set zeros in rows and columns indicated by markers, then handle first row and column separately.Final Answer:
Use first row and first column as markers to track zero rows and columns, then update matrix accordingly. -> Option AQuick Check:
First row/column markers enable in-place zeroing [OK]
- Using extra lists violates in-place rule
- Copying matrix wastes space
- Ignoring zero columns leads to wrong result
Ready to prove it?
Pass the test and this pattern moves unknown
