Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.
Did you use extra space?
A straight forward solution using O(mn) space is probably a bad idea.
A simple improvement uses O(m + n) space, but still not the best solution.
Could you devise a constant space solution?
思路1:
用O(m + n)的空间实现,用两个数组分别记录元素值0所在的行和列的位置,然后根据这两个数组中的值把元数组中相应的行和列元素置为0.
思路2:
用O(1)空间实现的话,相比用O(m+n)的空间,不能额外加一行一列,就用第一行和第一列来存储哪行哪列有0。当然,这样做比较麻烦的是第一行第一列的原始信息,需要先保存下来。
详细实现步骤:
1)先对第一行和第一列的元素处理:遍历第一行的每个元素,如果有元素值为0,将firstRow设为true;同理,如果第一列有元素的值为0,将firstCol设为false。
2)从第二行第二列开始遍历每个元素,如果matrix[i][j]==0,另matrix[0][j]=0,matrix[i][0]=0;
3)处理第一行的每个元素,把0元素所在列的值全设为0;
4)同理,处理第一列的每一个元素,把0元素所在行的值全设为0;
5)处理第一行元素,如果firstRow为true,把第一行的元素全设为0;
6)同理,处理第一列的每一个元素,把第一列全设为0.
思路1算法实现:
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
if(matrix.size() < 1 || matrix[0].size() < 1)
return;
vector<int> cols, rows;
for(int i = 0; i < matrix.size(); ++i)
for(int j = 0; j < matrix[0].size(); ++j)
{
if(matrix[i][j] == 0)
{
cols.push_back(i);
rows.push_back(j);
}
}
for(int col: cols)
for(int j = 0; j < matrix[0].size(); ++j)
matrix[col][j] = 0;
for(int row: rows)
for(int i = 0; i < matrix.size(); ++i)
matrix[i][row] = 0;
return;
}
};
思路2代码实现:
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
const int rowSize = matrix.size();
const int colSize = matrix[0].size();
if ((rowSize <= 0) || (colSize<= 0)) return;
//1)设置firstRow和firstCol的值
bool firstRow = false, firstCol = false;
for(int i = 0; i < colSize; ++i)
if(matrix[0][i] == 0)
firstRow = true;
for(int i = 0; i < rowSize; ++i)
if(matrix[i][0] == 0)
firstCol = true;
//2)从第二行第二列的元素开始处理
for(int i = 1; i < rowSize; ++i)
for(int j = 1; j < colSize; ++j)
if(matrix[i][j] == 0)
{
matrix[0][j] = 0;
matrix[i][0] = 0;
}
//3) 处理第一行的每个元素,把0元素所在列的值全设为0;
for(int i = 1; i < colSize; ++i) //i指示列
{
if(matrix[0][i] == 0)
{
for(int j = 1; j < rowSize; ++j)
matrix[j][i] = 0;
}
}
//4) 同理,处理第一列的每一个元素,把0元素所在行的值全设为0;
for(int i = 1; i < rowSize; ++i) //i指示行
if(matrix[i][0] == 0)
for(int j = 1; j < colSize; ++j)
matrix[i][j] = 0;
//5)处理第一行元素,如果firstRow为true,把第一行的元素全设为0;
if(firstRow)
{
for(int i = 0; i < colSize; ++i)
matrix[0][i] = 0;
}
//6)同理,处理第一列的每一个元素,把第一列全设为0.
if(firstCol)
{
for(int i = 0; i < rowSize; ++i)
matrix[i][0] = 0;
}
return;
}
};