美文网首页
73. Set Matrix Zeroes

73. Set Matrix Zeroes

作者: 衣介书生 | 来源:发表于2018-04-13 20:08 被阅读11次

    题目分析

    Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.

    代码

    先找出所有的为 0 的元素的坐标,然后再统一置 0,时间复杂度 O(m * n),空间复杂度 O(m + n)

    class Solution {
        public void setZeroes(int[][] matrix) {
            if(matrix == null || matrix.length == 0) return;
            boolean[] rows = new boolean[matrix.length];
            boolean[] columns = new boolean[matrix[0].length];
            for(int i = 0; i < matrix.length; i++) {
                for(int j = 0; j < matrix[i].length; j++) {
                    if(matrix[i][j] == 0) {
                        rows[i] = true;
                        columns[j] = true;
                    }
                }
            }
            for(int i = 0; i < rows.length; i++) {
                if(rows[i]) {
                    for(int j = 0; j < matrix[i].length; j++) {
                        matrix[i][j] = 0;
                    }
                }
            }
            for(int j = 0; j < columns.length; j++) {
                if(columns[j]) {
                    for(int i = 0; i < matrix.length; i++) {
                        matrix[i][j] = 0;
                    }
                }
            }
        }
    }
    

    代码二

    时间复杂度 O(m * n),空间复杂度 O(1)

    class Solution {
        public void setZeroes(int[][] matrix) {
            if(matrix == null || matrix.length == 0) return;
            // 单独用两个变量标记第一行和第一列是不是需要设为 0
            boolean row = false;
            boolean column = false;
            for(int i = 0; i < matrix.length; i++) {
                for(int j = 0; j < matrix[i].length; j++) {
                    if(matrix[i][j] == 0) {
                        matrix[i][0] = 0;  // 每行的第一个元素标记该行是不是需要设为 0
                        matrix[0][j] = 0;  // 第一个行的每个元素标记该列是不是需要设为 0
                        if(i == 0) row = true;
                        if(j == 0) column = true;
                    }
                }
            }
            
            // 注意应该从 1 开始
            for(int i = 1; i < matrix.length; i++) {
                if(matrix[i][0] == 0) {
                    for(int j = 0; j < matrix[i].length; j++) {
                        matrix[i][j] = 0;
                    }
                }
            }
            
            // 注意应该从 1 开始
            for(int j = 1; j < matrix[0].length; j++) {
                if(matrix[0][j] == 0) {
                    for(int i = 0; i < matrix.length; i++) {
                        matrix[i][j] = 0;
                    }
                }
            }
            if(row) {
                for(int j = 0; j < matrix[0].length; j++) {
                    matrix[0][j] = 0;
                }
            }
             if(column) {
                for(int i = 0; i < matrix.length; i++) {
                    matrix[i][0] = 0;
                }
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:73. Set Matrix Zeroes

          本文链接:https://www.haomeiwen.com/subject/juehkftx.html