编写一种算法,若M × N矩阵中某个元素为0,则将其所在的行与列清零。
来源:力扣(LeetCode)
题目链接:https://leetcode-cn.com/problems/zero-matrix-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题方法一:暴力枚举:
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
int n = matrix.size();
int m = matrix[0].size();
vector<int> v1;
vector<int> v2;
for(int i = 0; i < n; ++i){
for(int j = 0; j < m; ++j){
if(matrix[i][j] == 0){
v1.push_back(i);
v2.push_back(j);
}
}
}
for(int i : v1){
for(int j = 0; j < m; ++j){
matrix[i][j] = 0;
}
}
for(int i : v2){
for(int j = 0; j < n; ++j){
matrix[j][i] = 0;
}
}
}
};
方法二:使用两个变量标记第一行和第一列
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
int n = matrix.size();
int m = matrix[0].size();
int flag_row = 0;
int flag_col = 0;
for(int i = 0; i < n; ++i){
if(matrix[i][0] == 0) flag_col = 1;
}
for(int j = 0; j < m; ++j){
if(matrix[0][j] == 0) flag_row = 1;
}
for(int i = 1; i < n; ++i){
for(int j = 1; j < m; ++j){
if(matrix[i][j] == 0){
matrix[i][0] = 0;
matrix[0][j] = 0;
}
}
}
for(int i = 1; i < n; ++i){
for(int j = 1; j < m; ++j){
if(matrix[i][0] == 0 || matrix[0][j] == 0) matrix[i][j] = 0;
}
}
if(flag_col){
for(int i = 0; i < n; ++i) matrix[i][0] = 0;
}
if(flag_row){
for(int j = 0; j < m; j++) matrix[0][j] = 0;
}
}
};
解题方法三:使用一个变量标记(方法二的优化)
但为了防止每一列的第一个元素被提前更新,我们需要从最后一行开始,倒序地处理矩阵元素。
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
int n = matrix.size();
int m = matrix[0].size();
int flag_col = 0;
for(int i = 0; i < n; ++i){
if(matrix[i][0] == 0) flag_col = 1;
for(int j = 1; j < m; ++j){
if(matrix[i][j] == 0){
matrix[i][0] = 0;
matrix[0][j] = 0;
}
}
}
for(int i = n - 1; i >= 0; --i){
for(int j = 1; j < m; ++j){
if(matrix[i][0] == 0 || matrix[0][j] == 0) matrix[i][j] = 0;
}
}
if(flag_col){
for(int i = 0; i < n; ++i) matrix[i][0] = 0;
}
}
};