返回

问题详解:矩阵置零的优雅解法

后端

引言

矩阵置零是一个经典的面试题,要求在给定矩阵中,将包含 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]

优雅解法

要解决此问题,我们可以采用两种标志数组,分别标记要置零的行和列:

  1. 标记行和列 :使用两个布尔数组 rowZeroescolZeroes,长度分别为 m 和 n。遍历矩阵,遇到 0 时,将相应的 rowZeroes[i]colZeroes[j] 标记为 True

  2. 置零矩阵 :再次遍历矩阵,根据 rowZeroescolZeroes 中的标志,将包含 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),用于存储标志数组 rowZeroescolZeroes

总结

本文介绍了一种优雅高效的矩阵置零算法,通过标记要置零的行和列,只需遍历矩阵两次即可完成置零操作。这种算法的简洁性和易于实现使其成为解决此类问题的理想选择。