题目链接:73. 矩阵置零 - 力扣(LeetCode)
解题思路: 创建一个vector记录要置零的行号和列号
解题过程: 遍历两次矩阵,第一次记录值为0的元素的行和列,第二次将对应的行和列置零
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
vector<pair<int,int>> zero;
for(int i=0;i<matrix.size();i++){
for(int j=0;j<matrix[0].size();j++){
//记录元素为0的行号和列号
if(matrix[i][j]==0) zero.push_back({i,j});
}
}
for(int i=0;i<zero.size();i++){
int x=zero[i].first;
int y=zero[i].second;
//置零
for(int j=0;j<matrix.size();j++){
matrix[j][y]=0;
}
for(int k=0;k<matrix[0].size();k++){
matrix[x][k]=0;
}
}
}
};
- 时间复杂度:O(n*m)
- 空间复杂度:O(k) k为值为0的元素个数
优化:空间复杂度为常数
解题过程: 首先用两个布尔变量记录第一行和第一列是否有为0的元素,然后遍历整个矩阵,将值为0的元素所对应的第一行和第一列的元素置为0,然后遍历矩阵,根据第一行和第一列的元素是否为0将对应的行和列置零。
class Solution
{
public:
void setZeroes(vector<vector<int>> &matrix)
{
bool row_flag = false, col_flag = false;
//第一行是否有零
for (int i = 0; i < matrix.size(); i++)
{
if (matrix[i][0] == 0) row_flag = true;
}
//第一列是否有零
for (int i = 0; i < matrix[0].size(); i++)
{
if (matrix[0][i] == 0) col_flag = true;
}
//把第一行和第一列作为标志位
for (int i = 1; i < matrix.size(); i++)
{
for (int j = 1; j < matrix[0].size(); j++)
{
if (matrix[i][j] == 0)
{
matrix[i][0] = 0;
matrix[0][j] = 0;
}
}
}
//置零
//注意遍历从1开始,防止第一行和列后置零的元素干扰
for (int i = 1; i < matrix.size(); i++)
{
for (int j = 1; j < matrix[0].size(); j++)
{
if (matrix[i][0] == 0 || matrix[0][j] == 0)
matrix[i][j] = 0;
}
}
//置零
if (row_flag)
{
for (int i = 0; i < matrix.size(); i++)
{
matrix[i][0] = 0;
}
}
if (col_flag)
{
for (int i = 0; i < matrix[0].size(); i++)
{
matrix[0][i] = 0;
}
}
}
};
- 时间复杂度:O(n*m),遍历整个矩阵
- 空间复杂度:O(1)