题目描述
给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法 。
示例 1:

输入: matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出: [[1,0,1],[0,0,0],[1,0,1]]
示例 2:

输入: matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
输出: [[0,0,0,0],[0,4,5,0],[0,3,1,0]]
提示:
m == matrix.length
n == matrix[0].length
1 <= m, n <= 200
− 2 31 < = m a t r i x [ i ] [ j ] < = 2 31 − 1 -2^{31} <= matrix[i][j] <= 2^{31} - 1 −231<=matrix[i][j]<=231−1
思路
1 把最后一行和最后一列作为标记 ,某个位置出现0,就把所在位置的最后一行和最后一列置为0。
2 最后一行和最后一列提前处理并用两个bool变量标记 。
3 最后进行遍历判断是否有标记即可。
代码
cpp
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
bool row = false, col = false;
int n = matrix.size();
int m = matrix[0].size();
// 进行标记
for(int i = 0; i < n; ++i)
{
// 最后一列特殊标记
if(matrix[i][m - 1] == 0)col = true;
for(int j = 0; j < m; ++j)
{
// 最后一行特殊标记
if(i == 0 && matrix[n - 1][j] == 0)row = true;
// 除了最后一行和最后一列之外的标记
if(matrix[i][j] == 0 && i != n - 1 && j != m - 1) matrix[i][m -1] = matrix[n - 1][j] = 0;
}
}
// 获取结果
for(int i = 0; i < n; ++i)
{
for(int j = 0; j < m; ++j)
{
// 最后一行&&最后一列特殊处理
if(i == n - 1 && j == m - 1)
{
if(row == true || col == true) matrix[i][j] = 0;
}
// 最后一行特殊处理
else if(i == n - 1)
{
if(row == true) matrix[i][j] = 0;
}
// 最后一列特殊处理
else if(j == m - 1)
{
if(col == true) matrix[i][j] = 0;
}
else
{
if(matrix[n - 1][j] == 0 || matrix[i][m - 1] == 0) matrix[i][j] = 0;
}
}
}
}
};