73.矩阵置零(Java---二维数组变换)

给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用原地算法。
进阶:
你能想出一个仅使用常量空间的解决方案吗?

示例 1:
输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出:[[1,0,1],[0,0,0],[1,0,1]]

示例 2:
输入:matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
输出:[[0,0,0,0],[0,4,5,0],[0,3,1,0]]

提示:
m == matrix.length
n == matrix[0].length
1 <= m, n <= 200
-2^31 <= matrix[i][j] <= 2^31 - 1

class Solution {
    public void setZeroes(int[][] matrix) {
    	//记录第一行是否有 0
        boolean isFirstRowHaveZero = false;
        //记录第一例是否有 0
        boolean isFirstColumnHaveZero = false;
        //检查第一行
        for(int i = 0; i < matrix[0].length; i++)
            if(0 == matrix[0][i]) {
                isFirstRowHaveZero = true;
                break;
            }
        //检查第一列
        for(int i = 0; i < matrix.length; i++)
            if(0 == matrix[i][0]) {
                isFirstColumnHaveZero = true;
                break;
            }
        //以下如果先执行 3、4可能会影响 1、2
        
        //(1)遍历第一行和第一列以外的元素
        //为 0则将第一行相同列和第一列相同行的元素置为 0
        for(int i = 1; i < matrix.length; i++)
            for(int j = 1; j < matrix[0].length; j++)
                if(0 == matrix[i][j]) {
                    matrix[i][0] = 0;
                    matrix[0][j] = 0;
                }
        //(2)再次如上遍历元素
        //元素所在列的第一行和所在行的第一列为 0则置为 0
        for(int i = 1; i < matrix.length; i++)
            for(int j = 1; j < matrix[0].length; j++)
                if(0 == matrix[i][0] || 0 == matrix[0][j])
                    matrix[i][j] = 0;
        //(3)判断是否将第一行置为 0
        if(isFirstRowHaveZero)
            for(int i = 0; i < matrix[0].length; i++)
                matrix[0][i] = 0;
        //(4)判断是否将第一列置为 0
        if(isFirstColumnHaveZero)
            for(int i = 0; i < matrix.length; i++)
                matrix[i][0] = 0;
    }
}

你可能感兴趣的:(力扣)