我的想法:拿两个集合保存二维数组的行列值
class Solution {
set<int> a;
set<int> b;
public:
void setZeroes(vector<vector<int>>& matrix) {
int m=matrix.size();
int n=matrix[0].size();
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(matrix[i][j]==0)
{a.insert(i);
b.insert(j);}
}
}
for(auto it=a.begin();it!=a.end();it++)
{
for(int j=0;j<n;j++)
matrix[*it][j]=0;
}
for(auto it=b.begin();it!=b.end();it++)
{
for(int i=0;i<m;i++)
matrix[i][*it]=0;
}
}
};
官方题解:
- 使用两个变量(r0 & c0),记录「首行 & 首列」是否该被置零
2.「非首行首列」的位置
将置零信息存储到原矩阵
根据置零信息,置零「非首行首列」的位置 - 使用 r0 & c0 ,置零「首行 & 首列」
空间复杂度o(1) 时间复杂度o(mn)
class Solution {
int row;
int col;
public:
void setZeroes(vector<vector<int>>& matrix) {
int m=matrix.size();
int n=matrix[0].size();
for(int i=0;i<n;i++)//第一行
{
if(matrix[0][i]==0) {row=1;break;}
}
for(int i=0;i<m;i++)//第一列
{
if(matrix[i][0]==0) {col=1;break;}
}
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 (col) {
for (int i = 0; i < m; i++) {
matrix[i][0] = 0;
}
}
if (row) {
for (int j = 0; j < n; j++) {
matrix[0][j] = 0;
}
}
}
};