zoukankan      html  css  js  c++  java
  • leetcode73矩阵置零

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

  • 相关阅读:
    Tensorflow卷积接口总结
    《MuseGAN: Multi-track Sequential Generative Adversarial Networks for Symbolic Music Generation and Accompaniment》论文阅读笔记
    核函数
    KCF跟踪算法
    岭回归、lasso
    C++的命令行参数(gflag)
    Python的命令行参数(argparse)
    size_t为什么重要
    linux下caffe的命令运行脚本
    卡尔曼滤波
  • 原文地址:https://www.cnblogs.com/joelwang/p/11896781.html
Copyright © 2011-2022 走看看