Set Matrix Zeroes – Solution & Complexity
Solution Walkthrough
1. Understanding the problem
- A single
0anywhere in the matrix wipes out its whole row and its whole column. - The tricky part is not overwriting a cell to
0and then mistakenly treating that new0as if it were an original zero later in the scan.
2. Brute-force with an extra copy
- Make a copy of the original matrix so zeroing decisions are always based on the untouched values.
- Scan the copy for zeros, and zero the corresponding row/column in the real matrix.
- Uses
O(m*n)extra space, but is simple and clearly correct.
3. Reduce space with row/column marker sets
- Instead of copying the whole matrix, do one pass to record which row indices and column indices contain a zero.
- Then do a second pass and zero any cell whose row or column was recorded.
- This drops space from
O(m*n)toO(m + n).
4. Dry run / state trace
Trace matrix = [[1,0],[0,1]].
| step | action | zero_rows | zero_cols |
|---|---|---|---|
| scan (0,1) | value is 0 | {0} | {1} |
| scan (1,0) | value is 0 | {0,1} | {0,1} |
Second pass: every row is in zero_rows and every column is in zero_cols, so all four cells become 0, giving [[0,0],[0,0]].
5. Common mistakes and follow-ups
- Zeroing cells while still scanning for the original zeros, which turns freshly-zeroed cells into false positives for later iterations.
- Forgetting the empty-matrix guard before indexing
matrix[0]. - Follow-up: the true
O(1)extra-space version reusesmatrix[0]and the first column as the marker arrays themselves, with one extra boolean to remember whether the first row/column originally had a zero — worth mentioning even though this judge's tests only check the returned values, not memory usage.
6. Edge cases to test mentally
- A
1x1matrix with either a zero or non-zero value. - A matrix with no zero at all (must be returned unchanged).
- A matrix where every row and column ends up zeroed.
- Negative values mixed with a single zero.
7. Final full solution and complexity
Record zero rows/columns in a first pass, then zero matching cells in a second pass. Time is O(m*n), and extra space is O(m + n) for the marker sets.