给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法。
示例 1:
输入:
[
[1,1,1],
[1,0,1],
[1,1,1]
]
输出:
[
[1,0,1],
[0,0,0],
[1,0,1]
]
示例 2:
输入:
[
[0,1,2,0],
[3,4,5,2],
[1,3,1,5]
]
输出:
[
[0,0,0,0],
[0,4,5,0],
[0,3,1,0]
]
进阶:
一个直接的解决方案是使用 O(mn) 的额外空间,但这并不是一个好的解决方案。
一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。
你能想出一个常数空间的解决方案吗?
O(mn)的额外空间办法是重开一个数组进行存储,这里不做赘述
我自己想到的是O(m+n)的方式,开两个数组分别存为0的行和列。
void setZeroes(vector<vector<int>>& matrix) {
set<int> row, col;//分布存储要置零的行和列
for (int i = 0; i < matrix.size(); i++) {
for (int j = 0; j < matrix[i].size(); j++) {
if (matrix[i][j] == 0) {
row.insert(i);
col.insert(j);
}
}
}
set<int>::iterator rIt = row.begin();
while(rIt!=row.end()) {
for (int j = 0; j < matrix[*rIt].size(); j++) {
matrix[*rIt][j] = 0;
}
rIt++;
}
set<int>::iterator cIt = col.begin();
while (cIt != col.end()) {
for (int i = 0; i < matrix.size(); i++) {
matrix[i][*cIt] = 0;
}
cIt++;
}
}
最好的办法是常数空间,也就是用第一行存为0的列,第一列存为0的行,至于第一行和第一列是否为0,则需要firstRow和firstCol来存储了。
void setZeroes(vector<vector<int>>& matrix) {
int firstRow = 1, firstCol = 1;
for(int i=0;i<matrix.size();i++)
for (int j = 0; j < matrix[i].size(); j++) {
if (matrix[i][j] == 0) {
if (i == 0) firstRow = 0;
if (j == 0) firstCol = 0;
matrix[0][j] = 0;
matrix[i][0] = 0;
}
}
for (int i = 0; i < matrix.size(); i++) {//遍历第一列
if (i!=0 && matrix[i][0] == 0) {//说明第i行为0
for (int t = 1; t < matrix[i].size(); t++) matrix[i][t] = 0;
}
}
for (int i = 0; i < matrix[0].size(); i++) {//遍历第一行
if (i!=0 && matrix[0][i] == 0) {//说明第i列为0
for (int t = 1; t < matrix.size(); t++) matrix[t][i] = 0;
}
}
//然后处理第一行和第一列
if (firstRow == 0) {
for (int i = 0; i < matrix[0].size(); i++) matrix[0][i] = 0;
}
if (firstCol == 0) {
for (int i = 0; i < matrix.size(); i++) matrix[i][0] = 0;
}
}