https://leetcode-cn.com/problems/set-matrix-zeroes/

解答:

两种方法时间复杂度都为O(mn)

O(m+n)空间方法:

用两个容器储存为0的行和列

class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        //O(m+n)额外空间,常数空间???
        set<int> rse,cse;
        int r=matrix.size();int c=matrix[0].size();
        for(int i=0;i<r;i++){
            for(int j=0;j<c;j++){
                if(matrix[i][j]==0){
                    rse.insert(i);
                    cse.insert(j);
                }
            }
        }
        while(!rse.empty()){
            int temp=*rse.begin();
            for(int j=0;j<c;j++){
                matrix[temp][j]=0;
            }
            rse.erase(rse.begin());
        }
        while(!cse.empty()){
            int temp=*cse.begin();
            for(int i=0;i<r;i++){
                matrix[i][temp]=0;
            }
            cse.erase(cse.begin());
        }


    }
};

常数空间方法:

对于第0行和第0列的数据如果有0,则标记isrow=true, iscol=true来记录是否为0;

对于1~m行和1~n列的数据如果有0,则将其标注在第0行,第0列;即

i : 1~m-1
    j:  1~n-1
        if(matrix[i][j]==0)
            matrix[i][0]=0,matrix[0][j]=0; 

C++ code:

class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        //常数空间解决方案

        //标记第0行和第0列是否为0;
        bool isrow=false;
        bool iscol=false;
        int r=matrix.size();
        int c=matrix[0].size();

        for(int j=0;j<c;j++){
            if(matrix[0][j]==0){
                isrow=true;break;
            }
        }
        for(int i=0;i<r;i++){
            if(matrix[i][0]==0){
                iscol=true;break;
            }
        }

        //标记1~n列是否为0,将结果放入第0行和第0列;
        for(int i=1;i<r;i++){
            for(int j=1;j<c;j++){
                if(matrix[i][j]==0){
                    matrix[i][0]=0;
                    matrix[0][j]=0;
                }
            }
        }

        //先将1~n行列的值替换
        for(int i=1;i<r;i++){
            if(matrix[i][0]==0){
                for(int j=0;j<c;j++){
                    matrix[i][j]=0;
                }
            }
        }
        for(int j=1;j<c;j++){
            if(matrix[0][j]==0){
                for(int i=0;i<r;i++){
                    matrix[i][j]=0;
                }
            }
        }
        //再替换0行和0列
        if(isrow){
            for(int j=0;j<c;j++){
                matrix[0][j]=0;
            }
        }
        if(iscol){
            for(int i=0;i<r;i++){
                matrix[i][0]=0;
            }
        }
    }
};
01-13 02:03