2014年11月28日星期五

[Leetcode] 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.
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?

A naive way is to use extra array to record whether the row or the column should be set to zero or not. We could use the first column and first row of the matrix to do so. The time complexity would be O(mn) and space complexity would be O(1).


    public void setZeroes(int[][] matrix) {
        int m = matrix.length;
        if(m == 0)
            return; // corner case
        int n = matrix[0].length;
        boolean row = false, col = false; // check the first row and column
        for(int i = 0; i < m; i++) {
            if(matrix[i][0] == 0)
                col = true;
        }
        for(int i = 0; i < n; i++) {
            if(matrix[0][i] == 0)
                row = true;
        }
        // check each row and column and store the information int the first row and column
        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;
                }
            }
        }
        // set the matrix
        for(int i = 1; i < m; i++) {
            if(matrix[i][0] == 0) {
                for(int j = 0; j < n; j++)
                    matrix[i][j] = 0;
            }
        }
        for(int i = 1; i < n; i++) {
            if(matrix[0][i] == 0) {
                for(int j = 0; j < m; j++)
                    matrix[j][i] = 0;
            }
        }
        if(row == true) {
            for(int i = 0; i < n; i++)
                matrix[0][i] = 0;
        }
        if(col == true) {
            for(int i = 0; i < m; i++) 
                matrix[i][0] = 0;
        }
    }

没有评论:

发表评论