Skip to content

Commit f6aeec6

Browse files
committed
feat: update solutions to lc problem: No.0803
No.0803.Bricks Falling When Hit
1 parent 0da0027 commit f6aeec6

File tree

15 files changed

+562
-401
lines changed

15 files changed

+562
-401
lines changed

solution/0800-0899/0803.Bricks Falling When Hit/README.md

+174-133
Large diffs are not rendered by default.

solution/0800-0899/0803.Bricks Falling When Hit/README_EN.md

+100-118
Original file line numberDiff line numberDiff line change
@@ -73,18 +73,15 @@ Hence the result is [0,0].
7373

7474
## Solutions
7575

76+
Union find.
77+
7678
<!-- tabs:start -->
7779

7880
### **Python3**
7981

8082
```python
8183
class Solution:
8284
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-
8885
def find(x):
8986
if p[x] != x:
9087
p[x] = find(p[x])
@@ -96,16 +93,15 @@ class Solution:
9693
size[pb] += size[pa]
9794
p[pa] = pb
9895

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)
102100
for i, j in hits:
103101
g[i][j] = 0
104-
105102
for j in range(n):
106103
if g[0][j] == 1:
107104
union(j, m * n)
108-
109105
for i in range(1, m):
110106
for j in range(n):
111107
if g[i][j] == 0:
@@ -114,22 +110,22 @@ class Solution:
114110
union(i * n + j, (i - 1) * n + j)
115111
if j > 0 and g[i][j - 1] == 1:
116112
union(i * n + j, i * n + j - 1)
117-
118-
res = []
113+
ans = []
119114
for i, j in hits[::-1]:
120115
if grid[i][j] == 0:
121-
res.append(0)
116+
ans.append(0)
122117
continue
123-
origin = size[find(m * n)]
118+
g[i][j] = 1
119+
prev = size[find(m * n)]
124120
if i == 0:
125121
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]
133129
```
134130

135131
### **Java**
@@ -138,28 +134,24 @@ class Solution:
138134
class Solution {
139135
private int[] p;
140136
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}};
145137

146138
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;
149141
p = new int[m * n + 1];
150142
size = new int[m * n + 1];
151143
for (int i = 0; i < p.length; ++i) {
152144
p[i] = i;
153145
size[i] = 1;
154146
}
155-
g = new int[m][n];
147+
int[][] g = new int[m][n];
156148
for (int i = 0; i < m; ++i) {
157149
for (int j = 0; j < n; ++j) {
158150
g[i][j] = grid[i][j];
159151
}
160152
}
161-
for (int[] e : hits) {
162-
g[e[0]][e[1]] = 0;
153+
for (int[] h : hits) {
154+
g[h[0]][h[1]] = 0;
163155
}
164156
for (int j = 0; j < n; ++j) {
165157
if (g[0][j] == 1) {
@@ -179,26 +171,30 @@ class Solution {
179171
}
180172
}
181173
}
182-
int[] res = new int[hits.length];
174+
int[] ans = new int[hits.length];
175+
int[] dirs = {-1, 0, 1, 0, -1};
183176
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];
185179
if (grid[i][j] == 0) {
186180
continue;
187181
}
188-
int origin = size[find(m * n)];
182+
g[i][j] = 1;
183+
int prev = size[find(m * n)];
189184
if (i == 0) {
190185
union(j, m * n);
191186
}
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);
195192
}
196193
}
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);
200196
}
201-
return res;
197+
return ans;
202198
}
203199

204200
private int find(int x) {
@@ -209,16 +205,13 @@ class Solution {
209205
}
210206

211207
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);
213210
if (pa != pb) {
214211
size[pb] += size[pa];
215212
p[pa] = pb;
216213
}
217214
}
218-
219-
private boolean check(int i, int j) {
220-
return i >= 0 && i < m && j >= 0 && j < n && g[i][j] == 1;
221-
}
222215
}
223216
```
224217

@@ -229,22 +222,21 @@ class Solution {
229222
public:
230223
vector<int> p;
231224
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}};
236225

237226
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)
241231
{
242-
p.push_back(i);
243-
size.push_back(1);
232+
p[i] = i;
233+
size[i] = 1;
244234
}
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;
248240
for (int j = 0; j < n; ++j)
249241
if (g[0][j] == 1)
250242
merge(j, m * n);
@@ -257,22 +249,25 @@ public:
257249
if (j > 0 && g[i][j - 1] == 1) merge(i * n + j, i * n + j - 1);
258250
}
259251
}
260-
vector<int> res(hits.size());
252+
vector<int> ans(hits.size());
253+
vector<int> dirs = {-1, 0, 1, 0, -1};
261254
for (int k = hits.size() - 1; k >= 0; --k)
262255
{
263256
int i = hits[k][0], j = hits[k][1];
264257
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);
273258
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);
274269
}
275-
return res;
270+
return ans;
276271
}
277272

278273
int find(int x) {
@@ -288,42 +283,48 @@ public:
288283
p[pa] = pb;
289284
}
290285
}
291-
292-
bool check(int i, int j) {
293-
return i >= 0 && i < m && j >= 0 && j < n && g[i][j] == 1;
294-
}
295286
};
296287
```
297288
298289
### **Go**
299290
300291
```go
301-
var p []int
302-
var size []int
303-
var g [][]int
304-
var m int
305-
var n int
306-
307292
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 {
312297
p[i] = i
313298
size[i] = 1
314299
}
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 {
317318
g[i] = make([]int, n)
318-
for j := 0; j < n; j++ {
319+
for j := range g[i] {
319320
g[i][j] = grid[i][j]
320321
}
321322
}
322-
for _, e := range hits {
323-
g[e[0]][e[1]] = 0
323+
for _, h := range hits {
324+
g[h[0]][h[1]] = 0
324325
}
325-
for j := 0; j < n; j++ {
326-
if g[0][j] == 1 {
326+
for j, v := range g[0] {
327+
if v == 1 {
327328
union(j, m*n)
328329
}
329330
}
@@ -340,47 +341,28 @@ func hitBricks(grid [][]int, hits [][]int) []int {
340341
}
341342
}
342343
}
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}
346346
for k := len(hits) - 1; k >= 0; k-- {
347347
i, j := hits[k][0], hits[k][1]
348348
if grid[i][j] == 0 {
349349
continue
350350
}
351-
origin := size[find(m*n)]
351+
g[i][j] = 1
352+
prev := size[find(m*n)]
352353
if i == 0 {
353354
union(j, m*n)
354355
}
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)
358360
}
359361
}
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)
379364
}
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
384366
}
385367
386368
func max(a, b int) int {

0 commit comments

Comments
 (0)