目标:
给定一个m*n的数组,如果一个元素为0,则其所在行以及所在列,均设置为0
解题要求:常数空间
解题思路:
- 利用第一行以及第一列分别记录,对应的列是否存在0,对应的行是否存在0;遍历数组时,如果发现一个为0的元素,则设置第0行其所在列为0;其所在行第0列为0;
- 由于第一行及第一列腾出用于记录,所以需要预先判断第一行及第一列是否存在0;
- 根据第一行及第一列的情况,遍历数组。
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
if (matrix.empty())return;
int col = matrix.size();
int row = matrix[0].size();
bool first_col = false;
bool first_row = false;
//记录第一行是否全0行
for (int j=0;j<row;++j){
if (matrix[0][j] == 0){
first_col = true;
}
}
//记录第一列是否是全0列
for (int j=0;j<col;++j){
if (matrix[j][0] == 0){
first_row = true;
}
}
for (int i=1;i<col;++i){
for (int j=1;j<row;++j){
if (matrix[i][j] == 0){
matrix[i][0] = 0;
matrix[0][j] = 0;
}
}
}
for (int i=1;i<row;++i){
if (matrix[0][i]==0){
for (int j=1;j<col;++j){
matrix[j][i] = 0;
}
}
}
for (int j=1;j<col;++j){
if (matrix[j][0] == 0){
for (int i=1;i<row;++i){
matrix[j][i] = 0;
}
}
}
if (first_row){
for (int i=0;i<col;++i){
matrix[i][0] = 0;
}
}
if (first_col){
for (int j=0;j<row;++j){
matrix[0][j] = 0;
}
}
}
};
网友评论