leetcode 73:矩阵置零

一 O(mn)的额外空间,定义数组存放为0的位置

void setZeroes(std::vector<std::vector<int>>& matrix) {
    std::vector<int> m1;
    std::vector<int> m2;
    int m=matrix.size();
    int n=matrix[0].size();
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            if(matrix[i][j]==0){
                m1.push_back(i);
                m2.push_back(j);
            }
        }
    }

    for(int k=0;k<m1.size();k++){
        int i=m1[k];
        int j=m2[k];
        for(int k=0;k<n;k++){
            matrix[i][k]=0;
        }
        for(int k=0;k<m;k++){
            matrix[k][j]=0;
        }
    }
}

二 O(m+n)额外空间

我们可以m+n为m行和n列之和,而我们只需要标记一行或一列是否应该为0即可,所以可以创建数组  存放一行或一列是否置0

void setZeroes(std::vector<std::vector<int>>& matrix) {
    int m=matrix.size();
    int n=matrix[0].size();
    std::vector<int> m1(m+n);
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            if(matrix[i][j]==0){
                m1[m+j]=1;
                m1[i]=1;
            }
        }
    }

    for(int i=0;i<m;i++){
        if(m1[i]==1) {
            for (int k = 0; k < n; k++) {
                matrix[i][k] = 0;
            }
        }
    }
    for(int i=m;i<m+n;i++){
        if(m1[i]==1) {
            for (int k = 0; k < m; k++) {
                matrix[k][i-m] = 0;
            }
        }
    }
}

三 O(1)

使用第一行和第一列的表示当前行和当前列是否为0,

如果第一行的第i个元素为0 将第i列置0  在置0时先不改变第一列第一行的元素,最后该变第一行第一列的元素  第一行和第一列是否置0在最开始时就需要标记

void setZeroes(std::vector<std::vector<int>>& matrix) {
    int m=matrix.size();
    int n=matrix[0].size();

    bool row= false;
    bool col=false;

    for(int i=0;i<m;i++){
        if(matrix[i][0]==0) {
            col = true;
            break;
        }
    }

    for(int i=0;i<n;i++){
        if(matrix[0][i]==0) {
            row = true;
            break;
        }
    }

    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            if(matrix[i][j]==0){
                matrix[i][0]=0;
                matrix[0][j]=0;
            }
        }
    }

    for(int i=1;i<m;i++){
        if(matrix[i][0]==0) {
            for (int k =1; k < n; k++) {
                matrix[i][k] = 0;
            }
        }
    }
    for(int i=1;i<n;i++) {
        if (matrix[0][i] == 0) {
            for (int k = 1; k < m; k++) {
                matrix[k][i] = 0;
            }
        }
    }

    if(col){
        for(int i=0;i<m;i++){
            matrix[i][0]=0;
        }
    }

    if(row){
        for(int i=0;i<n;i++){
            matrix[0][i]=0;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/u013263891/article/details/84724813
今日推荐