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.

题意:一个m*n的矩阵,如果某个位置值是0,把这个位置所在的行和列都变为0.

思路:考虑最后题目要求的是哪些行和列要变成0,所以可以用两个数组表示所有行和列,然后遍历一遍矩阵,看哪些位置的值是0,就把这个位置对应的行和列数组的标志置为1。

public void setZeroes(int[][] matrix) {
    if (matrix == null || matrix.length == 0) {
        return;
    }

    int m = matrix.length, n = matrix[0].length;
    int[] rows = new int[m];
    int[] cols = new int[n];
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            if (matrix[i][j] == 0) {
                rows[i] = 1;
                cols[j] = 1;
            }
        }
    }

    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            if (rows[i] == 1 || cols[j] == 1) {
                matrix[i][j] = 0;
            }
        }
    }
}

题目还有一个followup,即用常量的空间复杂度解决,自己没有想出来。看了discuss的解法,是借用传入数组的第一行和第一列做为标志数组,同时用变量fr和fc来记录第一行和第一列是否需要变化。

public void setZeroes1(int[][] matrix) {
    boolean fr = false,fc = false;
    for(int i = 0; i < matrix.length; i++) {
        for(int j = 0; j < matrix[0].length; j++) {
            if(matrix[i][j] == 0) {
                if(i == 0) fr = true;
                if(j == 0) fc = true;
                matrix[0][j] = 0;
                matrix[i][0] = 0;
            }
        }
    }
    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;
            }
        }
    }
    if(fr) {
        for(int j = 0; j < matrix[0].length; j++) {
            matrix[0][j] = 0;
        }
    }
    if(fc) {
        for(int i = 0; i < matrix.length; i++) {
            matrix[i][0] = 0;
        }
    }

}

你可能感兴趣的:(Leetcode 73. Set Matrix Zeroes)