方法1:
赋值另存一个m*n的矩阵,在原矩阵为零的值相应置新的矩阵行和列为零。额外空间为
O
(
m
∗
n
)
O(m*n)
O(m∗n).
方法2:
两个数组,bool[m] 和 bool[n] 分别存某行有零,后者某列有零。之后根据数组值将原矩阵相应位置置零。额外空间
O
(
m
+
n
)
O(m + n)
O(m+n)。
方法3:
看来许久才明白。
先对矩阵进行扫描,标记要进行置0的行和列,对要进行置0的行进行标。同时还要两变量记录第0行和第0列是否要置0,最后进行置0操作。
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
if (matrix.empty())return;
bool rowFlag = false;// 第一行被设置的标志
bool colFlag = false; // 第一列被设置的标志
int m = matrix.size(), n = matrix[0].size();
for (int i = 0; i<m; i++)
for (int j = 0; j < n; j++)
{
if (matrix[i][j] == 0)
{
if (i == 0)// 标记第一行要被设置
rowFlag = true;
if (j == 0)// 标记第一列要被设置
colFlag = true;
//标记要设置为0的行和列
matrix[0][j] = 0;
matrix[i][0] = 0;
}
}
// 对第二行第二列开始的元素设置0
for (int i = 1; i<m; i++)
for (int j = 1; j < n; j++)
{
if (matrix[i][0]==0 || matrix[0][j]==0)
matrix[i][j] = 0;
}
if (rowFlag)
for (int j = 0; j < n; j++)matrix[0][j] = 0;
if (colFlag)
for (int i = 0; i < m; i++)matrix[i][0] = 0;
}
};
[1]https://www.cnblogs.com/higerzhang/p/4099114.html
[2]https://blog.csdn.net/derrantcm/article/details/47371979