1
1
package com .fishercoder .solutions ;
2
2
3
- /**Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.
3
+ /**
4
+ * 73. Set Matrix Zeroes
5
+ *
6
+ * Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.
4
7
5
8
Follow up:
6
9
Did you use extra space?
@@ -10,25 +13,117 @@ A simple improvement uses O(m + n) space, but still not the best solution.
10
13
11
14
*/
12
15
public class _73 {
13
- //this is the most straightforward solution which uses O(mn) space
14
- public void setZeroes (int [][] matrix ) {
15
- if (matrix == null || matrix .length == 0 ) return ;
16
- int height = matrix .length , width = matrix [0 ].length ;
17
- boolean [][] zero = new boolean [height ][width ];
18
- for (int i = 0 ; i < height ; i ++){
19
- for (int j = 0 ; j < width ; j ++){
20
- if (matrix [i ][j ] == 0 ) zero [i ][j ] = true ;
16
+
17
+ public static class Solution1 {
18
+ /**
19
+ * Space: O(m*n)
20
+ */
21
+ public void setZeroes (int [][] matrix ) {
22
+ if (matrix == null || matrix .length == 0 ) return ;
23
+ int height = matrix .length , width = matrix [0 ].length ;
24
+ boolean [][] zero = new boolean [height ][width ];
25
+ for (int i = 0 ; i < height ; i ++) {
26
+ for (int j = 0 ; j < width ; j ++) {
27
+ if (matrix [i ][j ] == 0 ) {
28
+ zero [i ][j ] = true ;
29
+ }
30
+ }
31
+ }
32
+ for (int i = 0 ; i < height ; i ++) {
33
+ for (int j = 0 ; j < width ; j ++) {
34
+ if (zero [i ][j ]) {
35
+ for (int k = 0 ; k < height ; k ++) {
36
+ matrix [k ][j ] = 0 ;
37
+ }
38
+ for (int k = 0 ; k < width ; k ++) {
39
+ matrix [i ][k ] = 0 ;
40
+ }
41
+ }
42
+ }
21
43
}
22
44
}
23
- for (int i = 0 ; i < height ; i ++){
24
- for (int j = 0 ; j < width ; j ++){
25
- if (zero [i ][j ]){
26
- for (int k = 0 ; k < height ; k ++) matrix [k ][j ] = 0 ;
27
- for (int k = 0 ; k < width ; k ++) matrix [i ][k ] = 0 ;
45
+ }
46
+
47
+ public static class Solution2 {
48
+ /**
49
+ * Space: O(m+n)
50
+ */
51
+ public void setZeroes (int [][] matrix ) {
52
+ if (matrix == null || matrix .length == 0 ) {
53
+ return ;
54
+ }
55
+ int m = matrix .length ;
56
+ int n = matrix [0 ].length ;
57
+ boolean [] row = new boolean [m ];
58
+ boolean [] col = new boolean [n ];
59
+ for (int i = 0 ; i < m ; i ++) {
60
+ for (int j = 0 ; j < n ; j ++) {
61
+ if (matrix [i ][j ] == 0 ) {
62
+ row [i ] = true ;
63
+ col [j ] = true ;
64
+ }
65
+ }
66
+ }
67
+
68
+ for (int i = 0 ; i < m ; i ++) {
69
+ for (int j = 0 ; j < n ; j ++) {
70
+ if (row [i ] && col [j ]) {
71
+ for (int k = 0 ; k < m ; k ++) {
72
+ matrix [k ][j ] = 0 ;
73
+ }
74
+ for (int k = 0 ; k < n ; k ++) {
75
+ matrix [i ][k ] = 0 ;
76
+ }
77
+ }
28
78
}
29
79
}
30
80
}
31
81
}
32
82
33
- //TODO: use better solutions
83
+ public static class Solution3 {
84
+ /**
85
+ * Space: O(1)
86
+ */
87
+ public void setZeroes (int [][] matrix ) {
88
+ if (matrix == null || matrix .length == 0 ) return ;
89
+ int m = matrix .length ;
90
+ int n = matrix [0 ].length ;
91
+ boolean firstRow = false ;
92
+ boolean firstCol = false ;
93
+ for (int i = 0 ; i < m ; i ++) {
94
+ for (int j = 0 ; j < n ; j ++) {
95
+ if (matrix [i ][j ] == 0 ) {
96
+ if (i == 0 ) {
97
+ firstRow = true ;
98
+ }
99
+ if (j == 0 ) {
100
+ firstCol = true ;
101
+ }
102
+ matrix [i ][0 ] = 0 ;
103
+ matrix [0 ][j ] = 0 ;
104
+ }
105
+ }
106
+ }
107
+
108
+ for (int i = 1 ; i < m ; i ++) {
109
+ for (int j = 1 ; j < n ; j ++) {
110
+ if (matrix [i ][0 ] == 0 || matrix [0 ][j ] == 0 ) {
111
+ matrix [i ][j ] = 0 ;
112
+ }
113
+ }
114
+ }
115
+
116
+ if (firstRow ) {
117
+ for (int j = 0 ; j < n ; j ++) {
118
+ matrix [0 ][j ] = 0 ;
119
+ }
120
+ }
121
+
122
+ if (firstCol ) {
123
+ for (int i = 0 ; i < m ; i ++) {
124
+ matrix [i ][0 ] = 0 ;
125
+ }
126
+ }
127
+ }
128
+ }
34
129
}
0 commit comments