leetcode73. 矩阵置零
给定一个 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
目录
题目分析
给定一个二维数组 matrix
,其中每个元素 matrix[i][j]
代表矩阵中的一个整数。要求将所有值为0的元素所在的行和列都置为0。
算法步骤
- 初始化两个布尔变量
fr
和fc
,分别用于标记第一行和第一列是否需要置0。 - 遍历第一行和第一列,记录哪些位置的元素为0。
- 遍历矩阵中的其他元素,如果遇到0,则将所在行和列的第一个元素置为0。
- 再次遍历矩阵,将所有第一个元素为0的行和列中的其他元素也置为0。
- 最后,如果第一行或第一列需要置0,则将整个行或列置为0。
算法流程
初始化fr和fc 遍历第一行 遍历第一列 遍历矩阵其他元素 再次遍历矩阵 最后处理第一行或第一列 结束
第一行的处理
- 原因:如果第一行中的某个元素在初始时为0,但在后续的遍历中被赋值为非0,那么在处理其他行时,由于第一行已经标记为需要置0,会导致其他行中本不需要置0的元素被错误地置为0。
- 处理方法:在开始遍历之前,先判断第一行中是否有元素为0,如果有,则将其标记为需要置0。
第一列的处理
- 原因:同理,如果第一列中的某个元素在初始时为0,但在后续的遍历中被赋值为非0,那么在处理其他列时,由于第一列已经标记为需要置0,会导致其他列中本不需要置0的元素被错误地置为0。
- 处理方法:在开始遍历之前,先判断第一列中是否有元素为0,如果有,则将其标记为需要置0。
具体代码
cpp
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
int m=matrix.size();
int n=matrix[0].size();
bool fr=false;
bool fc=false;
//判断第一行要不要置0
for(int i=0;i<n;i++)
{
if(matrix[0][i]==0) fr=true;
}
for(int i=0;i<m;i++)
{
if(matrix[i][0]==0) fc=true;
}
for(int i=1;i<m;i++)
{
for(int j=1;j<n;j++)
{
if(matrix[i][j]==0)
{
matrix[i][0]=0;
matrix[0][j]=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(fr)
{
for(int i=0;i<n;i++) matrix[0][i]=0;
}
if(fc)
{
for(int i=0;i<m;i++) matrix[i][0]=0;
}
}
};
算法分析
- 时间复杂度 : O(m*n),其中
m
是矩阵的行数,n
是矩阵的列数。 - 空间复杂度: O(1),只使用了常数级别的额外空间。
- 易错点: 在处理第一行和第一列时,需要特别注意不要影响之后的遍历。
相似题目
题目 | 链接 |
---|---|
189. 旋转数组 | https://leetcode.cn/problems/rotate-array/ |
200. 岛屿数量 | https://leetcode.cn/problems/number-of-islands/ |
207. 课程表 | https://leetcode.cn/problems/course-schedule/ |