@@ -73,18 +73,15 @@ Hence the result is [0,0].
73
73
74
74
## Solutions
75
75
76
+ Union find.
77
+
76
78
<!-- tabs:start -->
77
79
78
80
### ** Python3**
79
81
80
82
``` python
81
83
class Solution :
82
84
def hitBricks (self , grid : List[List[int ]], hits : List[List[int ]]) -> List[int ]:
83
- m, n = len (grid), len (grid[0 ])
84
- p = list (range (m * n + 1 ))
85
- size = [1 ] * len (p)
86
- g = [[grid[i][j] for j in range (n)] for i in range (m)]
87
-
88
85
def find (x ):
89
86
if p[x] != x:
90
87
p[x] = find(p[x])
@@ -96,16 +93,15 @@ class Solution:
96
93
size[pb] += size[pa]
97
94
p[pa] = pb
98
95
99
- def check (i , j ):
100
- return 0 <= i < m and 0 <= j < n and g[i][j] == 1
101
-
96
+ m, n = len (grid), len (grid[0 ])
97
+ p = list (range (m * n + 1 ))
98
+ size = [1 ] * len (p)
99
+ g = deepcopy(grid)
102
100
for i, j in hits:
103
101
g[i][j] = 0
104
-
105
102
for j in range (n):
106
103
if g[0 ][j] == 1 :
107
104
union(j, m * n)
108
-
109
105
for i in range (1 , m):
110
106
for j in range (n):
111
107
if g[i][j] == 0 :
@@ -114,22 +110,22 @@ class Solution:
114
110
union(i * n + j, (i - 1 ) * n + j)
115
111
if j > 0 and g[i][j - 1 ] == 1 :
116
112
union(i * n + j, i * n + j - 1 )
117
-
118
- res = []
113
+ ans = []
119
114
for i, j in hits[::- 1 ]:
120
115
if grid[i][j] == 0 :
121
- res .append(0 )
116
+ ans .append(0 )
122
117
continue
123
- origin = size[find(m * n)]
118
+ g[i][j] = 1
119
+ prev = size[find(m * n)]
124
120
if i == 0 :
125
121
union(j, m * n)
126
- for x, y in [(- 1 , 0 ), (1 , 0 ), (0 , 1 ), (0 , - 1 )]:
127
- if check( i + x , j + y):
128
- union(i * n + j, (i + x) * n + (j + y))
129
- cur = size[find(m * n)]
130
- res.append( max ( 0 , cur - origin - 1 ))
131
- g[i][j] = 1
132
- return res [::- 1 ]
122
+ for a, b in [(- 1 , 0 ), (1 , 0 ), (0 , 1 ), (0 , - 1 )]:
123
+ x, y = i + a , j + b
124
+ if 0 <= x < m and 0 <= y < n and g[x][y] == 1 :
125
+ union(i * n + j, x * n + y)
126
+ curr = size[find(m * n)]
127
+ ans.append( max ( 0 , curr - prev - 1 ))
128
+ return ans [::- 1 ]
133
129
```
134
130
135
131
### ** Java**
@@ -138,28 +134,24 @@ class Solution:
138
134
class Solution {
139
135
private int [] p;
140
136
private int [] size;
141
- private int [][] g;
142
- private int m;
143
- private int n;
144
- private int [][] dirs = new int [][]{{0 , - 1 }, {0 , 1 }, {1 , 0 }, {- 1 , 0 }};
145
137
146
138
public int [] hitBricks (int [][] grid , int [][] hits ) {
147
- m = grid. length;
148
- n = grid[0 ]. length;
139
+ int m = grid. length;
140
+ int n = grid[0 ]. length;
149
141
p = new int [m * n + 1 ];
150
142
size = new int [m * n + 1 ];
151
143
for (int i = 0 ; i < p. length; ++ i) {
152
144
p[i] = i;
153
145
size[i] = 1 ;
154
146
}
155
- g = new int [m][n];
147
+ int [][] g = new int [m][n];
156
148
for (int i = 0 ; i < m; ++ i) {
157
149
for (int j = 0 ; j < n; ++ j) {
158
150
g[i][j] = grid[i][j];
159
151
}
160
152
}
161
- for (int [] e : hits) {
162
- g[e [0 ]][e [1 ]] = 0 ;
153
+ for (int [] h : hits) {
154
+ g[h [0 ]][h [1 ]] = 0 ;
163
155
}
164
156
for (int j = 0 ; j < n; ++ j) {
165
157
if (g[0 ][j] == 1 ) {
@@ -179,26 +171,30 @@ class Solution {
179
171
}
180
172
}
181
173
}
182
- int [] res = new int [hits. length];
174
+ int [] ans = new int [hits. length];
175
+ int [] dirs = {- 1 , 0 , 1 , 0 , - 1 };
183
176
for (int k = hits. length - 1 ; k >= 0 ; -- k) {
184
- int i = hits[k][0 ], j = hits[k][1 ];
177
+ int i = hits[k][0 ];
178
+ int j = hits[k][1 ];
185
179
if (grid[i][j] == 0 ) {
186
180
continue ;
187
181
}
188
- int origin = size[find(m * n)];
182
+ g[i][j] = 1 ;
183
+ int prev = size[find(m * n)];
189
184
if (i == 0 ) {
190
185
union(j, m * n);
191
186
}
192
- for (int [] e : dirs) {
193
- if (check(i + e[0 ], j + e[1 ])) {
194
- union(i * n + j, (i + e[0 ]) * n + j + e[1 ]);
187
+ for (int l = 0 ; l < 4 ; ++ l) {
188
+ int x = i + dirs[l];
189
+ int y = j + dirs[l + 1 ];
190
+ if (x >= 0 && x < m && y >= 0 && y < n && g[x][y] == 1 ) {
191
+ union(i * n + j, x * n + y);
195
192
}
196
193
}
197
- int cur = size[find(m * n)];
198
- res[k] = Math . max(0 , cur - origin - 1 );
199
- g[i][j] = 1 ;
194
+ int curr = size[find(m * n)];
195
+ ans[k] = Math . max(0 , curr - prev - 1 );
200
196
}
201
- return res ;
197
+ return ans ;
202
198
}
203
199
204
200
private int find (int x ) {
@@ -209,16 +205,13 @@ class Solution {
209
205
}
210
206
211
207
private void union (int a , int b ) {
212
- int pa = find(a), pb = find(b);
208
+ int pa = find(a);
209
+ int pb = find(b);
213
210
if (pa != pb) {
214
211
size[pb] += size[pa];
215
212
p[pa] = pb;
216
213
}
217
214
}
218
-
219
- private boolean check (int i , int j ) {
220
- return i >= 0 && i < m && j >= 0 && j < n && g[i][j] == 1 ;
221
- }
222
215
}
223
216
```
224
217
@@ -229,22 +222,21 @@ class Solution {
229
222
public:
230
223
vector<int > p;
231
224
vector<int > size;
232
- vector<vector<int >> g;
233
- int m;
234
- int n;
235
- int dirs[ 4] [ 2 ] = {{0, -1}, {0, 1}, {1, 0}, {-1, 0}};
236
225
237
226
vector<int> hitBricks(vector<vector<int>>& grid, vector<vector<int>>& hits) {
238
- m = grid.size();
239
- n = grid[0].size();
240
- for (int i = 0; i < m * n + 1; ++i)
227
+ int m = grid.size(), n = grid[0].size();
228
+ p.resize(m * n + 1);
229
+ size.resize(m * n + 1);
230
+ for (int i = 0; i < p.size(); ++i)
241
231
{
242
- p.push_back(i) ;
243
- size.push_back(1) ;
232
+ p[i] = i ;
233
+ size[i] = 1 ;
244
234
}
245
- g = grid;
246
- for (auto e : hits)
247
- g[e[0 ]][e[1 ]] = 0 ;
235
+ vector<vector<int >> g (m, vector<int >(n));
236
+ for (int i = 0; i < m; ++i)
237
+ for (int j = 0; j < n; ++j)
238
+ g[ i] [ j ] = grid[ i] [ j ] ;
239
+ for (auto& h : hits) g[ h[ 0]] [ h[ 1]] = 0;
248
240
for (int j = 0; j < n; ++j)
249
241
if (g[ 0] [ j ] == 1)
250
242
merge(j, m * n);
@@ -257,22 +249,25 @@ public:
257
249
if (j > 0 && g[ i] [ j - 1 ] == 1) merge(i * n + j, i * n + j - 1);
258
250
}
259
251
}
260
- vector<int > res(hits.size());
252
+ vector<int > ans(hits.size());
253
+ vector<int > dirs = {-1, 0, 1, 0, -1};
261
254
for (int k = hits.size() - 1; k >= 0; --k)
262
255
{
263
256
int i = hits[ k] [ 0 ] , j = hits[ k] [ 1 ] ;
264
257
if (grid[ i] [ j ] == 0) continue;
265
- int origin = size[ find(m * n)] ;
266
- if (i == 0)
267
- merge(j, m * n);
268
- for (auto dir : dirs)
269
- if (check(i + dir[ 0] , j + dir[ 1] ))
270
- merge(i * n + j, ((i + dir[ 0] ) * n + j + dir[ 1] ));
271
- int cur = size[ find(m * n)] ;
272
- res[ k] = max(0, cur - origin - 1);
273
258
g[ i] [ j ] = 1;
259
+ int prev = size[ find(m * n)] ;
260
+ if (i == 0) merge(j, m * n);
261
+ for (int l = 0; l < 4; ++l)
262
+ {
263
+ int x = i + dirs[ l] , y = j + dirs[ l + 1] ;
264
+ if (x >= 0 && x < m && y >= 0 && y < n && g[ x] [ y ] == 1)
265
+ merge(i * n + j, x * n + y);
266
+ }
267
+ int curr = size[ find(m * n)] ;
268
+ ans[ k] = max(0, curr - prev - 1);
274
269
}
275
- return res ;
270
+ return ans ;
276
271
}
277
272
278
273
int find(int x) {
@@ -288,42 +283,48 @@ public:
288
283
p[pa] = pb;
289
284
}
290
285
}
291
-
292
- bool check(int i, int j) {
293
- return i >= 0 && i < m && j >= 0 && j < n && g[i][j] == 1;
294
- }
295
286
};
296
287
```
297
288
298
289
### **Go**
299
290
300
291
```go
301
- var p []int
302
- var size []int
303
- var g [][]int
304
- var m int
305
- var n int
306
-
307
292
func hitBricks(grid [][]int, hits [][]int) []int {
308
- m, n = len(grid), len(grid[0])
309
- p = make([]int, m*n+1)
310
- size = make([]int, m*n+1 )
311
- for i := 0; i < len(p); i++ {
293
+ m, n : = len(grid), len(grid[0])
294
+ p : = make([]int, m*n+1)
295
+ size : = make([]int, len(p) )
296
+ for i := range p {
312
297
p[i] = i
313
298
size[i] = 1
314
299
}
315
- g = make([][]int, m)
316
- for i := 0; i < m; i++ {
300
+
301
+ var find func(x int) int
302
+ find = func(x int) int {
303
+ if p[x] != x {
304
+ p[x] = find(p[x])
305
+ }
306
+ return p[x]
307
+ }
308
+ union := func(a, b int) {
309
+ pa, pb := find(a), find(b)
310
+ if pa != pb {
311
+ size[pb] += size[pa]
312
+ p[pa] = pb
313
+ }
314
+ }
315
+
316
+ g := make([][]int, m)
317
+ for i := range g {
317
318
g[i] = make([]int, n)
318
- for j := 0; j < n; j++ {
319
+ for j := range g[i] {
319
320
g[i][j] = grid[i][j]
320
321
}
321
322
}
322
- for _, e := range hits {
323
- g[e [0]][e [1]] = 0
323
+ for _, h := range hits {
324
+ g[h [0]][h [1]] = 0
324
325
}
325
- for j := 0; j < n; j++ {
326
- if g[0][j] == 1 {
326
+ for j, v := range g[0] {
327
+ if v == 1 {
327
328
union(j, m*n)
328
329
}
329
330
}
@@ -340,47 +341,28 @@ func hitBricks(grid [][]int, hits [][]int) []int {
340
341
}
341
342
}
342
343
}
343
-
344
- res := make([]int, len(hits))
345
- dirs := [4][2]int{{0, -1}, {0, 1}, {1, 0}, {-1, 0}}
344
+ ans := make([]int, len(hits))
345
+ dirs := []int{-1, 0, 1, 0, -1}
346
346
for k := len(hits) - 1; k >= 0; k-- {
347
347
i, j := hits[k][0], hits[k][1]
348
348
if grid[i][j] == 0 {
349
349
continue
350
350
}
351
- origin := size[find(m*n)]
351
+ g[i][j] = 1
352
+ prev := size[find(m*n)]
352
353
if i == 0 {
353
354
union(j, m*n)
354
355
}
355
- for _, dir := range dirs {
356
- if check(i+dir[0], j+dir[1]) {
357
- union(i*n+j, (i+dir[0])*n+j+dir[1])
356
+ for l := 0; l < 4; l++ {
357
+ x, y := i+dirs[l], j+dirs[l+1]
358
+ if x >= 0 && x < m && y >= 0 && y < n && g[x][y] == 1 {
359
+ union(i*n+j, x*n+y)
358
360
}
359
361
}
360
- cur := size[find(m*n)]
361
- res[k] = max(0, cur-origin-1)
362
- g[i][j] = 1
363
- }
364
- return res
365
- }
366
-
367
- func find(x int) int {
368
- if p[x] != x {
369
- p[x] = find(p[x])
370
- }
371
- return p[x]
372
- }
373
-
374
- func union(a, b int) {
375
- pa, pb := find(a), find(b)
376
- if pa != pb {
377
- size[pb] += size[pa]
378
- p[pa] = pb
362
+ curr := size[find(m*n)]
363
+ ans[k] = max(0, curr-prev-1)
379
364
}
380
- }
381
-
382
- func check(i, j int) bool {
383
- return i >= 0 && i < m && j >= 0 && j < n && g[i][j] == 1
365
+ return ans
384
366
}
385
367
386
368
func max(a, b int) int {
0 commit comments