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

        }

    }

}

 

你可能感兴趣的:(LeetCode)