方法一:暴力
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
vector<vector<int>> m2 = matrix; //直接复制出另一个数组
for (int i = 0; i < matrix.size(); i ++ )
for (int j = 0; j < matrix[0].size(); j ++ )
{
if (matrix[i][j] == 0) //原数组存在0元素,就把新数组该元素所在的行列置0
{
for (int i2 = 0; i2 < matrix[0].size(); i2 ++ ) m2[i][i2] = 0;
for (int j2 = 0; j2 < matrix.size(); j2 ++ ) m2[j2][j] = 0;
}
}
matrix = m2; //拷贝回去
}
};
方法二:原地置换
思路:用首行和首列元素做标记,每当数组中出现0元素,就将该元素所在的行首元素及列首元素置0。在这之前需要先判断第一行或第一列是否本来就存在0元素。
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
int n = matrix.size(), m = matrix[0].size();
bool row_0 = false, col_0 = false; //标记第一行和第一列是否存在零元素
for (int j = 0; j < m; j ++ ) //判断第一行是否有0
if (matrix[0][j] == 0)
{
row_0 = true;
break;
}
for (int i = 0; i < n; i ++ ) //判断第一列是否有0
if (matrix[i][0] == 0)
{
col_0 = true;
break;
}
for (int i = 1; i < n; i ++ ) //遍历数组内部的0
for (int j = 1; j < m; j ++ )
if (matrix[i][j] == 0) //若该元素为0
matrix[i][0] = 0, matrix[0][j] = 0; //则将此0元素的行首和列首元素置0
for (int i = 1; i < n; i ++ )
for (int j = 1; j < m; j ++ )
if (matrix[i][0] == 0 || matrix[0][j] == 0) //该元素的行首或列首为0,则置0
matrix[i][j] = 0;
if (row_0) //若首行存在0元素
for (int i = 0; i < m; i ++ ) matrix[0][i] = 0; //第一行置0
if (col_0) //若首列存在0元素
for (int i = 0; i < n; i ++ ) matrix[i][0] = 0; //第一列置0
}
};