题目链接
注意点
- 不要用O(mn)空间复杂度的解法
解法
解法一:line数组表示第i行是否有0,row数组表示第i列是否有0,先遍历一遍,某个位置为0就修改相应的数组。最后根据line和row两个数组来修改matrix。时间复杂度O(mn),空间复杂度O(m+n)
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
if(matrix.size() == 0 || matrix[0].size() == 0) return;
int m = matrix.size(),n = matrix[0].size();
int i,j,line[m],row[n];
for(i = 0;i < m;i++) line[i] = 0;
for(i = 0;i < n;i++) row[i] = 0;
for(i = 0;i < m;i++)
{
for(j = 0;j < n;j++)
{
if(matrix[i][j] == 0)
{
line[i] = 1;
row[j] = 1;
}
}
}
for(i = 0;i < m;i++)
{
if(line[i] == 1)
{
for(j = 0;j < n;j++) matrix[i][j] = 0;
}
}
for(i = 0;i < n;i++)
{
if(row[i] == 1)
{
for(j = 0;j < m;j++) matrix[j][i] = 0;
}
}
}
};
解法二:用line和row来标记第一行第一列是否有0。然后遍历除第一行第一列之外的matrix,如果某个位置为0就把第一行第一列的对应位置置0,然后再遍历一遍除第一行第一列之外的matrix,如果对应的第一行或者第一列为0,就置为0。时间复杂度O(mn),空间复杂度O(1)
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
if(matrix.size() == 0 || matrix[0].size() == 0) return;
int m = matrix.size(),n = matrix[0].size();
int i,j;
bool line = false,row = false;
for(i = 0;i < n;i++)
{
if(matrix[0][i] == 0) line = true;
}
for(i = 0;i < m;i++)
{
if(matrix[i][0] == 0) row = true;
}
for(i = 1;i < m;i++)
{
for(j = 1;j < n;j++)
{
if(matrix[i][j] == 0)
{
matrix[0][j] = 0;
matrix[i][0] = 0;
}
}
}
for(i = 1;i < m;i++)
{
for(j = 1;j < n;j++)
{
if(matrix[0][j] == 0 || matrix[i][0] == 0) matrix[i][j] = 0;
}
}
if(line == true)
{
for(i = 0;i < n;i++) matrix[0][i] = 0;
}
if(row == true)
{
for(i = 0;i < m;i++) matrix[i][0] = 0;
}
}
};
小结
- 很少遇到对空间复杂度有要求的题目