LeetCode算法题73:矩阵置零解析

给定一个 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(mn) 的额外空间,但这并不是一个好的解决方案。
  • 一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。
  • 你能想出一个常数空间的解决方案吗?

这个题的整体思想是减少空间,改进方案是可以用两个一维数组记录行列信息,如果某行或者某列有0,则将数组对应位置置零,然后最后根据这两个一维数组对矩阵进行操作。如果要使用常数空间,那么可以用两个标识来记录第一行和第一列,然后使用第一行和第一列来记录对应行列的零信息,因为只要有0就行列都置零,所以有零时先将第一行和第一列的对应位置置零即可。
最后先根据第一行和第一列将整个矩阵除第一行和第一列之外的部分进行处理,然后根据两个标识来处理第一行和第一列。

C++源代码:

class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        if(matrix.empty() || matrix[0].empty()) return;
        int m = matrix.size(), n = matrix[0].size();
        bool row_flag=false, col_flag=false;
        for(int i=0;i<m;i++){
            if(matrix[i][0] == 0)
                row_flag = true;
        }
        for(int j=0;j<n;j++){
            if(matrix[0][j] == 0)
                col_flag = true;
        }
        for(int i=1;i<m;i++)
            for(int j=1;j<n;j++){
                if(matrix[i][j] == 0){
                    matrix[i][0] = 0;
                    matrix[0][j] = 0;
                }
            }
        for(int i=1;i<m;i++)
            for(int j=1;j<n;j++){
                if(matrix[i][0]==0 || matrix[0][j]==0)
                    matrix[i][j] = 0;
            }
        if(row_flag)
            for(int i=0;i<m;i++)
                matrix[i][0] = 0;
        if(col_flag)
            for(int j=0;j<n;j++)
                matrix[0][j] = 0;
    }
};

python3源代码:

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

你可能感兴趣的:(Leetcode算法题分析)