# **Leetcode筆記(Set Matrix Zeroes)**
:::info
:information_source: 題目 : Set Matrix Zeroes, 類型 : matrix , 等級 : medium
日期 : 2023/02/28,2023/08/12,2024/05/21,2024/10/09
:::
### 嘗試
時間複雜度O(nm),空間複雜度O(1)
```python
class Solution:
def setZeroes(self, matrix: List[List[int]]) -> None:
row, col = len(matrix), len(matrix[0])
RowList = []
ColList = []
for i in range(row):
for j in range(col):
if matrix[i][j] == 0:
RowList.append(i)
ColList.append(j)
for j in range(col):
for i in range(len(RowList)):
RowNum = RowList[i]
matrix[RowNum][j] = 0
for i in range(row):
for j in range(len(ColList)):
ColNum = ColList[j]
matrix[i][ColNum] = 0
```
2023/08/12
用兩個變數去紀錄第一行與第一列有無0,看完後,就用第一行與第一列去記錄剩下的區塊,(如果剩下的區塊有0,那就把0往上放與往右放),後面用這個原理,去更新剩餘區塊,最後再來更新第一行與第一列
```python
class Solution:
def setZeroes(self, matrix: List[List[int]]) -> None:
m, n = len(matrix), len(matrix[0])
FirstRow, FirstCol = False, False
# 第一行和第一列
for i in range(m):
if matrix[i][0] == 0:
FirstCol = True
for j in range(n):
if matrix[0][j] == 0:
FirstRow = True
# 剩餘區塊
for i in range(1, m):
for j in range(1, n):
if matrix[i][j] == 0:
matrix[i][0] = 0
matrix[0][j] = 0
# 剩餘區塊 橫向看
for i in range(1, m):
if matrix[i][0] == 0:
for j in range(1, n):
matrix[i][j] = 0
# 剩餘區塊 直向看
for j in range(1, n):
if matrix[0][j] == 0:
for i in range(1, m):
matrix[i][j] = 0
# 第一行和第一列
if FirstCol:
for i in range(m):
matrix[i][0] = 0
if FirstRow:
for j in range(n):
matrix[0][j] = 0
```
2023/12/10
```python
class Solution(object):
def setZeroes(self, matrix):
first_row, first_col = False, False
n, m = len(matrix), len(matrix[0])
# first col & row
for i in range(n):
if matrix[i][0] == 0:
first_col = True
break
for j in range(m):
if matrix[0][j] == 0:
first_row = True
break
# rest
for i in range(1, n):
for j in range(1, m):
if matrix[i][j] == 0:
matrix[i][0] = 0
matrix[0][j] = 0
# set rest
for i in range(1, n):
if matrix[i][0] == 0:
for j in range(1, m):
matrix[i][j] = 0
for j in range(1, m):
if matrix[0][j] == 0:
for i in range(1, n):
matrix[i][j] = 0
# set first
if first_col:
for i in range(n):
matrix[i][0] = 0
if first_row:
for j in range(m):
matrix[0][j] = 0
return matrix
```
2024/05/21
```python
class Solution:
def setZeroes(self, matrix: List[List[int]]) -> None:
firstCol, firstRow = False, False
m, n = len(matrix), len(matrix[0])
for i in range(m):
if matrix[i][0] == 0:
firstCol = True
for j in range(n):
if matrix[0][j] == 0:
firstRow = True
for i in range(1, m):
for j in range(1, n):
if matrix[i][j] == 0:
matrix[i][0] = 0
matrix[0][j] = 0
# start set up
for i in range(1, m):
if matrix[i][0] == 0:
for j in range(1, n):
matrix[i][j] = 0
for j in range(1, n):
if matrix[0][j] == 0:
for i in range(1, m):
matrix[i][j] = 0
if firstCol:
for i in range(m):
matrix[i][0] = 0
if firstRow:
for j in range(n):
matrix[0][j] = 0
```
2024/10/09
```python
class Solution:
def setZeroes(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
firstR, firstC = False, False
n, m = len(matrix), len(matrix[0])
for r in range(n):
if matrix[r][0] == 0:
firstC = True
break
for c in range(m):
if matrix[0][c] == 0:
firstR = True
break
# use first row & col as indicator
for r in range(1, n):
for c in range(1, m):
if matrix[r][c] == 0:
matrix[r][0] = 0
matrix[0][c] = 0
for r in range(1, n):
if matrix[r][0] == 0:
for c in range(m):
matrix[r][c] = 0
for c in range(1, m):
if matrix[0][c] == 0:
for r in range(n):
matrix[r][c] = 0
if firstR:
for c in range(m):
matrix[0][c] = 0
if firstC:
for r in range(n):
matrix[r][0] = 0
```
---
### **優化**
是用flag的方式
```python
class Solution:
def setZeroes(self, matrix: List[List[int]]) -> None:
rows, cols = len(matrix), len(matrix[0])
# 用到o(1)記憶體 用最後一排當緩衝
zero_row, zero_col = False, False
for i in range(rows):
for j in range(cols):
if matrix[i][j] == 0:
# 第一列
if i == 0:
zero_row = True
# 第一行
if j == 0:
zero_col = True
# 把最上面第一行第一列當成標記
matrix[i][0] = matrix[0][j] = 0
# 剩餘橫列
for i in range(1, rows):
if matrix[i][0] == 0:
for j in range(1, cols):
matrix[i][j] = 0
# 剩餘直行
for j in range(1, cols):
if matrix[0][j] == 0:
for i in range(1, rows):
matrix[i][j] = 0
# 第一列
if zero_row:
for j in range(cols):
matrix[0][j] = 0
# 第一列
if zero_col:
for i in range(rows):
matrix[i][0] = 0
return matrix
```
---
**:warning: 錯誤語法**
:::warning
range()要記得括號
:::
**:thumbsup:學習**
:::success
若有一矩陣,len(matrix)為row,len(matrix[0])
:::
**思路**
**講解連結**
https://www.youtube.com/watch?v=FPdM2C16Qew&ab_channel=Michelle%E5%B0%8F%E6%A2%A6%E6%83%B3%E5%AE%B6
Provided by. Michelle小梦想家
###### tags: `matrix` `medium` `leetcode`