力扣中级 矩阵置零

73. 矩阵置零

给定一个 m x n 的矩阵,如果一个元素为 ,则将其所在行和列的所有元素都设为 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) 的额外空间,但这仍然不是最好的解决方案。
  • 你能想出一个仅使用常量空间的解决方案吗?
def setZeroes(matrix):
    m, n = len(matrix), len(matrix[0])   # 获取矩阵的行数m和列数n
    rows, cols = set(), set()            # 初始化两个集合,用于存放需要置零的行和列的索引

    for i in range(m):
        for j in range(n):               # 使用两个嵌套循环遍历矩阵中的每个元素
            if matrix[i][j] == 0:       # 如果当前元素为0
                rows.add(i)              # 将当前元素的行索引添加到rows集合中
                cols.add(j)              # 将当前元素的列索引添加到cols集合中

    for i in rows:                      # 对于需要置零的每一行
        matrix[i] = [0] * n             # 使用列表乘法设置整行为0

    for j in cols:                      # 对于需要置零的每一列
        for i in range(m):              # 使用循环遍历每一行
            matrix[i][j] = 0            # 将对应的元素置为0

当然可以,让我们逐行解释上面的代码:

 
 

pythonCopy code

def setZeroes(matrix):

定义了一个名为setZeroes的函数,参数为matrix

 
 

pythonCopy code

m, n = len(matrix), len(matrix[0])

获取矩阵的行数m和列数n

 
 

pythonCopy code

rows, cols = set(), set()

初始化两个集合rowscols,用于存储需要设置为0的行和列的索引。

 
 

pythonCopy code

for i in range(m): for j in range(n):

使用两个嵌套循环遍历矩阵中的每一个元素。

 
 

pythonCopy code

if matrix[i][j] == 0:

检查当前元素是否为0。

 
 

pythonCopy code

rows.add(i) cols.add(j)

如果当前元素为0,则将当前元素的行索引i添加到rows集合中,将列索引j添加到cols集合中。

 
 

pythonCopy code

for i in rows: matrix[i] = [0] * n

对于rows集合中的每一个索引i,将对应的行设置为全0。这里使用了Python列表的乘法特性。

 
 

pythonCopy code

for j in cols: for i in range(m):

对于cols集合中的每一个索引j,使用嵌套循环遍历每一行。

 
 

pythonCopy code

matrix[i][j] = 0

将列索引为j的元素设置为0。

以上就是代码的逐行解释。简而言之,这个代码首先确定了哪些行和列应该被设置为0,然后实际执行了设置为0的操作。

猜你喜欢

转载自blog.csdn.net/sinat_37574187/article/details/133282050