# Tree - Set Matrix Zeroes

All diagrams presented herein are original creations, meticulously designed to enhance comprehension and recall. Crafting these aids required considerable effort, and I kindly request attribution if this content is reused elsewhere.

Difficulty: Easy

Use

existing row/colfor tracking

## Problem

Given an `m x n`

integer matrix `matrix`

, if an element is `0`

, set its entire row and column to `0`

’s.

You must do it in place.

**Example 1:**

1
2

Input: matrix = [[1,1,1],[1,0,1],[1,1,1]]
Output: [[1,0,1],[0,0,0],[1,0,1]]

**Example 2:**

1
2

Input: matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
Output: [[0,0,0,0],[0,4,5,0],[0,3,1,0]]

## Solution

The only added complexity comes from the requirement that this needs to be done **in place** without using any additional memory. We can use the first row and col as temporary storage space and loop through `m x n`

matrix. Here are the high level steps:

- In order to achieve TC:
**O(m x n)**and SC:**O(1)**use the first row and column to track which column and row needs to be set to zero. - Need an extra space for the first element of either row or column since the (0,0) index has the overlapping element.
- Otherwise, this problem can easily be solved

Start by defining the required variables. Since the space `[0,0]`

will be needed by both row and col, we will create a new variable named `row_zero`

just to keep track of `row 0`

and use `matrix[0][0]`

for the col. (Please refer the pic above)

1
2

ROWS, COLS = len(matrix), len(matrix[0])
row_zero = False

Now the first step is to go through all the rows and cols and set the first row/col to zero accordingly. If the current cell is `0`

then set the corresponding first col to `0`

. In case of row, verify if its the first row, in case it is, set the `row_zero`

to `True`

. Otherwise set the corresponding first row to `0`

.

1
2
3
4
5
6
7
8

for r in range(ROWS):
for c in range(COLS):
if matrix[r][c]==0:
matrix[r][0]=0
if r==0:
row_zero=True
else:
matrix[0][c]=0

Let’s visualize an example before moving forward. Leftmost grid is the input `matrix`

. The double loop we just now executed is depicted in the 2nd grid below.

We know which of the rows and cols to set as zeros. We shouldn’t change the first row and col as that will make the entire matrix zero. So lets update everything else. (Highlighted in red in the 3rd grid)

1
2
3
4

for r in range(1,ROWS):
for c in range(1,COLS):
if matrix[0][c]==0 and matrix[r][0]==0:
matrix[r][c]=0

Now, set zones in the first col if needed. (Fig - 4th grid, highlighted in red)

1
2
3

if matrix[0][0] ==0:
for r in range(ROWS):
matrxi[r][0]=0

Same for the row, however use the `row_zero`

flag instead. (Fig - 4th grid, highlighted in blue)

1
2
3

if row_zero:
for c in range(COLS):
matrxi[0][c]=0

## Final Code

Here is the full code.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

def set_zeroes(matrix):
ROWS, COLS = len(matrix), len(matrix[0])
row_zero = False
for r in range(ROWS):
for c in range(COLS):
if matrix[r][c] == 0:
matrix[0][c] = 0
if r == 0:
row_zero = True
else:
matrix[r][0] = 0
for r in range(1, ROWS):
for c in range(1, COLS):
if matrix[0][c] == 0 or matrix[r][0] == 0:
matrix[r][c] = 0
if matrix[0][0] == 0:
for r in range(ROWS):
matrix[r][0] = 0
if row_zero:
for c in range(COLS):
matrix[0][c] = 0