[leetcode]73.Set Matrix Zeroes

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

 click to show follow up.

 Follow up:
 Did you use extra space?
 A straight forward solution using O(mn) space is probably a bad idea.
 A simple improvement uses O(m + n) space, but still not the best solution.
 Could you devise a constant space solution?
 */
/*
* 思路是通过第一行和第一列记录0所在的位置,容易出现的两个问题
* 1.由于一开始要用第一行和第一列记录,所以它们的数据是不能变的,所以应该首先用两个布尔类型记录
* 它们里边是否存在0,第一行存在0的话,最后要把第一行全部置零,第一列存在0,最后将第一列全部置零
* 2.记录下0的位置之后,再根据0的位置将对应行列置零,注意这时还是不能改变第一行和第一列的位置,
* 因为行列置零是分别进行的,第一行和第一列的数据后边要用到,不能改变*/
public class Q73SetMatrixZeroes {
    public static void main(String[] args) {
        int[][] matrix = new int[][]{{0,0,0,5},{4,3,1,4},{0,1,1,4},{1,2,1,3},{0,0,1,1}};
        setZeroes(matrix);
        for (int i = 0; i < matrix.length; i++) {
            System.out.println(Arrays.toString(matrix[i]));
        }
    }
    public static void setZeroes(int[][] matrix) {
        boolean row = false;
        boolean col = false;
        int m = matrix.length;
        int n = matrix[0].length;
        //判断第一列和第一行有没有0
        for (int i = 0; i < m; i++) {
            if (matrix[i][0] == 0)
            {
                col = true;
                break;
            }
        }
        for (int i = 0; i < n; i++) {
            if (matrix[0][i] == 0)
            {
                row = true;
                break;
            }
        }
        //用第一行和第一列记录下数列中出现的0的位置
        for(int i = 1;i < m;i++)
        {
            for (int j = 1; j < n; j++) {
                if (matrix[i][j] == 0)
                {
                    matrix[0][j] = 0;
                    matrix[i][0] = 0;
                }
            }
        }
        //根据0的位置将它所在的列全部置零
        for (int i = 1;i < n;i++)
        {
            if (matrix[0][i] == 0)
            {
                for (int j = 1;j < m;j++)
                    matrix[j][i] = 0;
            }
        }
        //根据0的位置将它所在的行全部置零
        for (int i = 1;i < m;i++)
        {
            if (matrix[i][0] == 0)
            {
                for (int j = 1;j < n;j++)
                    matrix[i][j] = 0;
            }
        }
        //如果第一行存在0那么将第一行全部置零
        if (row == true)
        {
            for (int i = 0; i < n; i++) {
                matrix[0][i] = 0;
            }
        }
        //如果第一列存在0那么将第一列全部置零
        if (col == true)
        {
            for (int i = 0; i < m; i++) {
                matrix[i][0] = 0;
            }
        }
    }
}
原文地址:https://www.cnblogs.com/stAr-1/p/7264298.html