leetcode73——Set Matrix Zeroes

题目大意:给出一个二维矩阵,将其中为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) {
old[m][n] = true;
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;
        }
    }

猜你喜欢

转载自blog.csdn.net/tzyshiwolaogongya/article/details/80335586
今日推荐