题目描述
给定一个mxn矩阵,如果矩阵中有元素0,则将其所在的行和列都置为0。请使用原地算法。原题链接
例如:输入:[
[1,1,1],
[1,0,1],
[1,1,1]
]
输出:[
[1,0,1],
[0,0,0],
[1,0,1]
]
思路
方案一
设置两个长度分别为m和n的标记数组分别记录行和列是否有0,根据标记数组将某些矩阵元素置0。
class Solution:
def setZeroes(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: void Do not return anything, modify matrix in-place instead.
"""
m = len(matrix)
if m == 0:
return
n = len(matrix[0])
if n == 0:
return
row = [False] * m
col = [False] * n
for i in range(m):
for j in range(n):
if matrix[i][j] == 0:
row[i] = True
col[j] = True
for i in range(m):
if row[i]:
for j in range(n):
matrix[i][j] = 0
for j in range(n):
if col[j]:
for i in range(m):
matrix[i][j] = 0
return
方案二
首先记录第1行和第1列是否需要置0,这里需要两个常数空间来标记,然后用第1行和第1列作为标记数组的空间,来对除第1行和第1列之外的行和列进行记录。最后根据记录将某些矩阵元素置0。
class Solution(object):
def setZeroes(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: void Do not return anything, modify matrix in-place instead.
"""
m = len(matrix)
if m == 0:
return matrix
n = len(matrix[0])
if n == 0:
return matrix
flag_row = False
flag_column = False
#记录第1行和第1列是否置0
for i in range(n):
if matrix[0][i] == 0:
flag_row = True
break
for j in range(m):
if matrix[j][0] == 0:
flag_column = True
break
#用第1行和第1列记录其他行和列是否置0
for i in range(1, m):
for j in range(1, n):
if matrix[i][j] == 0:
matrix[0][j] = 0
matrix[i][0] = 0
#改变其他行和列的值
for i in range(1, m):
for j in range(1, n):
if matrix[0][j] == 0 or matrix[i][0] == 0:
matrix[i][j] = 0
#改变第一行和第一列的值
if flag_row:
for j in range(n):
matrix[0][j] = 0
if flag_column:
for i in range(m):
matrix[i][0] = 0