零矩阵

编写一种算法,若M × N矩阵中某个元素为0,则将其所在的行与列清零。

class Solution {
    public void setZeroes(int[][] matrix) {
        boolean isFirstRowZero = false;
        boolean isFirstColumZero = false;
        
        for(int i = 0; i < matrix[0].length; i++){
            if (matrix[0][i] == 0){
                isFirstRowZero = true;
                break;
            }
        }
        for(int i = 0; i < matrix.length; i++){
            if (matrix[i][0] == 0){
                isFirstColumZero = true;
                break;
            }
        }

        for(int i = 1; i < matrix.length; i++){
            for(int j = 1; j < matrix[i].length; j++){
                if (matrix[i][j] == 0){
                    matrix[i][0] = 0;
                    matrix[0][j] = 0;
                }
            }
        }
        for(int i = 0; i < matrix[0].length; i++){
            if (matrix[0][i] == 0){
                for(int j = 1; j < matrix.length; j++){
                    matrix[j][i] = 0;
                }
            }
        }

        for(int i = 0; i < matrix.length; i++){
            if (matrix[i][0] == 0){
                for(int j = 1;j < matrix[i].length; j++){
                    matrix[i][j] = 0;
                }
            }
        }
        if(isFirstRowZero){
            for(int i = 0; i < matrix[0].length; i++ ){
               matrix[0][i] = 0; 
            }
        }
        if(isFirstColumZero){
            for(int i = 0; i < matrix.length; i++ ){
               matrix[i][0] = 0; 
            }
        }

    }
}
class Solution {
    public void setZeroes(int[][] matrix) {
          int m=matrix.length;
        int n=matrix[0].length;
        boolean row0=false,cow0=false;
        //因为第一行和第一列被征用了,所以原始状态需要提前记录下来
        for(int i=0;i<m;i++){//首列
            if(matrix[i][0]==0) cow0=true;
        }
        for(int j=0;j<n;j++){//首行
            if(matrix[0][j]==0) row0=true;
        }
        for(int i=1;i<m;i++){
            for(int j=1;j<n;j++){
                if(matrix[i][j]==0){//第i行,第j列都需要置零,所以把首列第i行和首行第j列标记上
                    matrix[i][0]=0;
                    matrix[0][j]=0;
                }
            }
        }
        for(int i=1;i<m;i++){
            if(matrix[i][0]==0) matrix[i]=new int[n];
        }
        for(int j=1;j<n;j++){
            if(matrix[0][j]==0){
                for(int i=0;i<m;i++) matrix[i][j]=0;
            }
        }
        if(row0) matrix[0]=new int[n];
        if(cow0){
            for(int i=0;i<m;i++) matrix[i][0]=0;
        }
    }
}

真是他妈的玄学

你可能感兴趣的:(剑指offer)