python每日一题——18矩阵置零

题目

给定一个 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]]

答案

这个问题可以使用原地算法在一行一行地遍历矩阵的同时解决。当我们发现一个元素为0时,我们需要将这个元素所在行和列的所有元素都设为0。为了防止在遍历过程中越界,我们需要记录行和列的起始和结束位置。

具体来说,我们可以从第一行开始,从左到右遍历每一列。在遍历过程中,如果我们发现一个元素为0,则将该元素所在行和列的所有元素都设为0。为了不越界,我们需要确保每次只修改当前遍历到的元素以及它右边和下边的元素。

当我们处理完第一行后,我们可以将行和列的起始位置向右移动一位,然后从第二行开始重复上述过程,直到处理完所有行。

以下是实现这个算法的Python代码:

def setZeroes(matrix):
    if not matrix:
        return []
    m = len(matrix)
    n = len(matrix[0])
    first_row = True
    first_col = True
    for i in range(m):
        for j in range(n):
            if matrix[i][j] == 0:
                matrix[i][j] = 0
                if first_row:
                    first_row = False
                    for k in range(m):
                        matrix[k][j] = 0
                if first_col:
                    first_col = False
                    for k in range(n):
                        matrix[i][k] = 0
    return matrix

代码注释:

  • 首先检查输入矩阵是否为空,如果为空则返回空列表。
  • 初始化行和列的起始位置为第一行和第一列。
  • 遍历每一行和每一列,如果发现一个元素为0,则将该元素设为0。
  • 如果当前处理的是第一行或第一列,则需要将该行或该列的所有元素都设为0。
  • 最后返回处理后的矩阵。

你可能感兴趣的:(算法练习,python,矩阵,算法,leetcode)