题目:
给定一个 m x n
的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。
示例 1:
输入:matrix = [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]]
示例 2:
输入:matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]] 输出:[[0,0,0,0],[0,4,5,0],[0,3,1,0]]
提示:
m == matrix.length
n == matrix[0].length
1 <= m, n <= 200
-231 <= matrix[i][j] <= 231 - 1
进阶:
- 一个直观的解决方案是使用
O(mn)
的额外空间,但这并不是一个好的解决方案。 - 一个简单的改进方案是使用
O(m + n)
的额外空间,但这仍然不是最好的解决方案。 - 你能想出一个仅使用常量空间的解决方案吗?
解题思路:
用两个数组l1和l2分别存放0元素的横坐标和纵坐标,后面再用for循环分别将横坐标和纵坐标进行零化(所对应的纵坐标和横坐标的元素全部变成零)
代码:
matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
l1 = [] #用来存放0元素的横坐标
l2 = [] #用来存放0元素的纵坐标
for i in range(len(matrix)):
for j in range(len(matrix[0])):
if matrix[i][j] == 0:
l1.append(i)
l2.append(j)
for i in set(l1): #将还有零的行给零化
matrix[i] = [0 for j in range(len(matrix[0]))]
for i in set(l2):
for j in range(len(matrix)):
matrix[j][i] = 0
print(matrix)
通过截图:
第一次的时间和空间都没有优势
第二种方法:
解题思路:
将行与列分别用两个数组row和col存放False,用for循环遍历数组,如果行或者列上元素等于零的话,将False编程True,再用for循环遍历整个数组,行或者列上为真的话,将元素编程0.
代码:
matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
m, n = len(matrix), len(matrix[0])
row, col = [False] * m, [False] * n
for i in range(m):
for j in range(n):
if matrix[i][j] == 0:
row[i] = col[j] = True
for i in range(m):
for j in range(n):
if row[i] or col[j]:
matrix[i][j] = 0
提交截图: