[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.

click to show follow up.

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 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 }

 

posted @ 2014-11-30 09:24  Phoebe815  阅读(148)  评论(0编辑  收藏  举报