题意:
Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.
Did you use extra space?
A straight forward solution using O(mn) space is probably a bad idea.
A simple improvement uses O(m + n) space, but still not the best solution.
Could you devise a constant space solution?
其实就是给了一个M*N规模的矩阵,如果某个元素为0,那么所在行和所在列的所有元素都换成0
难度:Medium
解题思路:
首先想到的是空间复杂度为O(m+n)的做法,即开一个一维数组作为标记,规模为m+n,初始状态全为1。如果原矩阵第i行j列为0,那么标记数组中的第i个元素和第i+j-1个元素置为0,也就是说标记数组的前m个用来表示每行是否有0元素,后n个元素用来表示每列是否有0元素。再遍历一次原矩阵的每行,如果标记数组第i个元素为0,该行全部改成0。 同样对每列进行一次遍历,如果标记数组的第i+j-1个元素为0,原矩阵的第j列也全部换成0.
但是题目提示了应该用O(1)空间复杂度的做法,那么可以想到把标记值放在原来的矩阵中。 我的做法是把每行第一个元素,每列最后一个元素作为标记位点,遍历一遍原矩阵,如果第i行第j列的元素为0,则matrix[i][0]置0,matrix[最后一行坐标][j]也置0. 但是考虑到一点,如果第一列中没有0,如果这样做的话,就会导致第一列最后全部变成0了,所以我先要遍历一次第一行,如果有0,就用一个bool变量book标记,同理最后一行也是如此,用一个标记变量book2来标记原矩阵中是否最后一行中有0. 遍历原矩阵的时候,暂时不遍历最后一行,当处理完行和列(第一列用book处理)以后,再利用book2来处理最后一行。
这么做的时间复杂度为O(m*n),空间复杂度为O(1)
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
if(matrix.size()==0)
return;
bool book=false;
bool book2=false;
if(matrix.size()==1)
{
for(int i = 0 ;i<matrix[0].size();i++)
{
if(matrix[0][i]==0)
{
for(int j = 0;j<matrix[0].size();j++)
{
matrix[0][j]=0;
}
return ;
}
}
}
for(int i = 0;i<matrix.size();i++)
{
if(matrix[i][0]==0)
book=true;
}
for(int j = 0;j<matrix[0].size();j++)
{
if(matrix[matrix.size()-1][j]==0)
{
book2=true;
}
}
for(int i = 0 ; i<matrix.size()-1;i++)
{
for(int j = 0; j<matrix[0].size();j++)
{
if(matrix[i][j]==0)
{
matrix[i][0]=0;
if(j!=0)
matrix[matrix.size()-1][j]=0;
else if(book)
matrix[matrix.size()-1][j]=0;
}
}
}
for(int i = 0; i<matrix.size()-1;i++)
{
if(matrix[i][0]==0)
{
for(int j = 0; j<matrix[0].size();j++)
{
matrix[i][j]=0;
}
}
}
for(int j=1;j<matrix[0].size();j++)
{
if(matrix[matrix.size()-1][j]==0)
{
for( int i = 0; i<matrix.size();i++)
{
matrix[i][j]=0;
}
}
}
if(book)
{
for(int j=0;j<matrix.size();j++)
{
matrix[j][0]=0;
}
}
if(book2)
{
for(int j=0;j<matrix[0].size();j++)
{
matrix[matrix.size()-1][j]=0;
}
}
}
};