Set Matrix Zeroes In Place in DSA C - Time & Space Complexity
We want to know how the time to set matrix zeroes grows as the matrix size increases.
Specifically, how many steps does it take to update the matrix in place?
Analyze the time complexity of the following code snippet.
void setZeroes(int** matrix, int matrixSize, int* matrixColSize) {
int rows = matrixSize;
int cols = *matrixColSize;
int firstRowZero = 0;
int firstColZero = 0;
for (int i = 0; i < rows; i++) {
if (matrix[i][0] == 0) firstColZero = 1;
}
for (int j = 0; j < cols; j++) {
if (matrix[0][j] == 0) firstRowZero = 1;
}
for (int i = 1; i < rows; i++) {
for (int j = 1; j < cols; j++) {
if (matrix[i][j] == 0) {
matrix[i][0] = 0;
matrix[0][j] = 0;
}
}
}
for (int i = 1; i < rows; i++) {
for (int j = 1; j < cols; j++) {
if (matrix[i][0] == 0 || matrix[0][j] == 0) {
matrix[i][j] = 0;
}
}
}
if (firstColZero) {
for (int i = 0; i < rows; i++) matrix[i][0] = 0;
}
if (firstRowZero) {
for (int j = 0; j < cols; j++) matrix[0][j] = 0;
}
}
This code sets entire rows and columns to zero if any element in them is zero, modifying the matrix in place.
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 x cols times.
As the matrix size grows, the number of operations grows roughly with the number of elements.
| Input Size (rows x cols) | Approx. Operations |
|---|---|
| 10 x 10 = 100 | About 400 (4 passes over matrix) |
| 100 x 100 = 10,000 | About 40,000 |
| 1000 x 1000 = 1,000,000 | About 4,000,000 |
Pattern observation: Operations grow roughly proportional to the total number of elements, multiplied by a small constant.
Time Complexity: O(m x n)
This means the time grows linearly with the number of elements in the matrix.
[X] Wrong: "The time complexity is O((m x n)²) because of nested loops inside nested loops."
[OK] Correct: The nested loops run sequentially, not nested inside each other repeatedly; each element is visited a fixed number of times, not multiplied repeatedly.
Understanding how to analyze matrix operations helps you solve many real problems efficiently and shows you can reason about code performance clearly.
"What if we used extra space to store zero positions instead of modifying the matrix 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: Note the constraint of in-place modification
The matrix must be modified without using extra space for another matrix or large data structures.Final Answer:
Modify the matrix so that if an element is 0, its entire row and column become 0 without using extra space. -> Option CQuick Check:
Set matrix zeroes in place = Modify matrix rows and columns with zeros [OK]
- Using extra space like another matrix
- Only zeroing rows or only columns
- Not modifying the matrix in place
Solution
Step 1: Check correct 2D array declaration syntax in C
In C, a 2D array must have fixed sizes for both dimensions, and initialization uses nested braces.Step 2: Validate each option
int matrix[3][3] = {{1,2,3},{4,5,6},{7,8,9}}; correctly declares and initializes a 3x3 matrix. int matrix[3] = {1,2,3,4,5,6,7,8,9}; is a 1D array with too many elements. int matrix[][] = {{1,2,3},{4,5,6},{7,8,9}}; misses size for second dimension. int matrix[3][3] = {1,2,3,4,5,6,7,8}; has too few initializers (matrix[2][2] uninitialized).Final Answer:
int matrix[3][3] = {{1,2,3},{4,5,6},{7,8,9}}; -> Option AQuick Check:
Correct 2D array syntax = int matrix[3][3] = {{1,2,3},{4,5,6},{7,8,9}}; [OK]
- Missing size for second dimension
- Using 1D array for 2D data
- Incorrect initializer braces
int matrix[3][3] = {
{1, 0, 3},
{4, 5, 6},
{7, 8, 9}
};Solution
Step 1: Identify zero positions in original matrix
Zero is at position (0,1). So row 0 and column 1 must be zeroed.Step 2: Set entire row 0 and column 1 to zero
Row 0 becomes [0,0,0]. Column 1 elements at rows 1 and 2 become 0, so matrix[1][1]=0 and matrix[2][1]=0.Final Answer:
[[0, 0, 0], [4, 0, 6], [7, 0, 9]] -> Option BQuick Check:
Zero at (0,1) zeroes row 0 and col 1 = [[0, 0, 0], [4, 0, 6], [7, 0, 9]] [OK]
- Zeroing entire matrix
- Missing zeroing column elements
- Not zeroing row elements
void setZeroes(int matrix[3][3]) {
int i, j;
for(i=0; i<3; i++) {
for(j=0; j<3; j++) {
if(matrix[i][j] == 0) {
for(int k=0; k<3; k++) {
matrix[i][k] = 0;
matrix[k][j] = 0;
}
}
}
}
}Solution
Step 1: Analyze immediate zeroing inside nested loops
The code sets zeros immediately when it finds a zero, which changes matrix during iteration.Step 2: Understand cascading zeroing problem
New zeros created cause further zeroing in the same pass, leading to incorrect results.Final Answer:
It modifies zeros immediately causing cascading zeroing and incorrect results. -> Option DQuick Check:
Immediate zeroing causes cascading errors = It modifies zeros immediately causing cascading zeroing and incorrect results. [OK]
- Zeroing matrix while scanning
- Not separating marking and updating steps
- Assuming immediate zeroing is safe
int matrix[4][4] = {
{1, 2, 3, 4},
{5, 0, 7, 8},
{9, 10, 11, 12},
{0, 14, 15, 16}
};
Which is the correct matrix after applying the optimal in-place zeroing algorithm using first row and column as markers?Solution
Step 1: Identify zero positions
Zeros at (1,1) and (3,0).Step 2: Determine first row and first column zero flags
First row: no zeros (firstRowZero = false). First column: zero at (3,0) (firstColZero = true).Step 3: Mark zeros using first row and column (inner matrix)
Scan i=1 to 3, j=1 to 3: (1,1)=0 sets matrix[1][0]=0, matrix[0][1]=0.Step 4: Zero inner matrix using marks
For i=1 to 3, j=1 to 3: if matrix[i][0]==0 or matrix[0][j]==0, set matrix[i][j]=0. Zeros row 1 (mark at [1][0]), col 1 (mark at [0][1]), row 3 (orig [3][0]=0).Step 5: Apply flags to borders
First row unchanged (false). First col all zeroed (true): matrix[0][0]=0, matrix[2][0]=0 (among others).Final Answer:
[[0, 0, 3, 4], [0, 0, 0, 0], [0, 0, 11, 12], [0, 0, 0, 0]] -> Option AQuick Check:
Zeros at (1,1),(3,0) zero rows 1&3, cols 0&1 = [[0, 0, 3, 4], [0, 0, 0, 0], [0, 0, 11, 12], [0, 0, 0, 0]] [OK]
- Zeroing entire first row or column incorrectly
- Not marking zeros properly
- Overwriting markers too early
Ready to prove it?
Pass the test and this pattern moves unknown
