給定 m x n 矩陣,若某元素為 0,則將其所在行和列全部置 0。要求原地修改,常數額外空間。
範例:
輸入: [[1,0,1,1],[1,1,0,1],[1,1,1,0],[1,1,1,1]]
輸出: [[0,0,0,0],[0,0,0,0],[0,0,0,0],[1,0,0,0]]
一邊遍歷一邊置零會干擾後續判斷,需先記錄哪些行列要置零。為達 O(1) 空間:
matrix[0][j] 標記第 j 列是否置零,matrix[i][0] 標記第 i 行first_row、first_col 記錄i>=1, j>=1),置標記時間複雜度:O(mn),空間複雜度:O(1)。
class Solution:
def setZeroes(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: void Do not return anything, modify matrix in-place instead.
"""
if not matrix or not matrix[0]:
return
m, n = len(matrix), len(matrix[0])
first_row = any(matrix[0][j] == 0 for j in range(n))
first_col = any(matrix[i][0] == 0 for i in range(m))
# 掃描內部元素,標記首行首列
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):
for j in range(1, n):
if matrix[i][0] == 0 or matrix[0][j] == 0:
matrix[i][j] = 0
# 處理首行首列
if first_row:
for j in range(n):
matrix[0][j] = 0
if first_col:
for i in range(m):
matrix[i][0] = 0
# 測試
if __name__ == "__main__":
sol = Solution()
matrix = [[1,0,1,1],[1,1,0,1],[1,1,1,0],[1,1,1,1]]
sol.setZeroes(matrix)
assert matrix == [[0,0,0,0],[0,0,0,0],[0,0,0,0],[1,0,0,0]]
print("測試通過")
這道題是「矩陣原地修改 + 常數空間」的經典範例,掌握「借用邊界作標記」技巧,可解決類似「矩陣標記/轉置/旋轉」問題。