题目大意:给出一个二维矩阵,将其中为0的位置对应的行列所有数字都改成0
分析:数组的考察。这道题考察如何用更小的空间复杂度求解。有三种方法,对应空间复杂度为:O(mn)、O(m+n)、O(1)。
代码:
方法一:O(mn)。用一个二维的标记数组来记录所给矩阵中本来就有的0。
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
vector<vector<bool>> old(matrix.size(), vector<bool>(matrix[0].size()));
for (int i = 0;i < matrix.size();i++) {
for (int j = 0;j < matrix[0].size();j++) {
if (matrix[i][j] == 0 && old[i][j] == false) {
change(matrix, old, i, j);
}
}
}
}
void change(vector<vector<int>>& matrix, vector<vector<bool>>& old, int m, int n) {
for (int i = 0;i < matrix.size();i++) {
if (matrix[i][n] != 0) {
old[i][n] = true;
matrix[i][n] = 0;
}
}
for (int j = 0;j < matrix[0].size();j++) {
if (matrix[m][j] != 0) {
old[m][j] = true;
matrix[m][j] = 0;
}
}
}
};
方法二:O(m+n)。用一个一维数组记录矩阵中哪行哪列有0,进而就知道了哪行哪列需要被改为0。m行n列就是m+n个记录。
转载自https://blog.csdn.net/lu597203933/article/details/44916109
void setZeroes(vector<vector<int> > &matrix) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int row = matrix.size();
if(row == 0) return;
int col = matrix[0].size();
if(col == 0) return;
bool* record = new bool[row+col];
memset(record,false,row+col);
for(int i = 0; i < row; ++i)
for(int j = 0; j < col; ++j){
if(matrix[i][j] == 0) {
record[i] = 1;
record[row+j] = 1;
}
}
for(int i = 0; i < row; ++i)
if(record[i]){
for(int j = 0; j < col; ++j)
matrix[i][j] = 0;
}
for(int j = row; j < row+col; ++j)
if(record[j]){
for(int i = 0; i < row; ++i)
matrix[i][j-row] = 0;
}
}
方法三:O(1)。利用问题本身已经提供的空间进行记录,不用重新申请其他空间。也就是利用第一行和第一列来辅助记录哪行有0哪列有0。另外只需要记录第一行和第一列中是否有0即可。
转载自https://blog.csdn.net/lu597203933/article/details/44916109
void setZeroes(vector<vector<int> > &matrix) {
int row = matrix.size();
if(row == 0) return;
int col = matrix[0].size();
if(col == 0) return;
bool firstrowiszero = false;
bool firstcoliszero = false;
for(int j = 0; j < col; ++j) //单独记录第一行是否存在0
if(matrix[0][j] == 0){
firstrowiszero = true;
break;
}
for(int i = 0; i < row; ++i) //单独记录第一列是否存在0
if(matrix[i][0] == 0){
firstcoliszero = true;
break;
}
for(int i = 1; i < row; ++i) //遍历矩阵其他位置记录0所在的行列
for(int j = 1; j < col; ++j){
if(matrix[i][j] == 0) {
matrix[i][0] = 0; //0所在行的第一列置0
matrix[0][j] = 0; //0所在列的第一行置0
}
}
for(int i = 1; i < row; ++i) //根据第一行和第一列的记录修改矩阵
for(int j = 1; j < col; ++j)
if(matrix[i][0] == 0 || matrix[0][j] == 0)
matrix[i][j] = 0;
if(firstrowiszero){ //修改第一行
for(int j = 0; j < col; ++j)
matrix[0][j] = 0;
}
if(firstcoliszero){ //修改第一列
for(int i = 0; i < row; ++i)
matrix[i][0] = 0;
}
}