zoukankan      html  css  js  c++  java
  • 【leetcode】Set Matrix Zeroes(middle)

    Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.

    思路:不能用额外空间,就用矩阵的第一行和第一列来标记这一行或这一列是否需要置0. 用两个bool量记录第一行和第一列是否需要置0

    大神的代码和我的代码都是这个思路,但是我在画0的时候是行列分开处理的,大神的代码是一起处理的

    void setZeroes(vector<vector<int> > &matrix) {
            if(matrix.empty())
                return;
    
            bool iszero1 = false; //第一行是否全0
            bool iszero2 = false; //第一列是否全0
            //第一行 第一列单独拿出来做标记
            for(int j = 0; j < matrix[0].size(); j++)
            {
                if(matrix[0][j] == 0) iszero1 = true;
            }
            for(int i = 0; i < matrix.size(); i++)
            {
                if(matrix[i][0] == 0) iszero2 = true;
            }
    
            for(int i = 1; i < matrix.size(); i++)
            {
                for(int j = 1; j < matrix[0].size(); j++)
                {
                    //如果数值为0,把对应那一行的第一个 和 那一列的第一个数字置为0
                    if(matrix[i][j] == 0)
                    {
                        matrix[0][j] = 0;
                        matrix[i][0] = 0;
                    }
                }
            }
    
    
            //分行列处理
            //先不考虑[0][0] 位置  如果某一行第一个为0,整行置0
            for(int i = 1; i < matrix.size(); i++)
            {
                if(matrix[i][0] == 0)
                {
                    for(int j = 1; j < matrix[0].size(); j++)
                    {
                        matrix[i][j] = 0;
                    }
                }
            }
    
            for(int j = 1; j < matrix[0].size(); j++)
            {
                if(matrix[0][j] == 0)
                {
                    for(int i = 1; i < matrix.size(); i++)
                    {
                        matrix[i][j] = 0;
                    }
                }
            }
    
            if(iszero1)
            {
                for(int j = 0; j < matrix[0].size(); j++)
                {
                    matrix[0][j] = 0;
                }
            }
            if(iszero2)
            {
                for(int i = 0; i < matrix.size(); i++)
                {
                    matrix[i][0] = 0;
                }
            }
    
            return;
        }

    大神的代码:

    public void setZeroes(int[][] matrix) {
        int rownum = matrix.length;
        if (rownum == 0)  return;
        int colnum = matrix[0].length;
        if (colnum == 0)  return;
    
        boolean hasZeroFirstRow = false, hasZeroFirstColumn = false;
    
        // Does first row have zero?
        for (int j = 0; j < colnum; ++j) {
            if (matrix[0][j] == 0) {
                hasZeroFirstRow = true;
                break;
            }
        }
    
        // Does first column have zero?
        for (int i = 0; i < rownum; ++i) {
            if (matrix[i][0] == 0) {
                hasZeroFirstColumn = true;
                break;
            }
        }
    
        // find zeroes and store the info in first row and column
        for (int i = 1; i < matrix.length; ++i) {
            for (int j = 1; j < matrix[0].length; ++j) {
                if (matrix[i][j] == 0) {
                    matrix[i][0] = 0;
                    matrix[0][j] = 0;
                }
            }
        }
    
        // set zeroes except the first row and column 一起处理的
        for (int i = 1; i < matrix.length; ++i) {
            for (int j = 1; j < matrix[0].length; ++j) {
                if (matrix[i][0] == 0 || matrix[0][j] == 0)  matrix[i][j] = 0;
            }
        }
    
        // set zeroes for first row and column if needed
        if (hasZeroFirstRow) {
            for (int j = 0; j < colnum; ++j) {
                matrix[0][j] = 0;
            }
        }
        if (hasZeroFirstColumn) {
            for (int i = 0; i < rownum; ++i) {
                matrix[i][0] = 0;
            }
        }
    }
  • 相关阅读:
    微软RPC技术学习小结
    [COM Interop学习小结]实现一个C#调用C++的示例
    [一个小问题]Mainfest配置文件的version问题小结
    【小结】IIS7下的Http Native Module开发
    Active Sync与IIS7 Classic&Integrated模式,Exchange 2007&2010的关系
    是否能在构造函数,析构函数中抛出异常?
    Trouble Shooting的一些感想(实时补充)
    python中 try、except、finally 的执行顺序
    Hessian怎样实现远程调用
    mysql的三种驱动类型
  • 原文地址:https://www.cnblogs.com/dplearning/p/4344825.html
Copyright © 2011-2022 走看看