思想:
提示说明,最好的方法空间复杂度为O(1),其次空间复杂度为O(m+n),最坏的是O(m*n)。
方法一:O(m*n) space
开一个二维数组记录每一位置是否为空。
方法二:O(m+n) space
开两个一维数组,一个代表该行是否为空,一个代表该列是否为空;
class Solution {
public:
void setZeroes(vector<vector<int> > &matrix) {
int m = matrix.size();
int n = matrix[0].size();
vector<bool> row(m,false);
vector<bool> col(n,false);
for(int i=0;i<m;i++) {
for(int j=0;j<n;j++) {
if(matrix[i][j]==0) {
row[i]=true;
col[j]=true;
}
}
}
for(int i=0;i<m;i++) {
if(row[i]) {
fill(&matrix[i][0], &matrix[i][n], 0);
}
}
for(int i=0;i<n;i++) {
if(col[i]) {
for(int j=0;j<m;j++) {
matrix[j][i] = 0;
}
}
}
}
};
方法三: O(1) space
两个变量分别表示第一行和第一列是否为0;
然后如果matrix[i][j] == 0,就可以利用第一行的matrix[0][j] 和第一列的matrix[i][0]来标记该行该列应该为0;
class Solution {
public:
void setZeroes(vector<vector<int> > &matrix) {
int m = matrix.size();
int n = matrix[0].size();
bool first_row_zero = false;
bool first_col_zero = false;
for(int i=0;i<m;i++) {
if(matrix[i][0] == 0) {
first_col_zero = true;
break;
}
}
for(int i=0;i<n;i++) {
if(matrix[0][i] == 0) {
first_row_zero = true;
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(first_row_zero) {
for(int i=0;i<n;i++)
matrix[0][i]=0;
}
if(first_col_zero) {
for(int i=0;i<m;i++)
matrix[i][0]=0;
}
}
};
java:
public class Solution {
public void setZeroes(int[][] matrix) {
int m = matrix.length;
int n = matrix[0].length;
boolean first_row_zero = false;
boolean first_col_zero = false;
for(int i = 0; i < m; ++i) {
if(matrix[i][0] == 0) {
first_col_zero = true;
break;
}
}
for(int i = 0; i < n; ++i) {
if(matrix[0][i] == 0) {
first_row_zero = true;
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[0][j] == 0 || matrix[i][0] == 0) {
matrix[i][j] = 0;
}
}
}
if(first_row_zero) {
for(int i = 0; i < n; ++i) {
matrix[0][i] = 0;
}
}
if(first_col_zero) {
for(int i = 0; i < m; ++i) {
matrix[i][0] = 0;
}
}
}
}