看起来很简单的题目,最简单粗暴的方法是建立两个数组记录需要置零的行和列,但是题目中有一个进阶版要求:
进阶:
- 一个直观的解决方案是使用
O(mn)
的额外空间,但这并不是一个好的解决方案。- 一个简单的改进方案是使用
O(m + n)
的额外空间,但这仍然不是最好的解决方案。- 你能想出一个仅使用常量空间的解决方案吗?
空间复杂度O(m+n)就是上面说的方法,建立大小分别为m和n的数组记录需要置零的行列,完善数组后再次遍历矩阵将需要置零的行列置零即可。
试了一下O(m)的方法,先遍历行,第一次遍历将需要置零的行置零,并记录需要置零的列,遍历完一遍再将列置零即可:
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
int m=matrix.size();
int n=matrix[0].size();
int u[n];
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(matrix[i][j]==0){
u[j]=1;
for(int k=0;k<n;k++){
if(matrix[i][k]==0) u[k]=1;
matrix[i][k]=0;
}
break;
}
}
}
for(int i=0;i<n;i++){
if(u[i]==1){
for(int j=0;j<m;j++){
matrix[j][i]=0;
}
}
}
}
};
看了答案才知道还有空间复杂度为O(1)的方法,思路真的很厉害,直接用原矩阵的第一行记录需要置零的行,用原矩阵的第一列记录需要置零的列。(需要用常量额外内存记录一下第一行和第一列需不需要置零,其实准确来说第一列不需要记录,因为第一行第一个数就可以用来记录)