题目描述如下:
给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法。
示例 1:
输入:
[
[1,1,1],
[1,0,1],
[1,1,1]
]
输出:
[
[1,0,1],
[0,0,0],
[1,0,1]
]
这个题目要求使用原地算法,尽量使用O(1) 空间。
这个题目的难点是前面的元素为0导致后面的元素为0之后,如何辨别,到底是本身就是0还是受同一行同一列的元素影响而改为0,因此可以找一个特殊值,在修改同一行同一列的非0元素时先设置为这个特殊值,遍历完数组之后。再遍历数组第二次,将特殊值修改为0。 我这儿的特殊值选的 -8 ,这个题目比较怪,INT_MAX,INT_MIN等都被加进了测试用例中无法作为特殊值。
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
int row_size=matrix.size(),col_size=matrix[0].size();
for(int i=0;i<row_size;i++)
for(int j=0;j<col_size;j++)
{
if(matrix[i][j]==0)
{
setZeroAtPos(matrix,i,j);
}
}
for(int i=0;i<row_size;i++)
for(int j=0;j<col_size;j++)
{
if(matrix[i][j]==-8)
{
matrix[i][j]=0;
}
}
}
void setZeroAtPos(vector<vector<int>>& matrix,int row, int col)
{
int row_size=matrix.size(),col_size=matrix[0].size();
for(int i=0;i<col_size;i++)
{
if(matrix[row][i]!=0) //判断本位置值是否为0,不为0才需要修改
matrix[row][i]=-8;
}
for(int i=0;i<row_size;i++)
{
if(matrix[i][col]!=0) //判断本位置值是否为0,不为0才需要修改
matrix[i][col]=-8;
}
}
};