Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place
方法一:
本算法的时间复杂度为O(m*n),空间复杂度为:O(m+n)
思想:首先遍历一边数组将数组中出现0的那一行以及那一列出现了的行号和列号记录在record(record初始化为0)中;再依次遍历一边record然后进行对出现0的行和列进行赋值
void setZeroes(vector<vector<int>>& matrix) {
//本算法的时间复杂度为O(m*n),空间复杂度为:O(m+n)
//思想:首先遍历一边数组将数组中出现0的那一行以及那一列出现了的行号和列号记录在record(record初始化为0)中;
//再依次遍历一边record然后进行对出现0的行和列进行赋值
int row = matrix.size();
if(row <= 0) return;
int column = matrix[0].size();
if(column <= 0) return;
bool* record = new bool[row+column];
memset(record,false,row+column);
for(int i = 0; i < row; i++){
for(int j = 0; j < column; j++){
if(matrix[i][j] == 0){
record[i] = 1;
record[row+j] = 1;
}
}
}
for(int i = 0; i < row; i++){
if(record[i]){
for(int j = 0; j < column; j++){
matrix[i][j] = 0;
}
}
}
for(int i = row; i < row+column; i++){
if(record[i]){
for(int j = 0; j < row; j++){
matrix[j][i-row] = 0;
}
}
}
}
方法二、
可以不需要额外的空间,转成利用矩阵的第一行和第一列来作为辅助空间使用。不用开辟新的存储空间。方法就是:
1.先确定第一行和第一列是否需要清零
即,看看第一行中是否有0,记下来。也同时记下来第一列中有没有0。
2.扫描剩下的矩阵元素,如果遇到了0,就将对应的第一行和第一列上的元素赋值为0
这里不用担心会将本来第一行或第一列的1改成了0,因为这些值最后注定要成为0的,比如matrix[i][j]==0,那么matrix[i][0]处在第i行,matrix[0][j]处于第j列,最后都要设置为0的。
3.根据第一行和第一列的信息,已经可以将剩下的矩阵元素赋值为结果所需的值了即,拿第一行为例,如果扫描到一个0,就将这一列都清0.
4.根据1中确定的状态,处理第一行和第一列。
如果最开始得到的第一行中有0的话,就整行清零。同理对列进行处理。
代码:
void setZeroes(vector<vector<int> > &matrix) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int row = matrix.size();
if(row == 0) return;
int col = matrix[0].size();
if(col == 0) return;
bool firstrowiszero = false;
bool firstcoliszero = false;
for(int j = 0; j < col; ++j)
if(matrix[0][j] == 0){
firstrowiszero = true;
break;
}
for(int i = 0; i < row; ++i)
if(matrix[i][0] == 0){
firstcoliszero = true;
break;
}
for(int i = 1; i < row; ++i)
for(int j = 1; j < col; ++j){
if(matrix[i][j] == 0) {
matrix[i][0] = 0;
matrix[0][j] = 0;
}
}
for(int i = 1; i < row; ++i)
for(int j = 1; j < col; ++j)
if(matrix[i][0] == 0 || matrix[0][j] == 0)
matrix[i][j] = 0;
if(firstrowiszero){
for(int j = 0; j < col; ++j)
matrix[0][j] = 0;
}
if(firstcoliszero){
for(int i = 0; i < row; ++i)
matrix[i][0] = 0;
}
}