题目描述
给定一个m*n的矩阵,如果有一个元素是0,就把该元素所在的行和列上的元素全置为0,要求使用原地算法。
拓展:
你的算法有使用额外的空间吗?
一种比较直接的算法是利用O(m,n)的空间,但是这不是一个好的解法
使用简单的改进可以在O(m+n)的空间解决这个问题,但是还不是最佳的解法
你能在常量级的空间复杂度内解决这个问题吗?
解题思路
class Solution {
public:
void setZeroes(vector<vector<int> > &matrix) {
if(matrix.size() == 0)
return;
int row = matrix.size();
int col = matrix[0].size();
int len = row + col;
int M[row];
int N[col];
memset(M, 0, sizeof(M));
memset(N, 0, sizeof(N));
for(int i = 0; i < row; i++){
for(int j = 0; j < col; j++){
if(matrix[i][j] == 0){
M[i] = 1; //标记该行
N[j] = 1; //标记该列
}
}
}
for(int i = 0; i < row; i++){
if(M[i] == 1){
for(int j = 0; j < col; j++)
matrix[i][j] = 0;
}
}
for(int j = 0; j < col; j++){
if(N[j] == 1){
for(int i = 0; i < row; i++)
matrix[i][j] = 0;
}
}
}
};
也可以利用第一行和第一列进行标记,只需要开始记录第一行第一列的情况,最后再对第一行和第一列进行处理。