Set Matrix Zeroes

  • 涉及到一整行一整列的状态时候,为了节省空间,可以直接考虑用第一行和第一列代表所有行和列的状态
  • 但是对于(0, 0)这个点,则有保存了两个值,第1行和第1列,此时考虑用col0这个var来保存第一列的状态
  • 实现的过程中,注意保证第一行和第一列的值不能被改变后再读取(必须先检测了),否则就不准确了。所以在循环中一定要注意什么时候取0,什么时候取1
  • 优化的解法可以在最后赋值的时候,从右下开始,这样就可以保证先把影响小的改了,不用担心0被设置了以后又被
public void setZeroes(int[][] matrix) {
        int row = matrix.length;
        int col = matrix[0].length;
        int col0 = matrix[0][0];

        for (int i = 0; i < col; i++) {
            if (matrix[0][i] == 0) {
                matrix[0][0] = 0;
                break;
            }                
        }

        for (int i = 1; i < row; i++) {
            if (matrix[i][0] == 0) {
                col0 = 0;
                break;
            }                
        }

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

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

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

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

        if(col0 == 0) {
            for (int i = 0; i < row; i++)
                matrix[i][0] = 0;
        }
    }

    //best solution  
    for (int i = 0; i < row; i++) {
        if (matrix[i][0] == 0) col0 = 0;
        for (int j = 1; j < col; j++) {
            if (matrix[i][j] == 0) {                    
                matrix[0][j] = 0;
                matrix[i][0] = 0;
            }
        }            
    }

    for (int i = row - 1; i >= 0; i--) {
        for (int j = col - 1; j >= 1; j--) {
            if (matrix[i][0] == 0 || matrix[0][j] == 0)
                matrix[i][j] = 0;                
        }
        if (col0 == 0) 
            matrix[i][0] = 0;
    }

results matching ""

    No results matching ""