LeetCode 73. Set Matrix Zeroes
Solution1:我的答案
比较笨,算法时间复杂度是
O(mn)
O
(
m
n
)
,占用额外空间是
O(m+n)
O
(
m
+
n
)
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
if(matrix.size() * matrix[0].size() == 0)
return;
vector<int> row; //某行有0则为true
vector<int> col; //某列有0则为true
for (int i = 0; i < matrix.size(); i++) {
for (int j = 0; j < matrix[0].size(); j++) {
if (matrix[i][j] == 0) {
if(find(row.begin(), row.end(), i) == row.end())
row.push_back(i);
if(find(col.begin(), col.end(), j) == col.end())
col.push_back(j);
}
}
}
for (int i = 0; i < row.size(); i++)
for (int j = 0; j < matrix[i].size(); j++)
matrix[row[i]][j] = 0;
for (int j = 0; j < col.size(); j++)
for (int i = 0; i < matrix.size(); i++)
matrix[i][col[j]] = 0;
return;
}
};
Solution2:空间复杂度优化
利用第一行第一列做记录
比较笨,算法时间复杂度是
O(mn)
O
(
m
n
)
,占用额外空间是
O(1)
O
(
1
)
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
int m = matrix.size(), n = matrix[0].size();
bool row_zero = false, col_zero = false;
for (int i = 0; i < n; i++) {
if (matrix[0][i] == 0) {
row_zero = true;
break;
}
}
for (int i = 0; i < m; i++) {
if (matrix[i][0] == 0) {
col_zero = true;
break;
}
}
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 (row_zero) {
for (int i = 0; i < n; i++)
matrix[0][i] = 0;
}
if (col_zero) {
for (int i = 0; i < m; i++)
matrix[i][0] = 0;
}
return;
}
};