一 O(mn)的额外空间,定义数组存放为0的位置
void setZeroes(std::vector<std::vector<int>>& matrix) {
std::vector<int> m1;
std::vector<int> m2;
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){
m1.push_back(i);
m2.push_back(j);
}
}
}
for(int k=0;k<m1.size();k++){
int i=m1[k];
int j=m2[k];
for(int k=0;k<n;k++){
matrix[i][k]=0;
}
for(int k=0;k<m;k++){
matrix[k][j]=0;
}
}
}
二 O(m+n)额外空间
我们可以m+n为m行和n列之和,而我们只需要标记一行或一列是否应该为0即可,所以可以创建数组 存放一行或一列是否置0
void setZeroes(std::vector<std::vector<int>>& matrix) {
int m=matrix.size();
int n=matrix[0].size();
std::vector<int> m1(m+n);
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(matrix[i][j]==0){
m1[m+j]=1;
m1[i]=1;
}
}
}
for(int i=0;i<m;i++){
if(m1[i]==1) {
for (int k = 0; k < n; k++) {
matrix[i][k] = 0;
}
}
}
for(int i=m;i<m+n;i++){
if(m1[i]==1) {
for (int k = 0; k < m; k++) {
matrix[k][i-m] = 0;
}
}
}
}
三 O(1)
使用第一行和第一列的表示当前行和当前列是否为0,
如果第一行的第i个元素为0 将第i列置0 在置0时先不改变第一列第一行的元素,最后该变第一行第一列的元素 第一行和第一列是否置0在最开始时就需要标记
void setZeroes(std::vector<std::vector<int>>& matrix) {
int m=matrix.size();
int n=matrix[0].size();
bool row= false;
bool col=false;
for(int i=0;i<m;i++){
if(matrix[i][0]==0) {
col = true;
break;
}
}
for(int i=0;i<n;i++){
if(matrix[0][i]==0) {
row = true;
break;
}
}
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(matrix[i][j]==0){
matrix[i][0]=0;
matrix[0][j]=0;
}
}
}
for(int i=1;i<m;i++){
if(matrix[i][0]==0) {
for (int k =1; k < n; k++) {
matrix[i][k] = 0;
}
}
}
for(int i=1;i<n;i++) {
if (matrix[0][i] == 0) {
for (int k = 1; k < m; k++) {
matrix[k][i] = 0;
}
}
}
if(col){
for(int i=0;i<m;i++){
matrix[i][0]=0;
}
}
if(row){
for(int i=0;i<n;i++){
matrix[0][i]=0;
}
}
}