Leetcode 73:矩阵置零(最详细的解法!!!)

版权声明:本文为博主原创文章,未经博主允许不得转载。有事联系:[email protected] https://blog.csdn.net/qq_17550379/article/details/83303794

给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法**。**

示例 1:

输入: 
[
  [1,1,1],
  [1,0,1],
  [1,1,1]
]
输出: 
[
  [1,0,1],
  [0,0,0],
  [1,0,1]
]

示例 2:

输入: 
[
  [0,1,2,0],
  [3,4,5,2],
  [1,3,1,5]
]
输出: 
[
  [0,0,0,0],
  [0,4,5,0],
  [0,3,1,0]
]

进阶:

  • 一个直接的解决方案是使用 O(m**n) 的额外空间,但这并不是一个好的解决方案。
  • 一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。
  • 你能想出一个常数空间的解决方案吗?

解题思路

一个最简答的思路就是通过遍历矩阵的每一个元素,判断这个元素是不是0,如果是的话那么将对应的行和列的元素置为零,但是这种有一个陷阱,因为一旦置为零,那么我们对于没有遍历到的元素就会存在这样的风险:原先不是0,但是因为之前有数将其置为0了,我们遍历到这个原本是非0数的时候就不要将其行和列置为零了。为例解决这个问题,我们需要重新开辟一个矩阵大小的空间用来存储最后的0

class Solution:
    def setZeroes(self, matrix):
        """
        :type matrix: List[List[int]]
        :rtype: void Do not return anything, modify matrix in-place instead.
        """
        if not matrix:
            return
        r, c = len(matrix), len(matrix[0])
        mat = [[0]*c for _ in range(r)]
        for i in range(r):
            for j in range(c):
                mat[i][j] = matrix[i][j]

        for i in range(r):
            for j in range(c):
                if mat[i][j] == 0:
                    for m in range(r):
                        matrix[m][j] = 0
                    for n in range(c):
                        matrix[i][n] = 0

有没有更好的做法呢?就像进阶中提到的,我们是不是有空间复杂度更小的做法。我们可以这样考虑,例如

0 |1  1  2
3 |1  5  2
0 |3  0  5

对于第一列元素我们单独考虑。当我们碰到0,也就是2,2这个点,所以我们将之前的同一行同一列的第一行和第一列置为0

0  1  0  2
3  1  5  2
0  3  0  5

接着我们根据第一行和第一列的0和非0将矩阵的(除了第一行第一列)行和列全置为0

0  1  0  2
  |-------
3 |1  0  2
0 |0  0  0

我们接着要考虑第一行和第一列的问题,如果0,0对应元素是0,我们将第一行置为0

0  0  0  0
3  1  0  2
0  0  0  0

接着我们考虑第一列的问题,什么时候该考虑它呢?如果在上述操作之前第一列存在0的话,我们将第一列全置为0

0  0  0  0
0  1  0  2
0  0  0  0

我们通过这个算法,就可以使用O(1)的空间复杂度解决这个问题。

class Solution:
    def setZeroes(self, matrix):
        """
        :type matrix: List[List[int]]
        :rtype: void Do not return anything, modify matrix in-place instead.
        """
        if not matrix:
            return
        r, c, flag = len(matrix), len(matrix[0]), False
        for i in range(r):
            if matrix[i][0] == 0:
                flag = True
            for j in range(1, c):
                if matrix[i][j] == 0:
                    matrix[0][j] = 0
                    matrix[i][0] = 0

        for i in range(1, r):
            for j in range(1, c):
                if not matrix[i][0] or not matrix[0][j]:
                    matrix[i][j] = 0

        if matrix[0][0] == 0:
            for j in range(c):
                matrix[0][j] = 0

        if flag:
            for i in range(r):
                matrix[i][0] = 0

reference:
https://leetcode.com/problems/set-matrix-zeroes/solution/

我将该问题的其他语言版本添加到了我的GitHub Leetcode

如有问题,希望大家指出!!!

猜你喜欢

转载自blog.csdn.net/qq_17550379/article/details/83303794