逻辑:对于每个必须插入零的位置,除了已经是 0 的位置之外,我们还放置一个“无”。这样我们就可以跟踪零值并就地更新矩阵。最后我们将所有 None 替换为零。 问题: 为什么我的代码无法从矩阵中的所有位置删除 None 。它只会从几个地方删除。
class Solution:
def setZeroes(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
for i in range(len(matrix)):
for j in range(len(matrix[0])):
if matrix[i][j] == 0:
for t in range(len(matrix[0])):
if matrix[i][t] != 0:
matrix[i][t] = None
for k in range(len(matrix)):
if matrix[k][j] != 0:
matrix[k][j] = None
for i in range(len(matrix)):
for j in range(len(matrix)):
if matrix[i][j] == None:
matrix[i][j] = 0
结果输出参见图片:
请帮忙,因为我很惊讶它不起作用。
比较第一组循环:
for i in range(len(matrix)):
for j in range(len(matrix[0])):
致第二个:
for i in range(len(matrix)):
for j in range(len(matrix)):
看到区别了吗?
Python 中的暴力破解:
def setZeros(matrix: List[List[int]]) -> None:
temp=[]
m=len(matrix)
n=len(matrix[0])
for i in range(m):
for j in range(n):
if matrix[i][j]==0:
temp.append([i,j])
for i,j in temp:
for a in range(n):
matrix[i][a]=0
for b in range(m):
matrix[b][j]=0
return matrix
#Time complexity:O(N^2) +O(N^3)
#space complexity:O(2*N)
Python 中的优化方法:
class Solution:
def setZeroes(self, matrix: List[List[int]]) -> None:
m=len(matrix)
n=len(matrix[0])
iszerorow=False
iszerocol=False
for i in range(n):# for first row
if matrix[0][i]==0:
iszerorow=True
for i in range(m):# for first column
if matrix[i][0]==0:
iszerocol=True
for i in range(1,m):
for j in range(1,n):
if matrix[i][j]==0:
matrix[0][j]=0# make first row zero
matrix[i][0]=0 # make first column zero
for i in range(1,m):
for j in range(1,n):
if matrix[i][0]==0 or matrix[0][j]==0:# now make zero on respective row and column
matrix[i][j]=0
if iszerorow==True:
for i in range(n): # make for first row
matrix[0][i]=0
if iszerocol==True:
for i in range(m):# make for first column
matrix[i][0]=0
#Time complexity:O(N)+O(m)+O(N^2)+O(N^2)+O(N)+O(M)=O(N^2)
#space complexity:O(1)