LeetCode - 73. Set Matrix Zeros

来源:互联网 发布:淘宝警用伸缩警棍价格 编辑:程序博客网 时间:2024/06/02 19:24

参考CC 150 1.7

一开始看起来这道题好像是很简单,遍历整个矩阵,发现0元素之后就将这个元素所在的行和列都设置成0,但是这样做的是错的,因为在读取被清零的行或者列的时候,读到的都是0,很快整个矩阵的所有元素都会变成0。

避开上面问题的方法是新建一个矩阵标记0元素的位置,然后在第二次遍历的时候将0元素所在的行和列清零,这种方法的空间复杂度是O(MN)。但是仔细想一下,我们实际上并不需要这么多的空间,因为我们既然准备将整行和整列设置为0,那么并不需要记录它是matrix[2][4]之类的,只需要知道第二行有个元素是0,第4列有个元素是0即可。不论怎样,整行/列都是要清零的。所以我们采用两个数组分别记录包含零元素的所有行和列,然后在第二次遍历矩阵的时候,如果所在的行或者列已经被标记为0,那么将这个元素设置为0,空间复杂度为O(M + N),代码如下:

public class Solution{    public void setZeros(int[][] matrix){        if(matrix == null || matrix.length == 0 || matrix[0].length == 0){            return;        }        boolean[] row = new boolean[matrix.length];        boolean[] column = new boolean[matrix[0].length];        // Record the row and column indexes of 0 element        for(int i = 0; i < matrix.length; i++){            for(int j = 0; j < matrix[0].length; j++){                if(matrix[i][j] == 0){                    row[i] = true;                    column[j] = true;                }            }        }        // If row[i] or column[j] is 0, set matrix[i][j] 0        for(int i = 0; i < matrix.length; i++){            for(int j = 0; j < matrix[0].length; j++){                if(row[i] || column[j]){                    matrix[i][j] = 0;                }            }        }    }}


0 0
原创粉丝点击