码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode73矩阵置零

时间:2019-11-20 13:05:48      阅读:65      评论:0      收藏:0      [点我收藏+]

标签:isp   图片   tor   src   cto   none   temp   ase   for   

技术图片

 

 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;
            }
        }
    }
};

 

leetcode73矩阵置零

标签:isp   图片   tor   src   cto   none   temp   ase   for   

原文地址:https://www.cnblogs.com/joelwang/p/11896781.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!