时间:2020-6-17
题目地址:https://leetcode-cn.com/problems/zero-matrix-lcci/
题目难度:Medium
题目描述:
编写一种算法,若M × N矩阵中某个元素为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]
]
思路1:使用两个列表保存需要置零的行和列
代码段1:通过
class Solution:
def setZeroes(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
row, col = [], []
m, n = len(matrix), len(matrix[0])
for i in range(m):
for j in range(n):
if(matrix[i][j] == 0):
row.append(i)
col.append(j)
print(row, col)
row, col = list(set(row)), list(set(col))
print(row, col)
for i in row:
for j in range(n):
matrix[i][j] = 0
for i in col:
for j in range(m):
matrix[j][i] = 0
总结:
- set()去重在这个时候还是挺好使的
思路2:
使用第一行,第一列存储需要清零的列和行,
根据第一行和第一列进行清零,
注意 第一行和第一列的数据特殊处理 matrix[0][0] 既表示第一行又表示第一列,需要特殊处理
代码段2:通过
class Solution:
def setZeroes(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
m, n = len(matrix), len(matrix[0])
row, col = False, False
for i in range(m):
for j in range(n):
if(matrix[i][j] == 0):
if(i == 0):
row = True
if(j == 0):
col = True
matrix[i][0] = 0
matrix[0][j] = 0
for i in range(1, m):
if(matrix[i][0] == 0):
for j in range(n):
matrix[i][j] = 0
for i in range(1, n):
if(matrix[0][i] == 0):
for j in range(m):
matrix[j][i] = 0
if(row):
for i in range(n):
matrix[0][i] = 0
if(col):
for i in range(m):
matrix[i][0] = 0
总结:
- 这思路绝了