給定一個m×n的矩陣,如果一個元素爲0,則將其所在行和列的所有的元素都設爲0,請使用原地算法。
示例 1:
輸入:
[
[1,1,1],
[1,0,1],
[1,1,1]
]
輸出:
[
[1,0,1],
[0,0,0],
[1,0,1]
]
示例 2:
輸入:
[
[0,1,2,0],
[3,4,5,2],
[1,3,1,5]
]
輸出:
[
[0,0,0,0],
[0,4,5,0],
[0,3,1,0]
]
進階:
- 一個直接的解決方案是使用 O(mn) 的額外空間,但這並不是一個好的解決方案。
- 一個簡單的改進方案是使用 O(m + n) 的額外空間,但這仍然不是最好的解決方案。
- 你能想出一個常數空間的解決方案嗎?
解題:這個題的要求是使用原地算法,即不使用額外的空間。
1.考慮利用原矩陣的首行首列存儲0元素所在的行和列的位置。即,如果(i,j)位置的元素爲0,那麼第i行和第j列都要置0,因此映射到首行首列的位置爲(0,j),(i,0)。
2.同時也要考慮到首行和首列是否存在0的情況,如果存在,經過1的操作,該0可能被覆蓋.。
3.設置兩個flag,判斷首行和首列本身是否存在0元素。如果存在設置爲True,然後決定首行和首列是否置零。(這一點要最先處理)
def setZeroes(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
# 設置兩個Flag,判斷首行首列是否存在0元素
row,col=False,False
for i in range(len(matrix)):
if matrix[i][0]==0:
row=True
for j in range(len(matrix[0])):
if matrix[0][j]==0:
col=True
# 將0元素映射到首行首列
for i in range(len(matrix)):
for j in range(len(matrix[0])):
if matrix[i][j]==0:
matrix[i][0]=0
matrix[0][j]=0
# 根據首行首列的0將除了首行首列外的對應行列的元素置零
for i in range(1,len(matrix)):
if matrix[i][0]==0:
for j in range(len(matrix[0])):
matrix[i][j]=0
for j in range(1,len(matrix[0])):
if matrix[0][j]==0:
for i in range(len(matrix)):
matrix[i][j]=0
# 根據Flag判斷是否將首行首列置零
if col:
for j in range(len(matrix[0])):
matrix[0][j]=0
if row:
for i in range(len(matrix)):
matrix[i][0]=0
print(matrix)