【题干】
给定一个 mx
n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法**。**
进阶:
- 一个直观的解决方案是使用
O(
m n)
的额外空间,但这并不是一个好的解决方案。 - 一个简单的改进方案是使用
O(
m+
n)
的额外空间,但这仍然不是最好的解决方案。 - 你能想出一个仅使用常量空间的解决方案吗?
【思路】
- 不太懂为什么这个题可以标mid,除了需要注意不能边扫描边置零导致信息丢失以外,没看出什么能踩的坑,也没看出什么时间复杂度上优化的可能性;
- 既然要尽量压缩辅助空间,那直接一步到位,用第一行第一列做flag记录(其实哪行哪列都行,但不用第一行第一列的话会显得很抽象),由于,如果当前元素是0,那它在第一行第一列的对应位置本身就该被置0,而当前元素不为0时并不会对第一行第一列做什么,所以也不用担心第一行第一列信息丢失的问题;
- 不能忘了还得提前对第一行第一列本身做个单独的处理。
【题解】
cpp
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
bool flag1 = false;//表示第一行是否有0
bool flag2 = false;//表示第一列是否有0
int rows = matrix.size();
int cols = matrix[0].size();
for(int i=0;i<rows;i++){
if(matrix[i][0]==0)
flag2 = true;
}
for(int i=0;i<cols;i++){
if(matrix[0][i]==0)
flag1 = true;
}
for(int i=1;i<rows;i++){//以第一行和第一列为标志位,标志是否这一行/列置0
for(int j=1;j<cols;j++){
if(matrix[i][j]==0){
matrix[i][0] = 0;
matrix[0][j] = 0;
}
}
}
//把标志位所在列置0
for(int i=1;i<cols;i++){
if(matrix[0][i]==0){
for(int j=1;j<rows;j++){
matrix[j][i] = 0;
}
}
}
//把标志位所在行置0
for(int i=1;i<rows;i++){
if(matrix[i][0]==0){
for(int j=1;j<cols;j++)
matrix[i][j] = 0;
}
}
//如果第一行有0存在则将第一行置0
if(flag1==true){
for(int i=0;i<cols;i++)
matrix[0][i] = 0;
}
//如果第一列有0存在则将第一列置0
if(flag2==true){
for(int i=0;i<rows;i++)
matrix[i][0] = 0;
}
return;
}
};