暴力解法
思路
- 先记录为零的行列,以防置零后有误
- 选择四个方向,循环为零的行和列,设置另外的值为1,判断循环零前后左右的条件,循环行时行不得超过r,列时不得超过c
复杂度
- 时间都为O(r*c)
- 空间O(r+c)
代码
class Solution(object):
def setZeroes(self,matrix):
r,c=len(matrix),len(matrix[0])
arr=[[1,0],[0,1],[-1,0],[0,-1]]
arr1=[]
arr2=[]
for i in range(len(matrix)):
for j in range(len(matrix[0])):
if matrix[i][j]==0:
arr1.append(i)
arr2.append(j)
for k in range(len(arr1)):
for l in range(4):
if l%2==0:
e=1
while 0 <= arr1[k]+e*arr[l][0] < r and 0 <= arr2[k]+e*arr[l][1] <= c :
a=arr1[k]+e*arr[l][0]
b=arr2[k]
matrix[a][b]=0
e+=1
else:
e=1
while 0 <= arr1[k]+e*arr[l][0] <= r and 0 <= arr2[k]+e*arr[l][1] < c :
b=arr2[k]+e*arr[l][1]
a=arr1[k]
matrix[a][b]=0
e+=1
return matrix
官方解法
思路
- 将为零的行列都在row和col中标记出来
- 将行或列中有零的那一行或者那一列置零
- 巧在设置row和col对应的False列表
复杂度
同上
代码
class Solution(object):
def setZeroes(self,matrix):
r,c=len(matrix),len(matrix[0])
row,col=[False]*r,[False]*c
for i in range(r):
for j in range(c):
if matrix[i][j]==0:
row[i]=True
col[j]=True
for i in range(r):
for j in range(c):
if row[i] or col[j]:
matrix[i][j]=0
return matrix