Set Matrix Zeroes In Place in DSA Javascript - 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.
function setZeroes(matrix) {
const m = matrix.length;
const n = matrix[0].length;
let firstColHasZero = false;
for (let i = 0; i < m; i++) {
if (matrix[i][0] === 0) firstColHasZero = true;
for (let j = 1; j < n; j++) {
if (matrix[i][j] === 0) {
matrix[i][0] = 0;
matrix[0][j] = 0;
}
}
}
for (let i = 1; i < m; i++) {
for (let j = 1; j < n; j++) {
if (matrix[i][0] === 0 || matrix[0][j] === 0) {
matrix[i][j] = 0;
}
}
}
if (matrix[0][0] === 0) {
for (let j = 0; j < n; j++) matrix[0][j] = 0;
}
if (firstColHasZero) {
for (let i = 0; i < m; i++) matrix[i][0] = 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 rows and columns.
- How many times: Each nested loop runs over all elements, roughly m x n times.
As the matrix size grows, the number of operations grows with the total number of elements.
| Input Size (m x n) | Approx. Operations |
|---|---|
| 10 x 10 = 100 | About 200 (two passes over all elements) |
| 100 x 100 = 10,000 | About 20,000 |
| 1000 x 1000 = 1,000,000 | About 2,000,000 |
Pattern observation: Operations grow roughly proportional to the number of elements in the matrix.
Time Complexity: O(m x n)
This means the time needed grows directly with the total number of elements in the matrix.
[X] Wrong: "Since there are nested loops, the time complexity must be O((m x n)²)."
[OK] Correct: The nested loops do not multiply the total elements twice; they just scan the matrix a few times, so the total work is proportional to m x n, not squared.
Understanding how to analyze matrix operations helps you explain your code clearly and shows you can think about efficiency in real problems.
"What if we used extra space to store zero positions instead of modifying 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 set entire rows and columns to zero if any element in them is zero, modifying the matrix directly without extra space.Step 2: Differentiate from other tasks
Options B, C, and D describe different tasks like summing, counting, or sorting, which are not the goal here.Final Answer:
Modify the matrix so that if an element is 0, its entire row and column become 0 without using extra space. -> Option BQuick Check:
Goal = Modify matrix in place [OK]
- Thinking the problem is about counting zeroes
- Assuming extra space is allowed
- Confusing with sorting or summing tasks
Solution
Step 1: Check each initialization method
const matrix = Array(3).fill(Array(3).fill(0)); uses fill with the same inner array reference, causing all rows to point to the same array, which is incorrect.Step 2: Identify correct independent row creation
const matrix = Array.from({ length: 3 }, () => Array(3).fill(0)); uses Array.from with a function to create new arrays for each row, correctly initializing independent rows filled with zeros.Final Answer:
const matrix = Array.from({ length: 3 }, () => Array(3).fill(0)); -> Option CQuick Check:
Independent rows = const matrix = Array.from({ length: 3 }, () => Array(3).fill(0)); [OK]
- Using fill with array directly causing shared references
- Incorrect row lengths in nested arrays
- Using map on uninitialized arrays
function setZeroes(matrix) {
const rows = matrix.length;
const cols = matrix[0].length;
let firstRowZero = false;
let firstColZero = false;
for (let i = 0; i < rows; i++) {
if (matrix[i][0] === 0) firstColZero = true;
}
for (let j = 0; j < cols; j++) {
if (matrix[0][j] === 0) firstRowZero = true;
}
for (let i = 1; i < rows; i++) {
for (let j = 1; j < cols; j++) {
if (matrix[i][j] === 0) {
matrix[i][0] = 0;
matrix[0][j] = 0;
}
}
}
for (let i = 1; i < rows; i++) {
for (let j = 1; j < cols; j++) {
if (matrix[i][0] === 0 || matrix[0][j] === 0) {
matrix[i][j] = 0;
}
}
}
if (firstColZero) {
for (let i = 0; i < rows; i++) matrix[i][0] = 0;
}
if (firstRowZero) {
for (let j = 0; j < cols; j++) matrix[0][j] = 0;
}
}
let mat = [
[1,1,1],
[1,0,1],
[1,1,1]
];
setZeroes(mat);
console.log(mat);Solution
Step 1: Identify zero positions and mark rows and columns
The zero is at position (1,1). The first row and column do not have zero initially. The code marks matrix[1][0] and matrix[0][1] as zero.Step 2: Set zeroes based on marks and update first row/column if needed
Using marks, the code sets matrix[1][1], matrix[1][2], matrix[0][1], and matrix[2][1] to zero. Since firstRowZero and firstColZero are false, no changes to first row or column.Final Answer:
[[1,0,1],[0,0,0],[1,0,1]] -> Option DQuick Check:
Zero at (1,1) zeroes row 1 and column 1 [OK]
- Not handling first row and column separately
- Overwriting marks too early
- Missing zeroing of entire row or column
function setZeroes(matrix) {
const rows = matrix.length;
const cols = matrix[0].length;
for (let i = 0; i < rows; i++) {
for (let j = 0; j < cols; j++) {
if (matrix[i][j] === 0) {
for (let k = 0; k < cols; k++) matrix[i][k] = 0;
for (let k = 0; k < rows; k++) matrix[k][j] = 0;
}
}
}
}Solution
Step 1: Analyze the nested loops and zero setting
The code sets zeroes immediately when it finds a zero, modifying the matrix during iteration.Step 2: Understand the effect of modifying during iteration
Modifying the matrix while scanning causes new zeroes to appear, leading to extra rows and columns being zeroed incorrectly.Final Answer:
It modifies the matrix while iterating, causing incorrect zeroing. -> Option AQuick Check:
In-place modification during iteration causes errors [OK]
- Setting zeroes immediately instead of marking first
- Not separating scanning and updating phases
- Assuming immediate zeroing is safe
[ [0,1,2,0], [3,4,5,2], [1,3,1,5], [1,0,1,7] ]
After applying the in-place zeroing algorithm, what is the final matrix?
Solution
Step 1: Identify zero positions in the matrix
Zeroes are at positions (0,0), (0,3), and (3,1). These mark rows 0 and 3, and columns 0, 1, and 3 for zeroing.Step 2: Set entire rows and columns to zero based on marks
Rows 0 and 3 become all zero. Columns 0, 1, and 3 become zero in all rows. The resulting matrix is [[0,0,0,0],[0,0,5,0],[0,0,1,0],[0,0,0,0]].Final Answer:
[[0,0,0,0],[0,0,5,0],[0,0,1,0],[0,0,0,0]] -> Option AQuick Check:
Zero rows and columns set correctly [OK]
- Missing zeroing some columns or rows
- Overwriting matrix too early
- Not handling multiple zeroes correctly
Ready to prove it?
Pass the test and this pattern moves unknown
