[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?
Solution 1:
利用矩阵的第一行和第一列来作为辅助空间使用。不用开辟新的存储空间。方法就是:
1.先确定第一行和第一列是否需要清零
即,看看第一行中是否有0,记下来。也同时记下来第一列中有没有0。
2.扫描剩下的矩阵元素,如果遇到了0,就将对应的第一行和第一列上的元素赋值为0
这里不用担心会将本来第一行或第一列的1改成了0,因为这些值最后注定要成为0的。
3.根据第一行和第一列的信息,已经可以将剩下的矩阵元素赋值为结果所需的值了
即,拿第一行为例,如果扫描到一个0,就将这一列都清0.
4.根据1中确定的状态,处理第一行和第一列。
如果最开始得到的第一行中有0的话,就整行清零。同理对列进行处理。
1.先确定第一行和第一列是否需要清零
即,看看第一行中是否有0,记下来。也同时记下来第一列中有没有0。
2.扫描剩下的矩阵元素,如果遇到了0,就将对应的第一行和第一列上的元素赋值为0
这里不用担心会将本来第一行或第一列的1改成了0,因为这些值最后注定要成为0的。
3.根据第一行和第一列的信息,已经可以将剩下的矩阵元素赋值为结果所需的值了
即,拿第一行为例,如果扫描到一个0,就将这一列都清0.
4.根据1中确定的状态,处理第一行和第一列。
如果最开始得到的第一行中有0的话,就整行清零。同理对列进行处理。
1 public class Solution { 2 public void setZeroes(int[][] matrix) { 3 if(matrix==null) 4 return; 5 if(matrix[0]==null) 6 return; 7 int m=matrix.length; 8 int n=matrix[0].length; 9 boolean col=false; 10 boolean row=false; 11 for(int i=0;i<m;++i){ 12 if(matrix[i][0]==0){ 13 col=true; 14 break; 15 } 16 } 17 for(int i=0;i<n;++i){ 18 if(matrix[0][i]==0){ 19 row=true; 20 break; 21 } 22 } 23 for(int i=1;i<m;++i){ 24 for(int j=1;j<n;++j){ 25 if(matrix[i][j]==0){ 26 matrix[0][j]=0; 27 matrix[i][0]=0; 28 } 29 } 30 } 31 for(int i=1;i<n;++i){ 32 if(matrix[0][i]==0){ 33 for(int j=1;j<m;++j){ 34 matrix[j][i]=0; 35 } 36 } 37 } 38 for(int i=1;i<m;++i){ 39 if(matrix[i][0]==0){ 40 for(int j=1;j<n;++j){ 41 matrix[i][j]=0; 42 } 43 } 44 } 45 if(row){ 46 for(int i=0;i<n;++i) 47 matrix[0][i]=0; 48 } 49 if(col){ 50 for(int j=0;j<m;++j){ 51 matrix[j][0]=0; 52 } 53 } 54 } 55 }
Solution 2:
1 public class Solution { 2 public void setZeroes(int[][] matrix) { 3 if(matrix==null) 4 return; 5 if(matrix[0]==null) 6 return; 7 int[] row=new int[matrix.length]; 8 int[] col=new int[matrix[0].length]; 9 for(int i=0;i<matrix.length;++i){ 10 for(int j=0;j<matrix[0].length;++j){ 11 if(matrix[i][j]==0){ 12 row[i]=-1; 13 col[j]=-1; 14 } 15 } 16 } 17 for(int i=0;i<matrix.length;++i){ 18 for(int j=0;j<matrix[0].length;++j){ 19 if(row[i]==-1||col[j]==-1){ 20 matrix[i][j]=0; 21 } 22 } 23 } 24 } 25 }