Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.
这道题和之前的Game of Live有些不一样,区别在于,之前那道题目只有两种状态,即矩阵只有0和1两种,并且只和与它相临的八个点发生关系。而这道题矩阵里面的数字是随机的,因此不可以用位操作来做了。看了discussion,可以将矩阵某点为0的点的行列的起点都设为0,这个时候就只要处理行为0,列为0还有特殊点(0,0)的情况就行了,行为0也可以这么设置,而列为0的时候需要设一个变量来表示该列是否需要全为0.本题关键在于遍历的顺序,设置为0的时候可以用正常顺序,而行列赋值为0的时候就需要从后往前了,因为这样一次遍历就可以全部遍历到,而如果是正常顺序就是还要考虑列为0的情况,列为0的情况必须最后考虑,代码如下:
1 public class Solution { 2 public void setZeroes(int[][] matrix) { 3 int col0 = 1; 4 int m = matrix.length; 5 int n =matrix[0].length; 6 for(int i=0;i<m;i++){ 7 if(matrix[i][0]==0) col0 = 0; 8 for(int j=1;j<n;j++){ 9 if(matrix[i][j]==0){ 10 matrix[i][0] = 0; 11 matrix[0][j] = 0; 12 } 13 } 14 } 15 for(int i=m-1;i>=0;i--){ 16 for(int j=n-1;j>0;j--){ 17 if(matrix[i][0]==0||matrix[0][j]==0) matrix[i][j] = 0; 18 } 19 if(col0==0) matrix[i][0] = 0; 20 } 21 } 22 }