返回
问题详解:矩阵置零的优雅解法
后端
2023-09-10 22:51:26
引言
矩阵置零是一个经典的面试题,要求在给定矩阵中,将包含 0 的元素所在的整行和整列全部置为 0。本文将深入探讨这一问题的巧妙解法,并通过详尽的示例和代码实现来加以说明。
矩阵,置零,遍历,标记,算法
给定一个 m x n 的矩阵,我们希望将包含 0 的元素所在的整行和整列全部置为 0。例如,对于矩阵:
[1, 2, 0]
[3, 0, 1]
[1, 1, 1]
置零后应变为:
[0, 0, 0]
[0, 0, 0]
[1, 1, 1]
优雅解法
要解决此问题,我们可以采用两种标志数组,分别标记要置零的行和列:
-
标记行和列 :使用两个布尔数组
rowZeroes
和colZeroes
,长度分别为 m 和 n。遍历矩阵,遇到 0 时,将相应的rowZeroes[i]
和colZeroes[j]
标记为True
。 -
置零矩阵 :再次遍历矩阵,根据
rowZeroes
和colZeroes
中的标志,将包含 0 的元素所在的整行和整列全部置为 0。
代码实现
def set_zeroes(matrix):
"""
置零给定矩阵中包含 0 的元素所在的整行和整列。
Args:
matrix (list[list[int]]): 输入矩阵。
Returns:
None: 对矩阵进行就地修改。
"""
m = len(matrix)
n = len(matrix[0])
# 标记要置零的行和列
row_zeroes = [False for _ in range(m)]
col_zeroes = [False for _ in range(n)]
for i in range(m):
for j in range(n):
if matrix[i][j] == 0:
row_zeroes[i] = True
col_zeroes[j] = True
# 置零矩阵
for i in range(m):
for j in range(n):
if row_zeroes[i] or col_zeroes[j]:
matrix[i][j] = 0
复杂度分析
- 时间复杂度:O(mn),其中 m 和 n 分别为矩阵的行数和列数。
- 空间复杂度:O(m + n),用于存储标志数组
rowZeroes
和colZeroes
。
总结
本文介绍了一种优雅高效的矩阵置零算法,通过标记要置零的行和列,只需遍历矩阵两次即可完成置零操作。这种算法的简洁性和易于实现使其成为解决此类问题的理想选择。