Leetcode Hot 1001 分钟

矩阵置零

本文讲解 LeetCode 73. 矩阵置零,提供一种基于集合标记的 O(mn) 时间、O(m+n) 空间解法,代码简洁易懂。

矩阵置零 封面图

阅读要点

  • 使用两个集合分别记录需要置零的行和列
  • 第一次遍历矩阵,遇到零则记录行列索引
  • 第二次遍历矩阵,根据集合将对应元素置零
  • 时间复杂度 O(mn),空间复杂度 O(m+n)

题目

73. 矩阵置零 - 力扣(LeetCode)

解法一:集合标记法

最直观的思路是使用两个集合分别记录需要置零的行和列。首先遍历整个矩阵,遇到零元素时,将其行号和列号分别加入集合;然后再次遍历矩阵,对于每个元素,如果其行号或列号在集合中,则将其置零。

答案

class Solution:
    def setZeroes(self, matrix: List[List[int]]) -> None:
        """
        Do not return anything, modify matrix in-place instead.
        """
        row = set()
        col = set()
        h = len(matrix)
        w = len(matrix[0])
        for i in range(h):
            for j in range(w):
                if matrix[i][j] == 0:
                    row.add(i)
                    col.add(j)
        for i in range(h):
            for j in range(w):
                if i in row or j in col:
                    matrix[i][j] = 0

该方法时间复杂度 O(mn),空间复杂度 O(m+n)。其他更优的解法(如常数空间)可参考官方题解,此处不再赘述。