Set Matrix Zeroes In Place in DSA Go - Time & Space Complexity
We want to understand how the time needed to set matrix zeroes 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.
func setZeroes(matrix [][]int) {
rows, cols := len(matrix), len(matrix[0])
rowZero, colZero := false, false
for i := 0; i < rows; i++ {
if matrix[i][0] == 0 {
colZero = true
}
}
for j := 0; j < cols; j++ {
if matrix[0][j] == 0 {
rowZero = true
}
}
for i := 1; i < rows; i++ {
for j := 1; j < cols; j++ {
if matrix[i][j] == 0 {
matrix[i][0] = 0
matrix[0][j] = 0
}
}
}
for i := 1; i < rows; i++ {
for j := 1; j < cols; j++ {
if matrix[i][0] == 0 || matrix[0][j] == 0 {
matrix[i][j] = 0
}
}
}
if rowZero {
for j := 0; j < cols; j++ {
matrix[0][j] = 0
}
}
if colZero {
for i := 0; i < rows; i++ {
matrix[i][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 the matrix elements twice.
- How many times: Each nested loop runs roughly (rows - 1) * (cols - 1) times.
As the matrix size grows, the number of operations grows roughly with the number of elements.
| Input Size (n x n) | Approx. Operations |
|---|---|
| 10 x 10 | About 162 (two passes over 9x9) |
| 100 x 100 | About 19,602 (two passes over 99x99) |
| 1000 x 1000 | About 1,996,002 (two passes over 999x999) |
Pattern observation: Operations grow roughly with the square of the matrix size.
Time Complexity: O(m * n)
This means the time needed grows proportionally to the total number of elements in the matrix.
[X] Wrong: "The time complexity is O(m + n) because we only scan rows and columns separately."
[OK] Correct: The nested loops scan almost all elements inside the matrix, so the time depends on the product of rows and columns, not just their sum.
Understanding this time complexity helps you explain how your solution scales with matrix size, a key skill in coding interviews.
"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 any row or column containing a zero should be set entirely to zero.Step 2: Identify the correct operation
Only Modify the matrix so that if an element is 0, its entire row and column become 0 describes this exact operation, modifying rows and columns based on zero elements.Final Answer:
Modify the matrix so that if an element is 0, its entire row and column become 0 -> Option AQuick Check:
Set rows and columns to zero = Modify matrix [OK]
- Confusing with matrix transpose
- Trying to sum elements instead of modifying
- Sorting rows instead of zeroing
Solution
Step 1: Understand Go 2D array declaration
In Go, fixed-size 2D arrays use syntax like [rows][cols]type, so [2][2]int is a 2x2 matrix.Step 2: Check each option
matrix := [2][2]int{{1, 2}, {3, 4}} correctly declares a 2x2 integer array with values. matrix := [][]int{{1, 2}, {3, 4}} is a slice of slices (dynamic), not a fixed-size array. matrix := [][]int{1, 2, 3, 4} and D are invalid for 2D matrix.Final Answer:
matrix := [2][2]int{{1, 2}, {3, 4}} -> Option BQuick Check:
Fixed 2D array syntax = [2][2]int [OK]
- Using slice syntax when fixed array needed
- Incorrect nesting of braces
- Declaring 1D array instead of 2D
matrix := [][]int{
{1, 2, 3},
{4, 0, 6},
{7, 8, 9},
}
// After applying Set Matrix Zeroes In Place logic
// (zero out rows and columns containing zero)
Solution
Step 1: Identify zero positions
Zero is at matrix[1][1]. So row 1 and column 1 must be zeroed.Step 2: Apply zeroing
Row 1 becomes [0,0,0]. Column 1 elements at rows 0 and 2 become 0. So matrix[0][1] and matrix[2][1] are zero.Final Answer:
[[1, 0, 3], [0, 0, 0], [7, 0, 9]] -> Option CQuick Check:
Zero row and column applied correctly = [[1,0,3],[0,0,0],[7,0,9]] [OK]
- Zeroing entire matrix
- Missing zero in column 1 for rows 0 and 2
- Zeroing wrong rows or columns
func setZeroes(matrix [][]int) {
for i := 0; i < len(matrix); i++ {
for j := 0; j < len(matrix[0]); j++ {
if matrix[i][j] == 0 {
for k := 0; k < len(matrix); k++ {
matrix[k][j] = 0
}
for l := 0; l < len(matrix[0]); l++ {
matrix[i][l] = 0
}
}
}
}
}
What is the main problem with this code?Solution
Step 1: Analyze matrix modification during iteration
The code sets zeros immediately when it finds a zero, changing matrix elements during iteration.Step 2: Understand side effects
This causes new zeros to appear and triggers more zeroing incorrectly, leading to wrong final matrix.Final Answer:
It modifies the matrix while iterating, causing incorrect zeroing -> Option DQuick Check:
In-place modification during scan = incorrect zeroing [OK]
- Changing matrix while scanning
- Not using extra storage or flags
- Assuming immediate zeroing is safe
Solution
Step 1: Understand space constraints
O(1) extra space means no additional matrix or large data structures allowed.Step 2: Use first row and column as markers
Mark zeros in first row and column to remember which rows and columns to zero later, then update matrix in place.Step 3: Avoid extra space and recursion
Options A and B use extra space, D uses recursion unnecessarily.Final Answer:
Use first row and first column as markers to track zero rows and columns, then update matrix accordingly -> Option AQuick Check:
In-place markers = O(1) space zeroing [OK]
- Using extra arrays violating space constraint
- Modifying matrix during iteration without markers
- Overcomplicating with recursion
Ready to prove it?
Pass the test and this pattern moves unknown
