73. 矩阵置零 

LeetCode 73. 矩阵置零(两个标记变量)_算法

 

我们可以用矩阵的第一行和第一列作为两个标记数组,以达到 O(1)O(1) 的额外空间。

但这样会导致原数组的第一行和第一列被修改,无法记录它们是否原本包含 0。因此我们需要额外使用两个标记变量分别记录第一行和第一列是否原本包含 0。

在实际代码中,我们首先预处理出两个标记变量,接着使用其他行与列去处理第一行与第一列,

然后反过来使用第一行与第一列去更新其他行与列,最后使用两个标记变量更新第一行与第一列即可。

class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
int m=matrix.size();//行数
int n=matrix[0].size();//列数

bool flag_col0=false,flag_row0=false;//标记变量记录第一行、第一列是否有0
//如果第1列有0,置标记变量为true
for(int i=0;i<m;i++)
{
    if(!matrix[i][0])
    {
        flag_col0=true;
    }
}
//如果第一行有0,置标记变量为true
for(int j=0;j<n;j++)
{
    if(!matrix[0][j])
    {
        flag_row0=true;
    }
}
//扫描一遍矩阵
for(int i=1;i<m;i++)
{
    for(int j=1;j<n;j++)
    {
//如果扫描到0,则对应行标记和列标记置0
        if(!matrix[i][j])
        {
            matrix[i][0]=matrix[0][j]=0;
        }
    }
}
//第二次扫描矩阵
for(int i=1;i<m;i++)
{
    for(int j=1;j<n;j++)
    {
//如果当前元素[i][j],对应行标记为0或者列标记为0,该元素置0
        if(!matrix[i][0]||!matrix[0][j])
        {
            matrix[i][j]=0;
        }
    }
}
//如果falg_col0为true,说明第一列要置0
if(flag_col0)
{
    for(int i=0;i<m;i++)
    {
        matrix[i][0]=0;
    }
}
//如果falg_row0为true,说明第一行要置0
if(flag_row0)
{
    for(int j=0;j<n;j++)
    {
        matrix[0][j]=0;
    }
}

    }
};
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.