@@ -138,5 +138,85 @@ public int top() {
138138 return sz [find (sz .length - 1 )] - 1 ;
139139 }
140140 }
141+
142+
143+ /**
144+ * https://leetcode.com/problems/bricks-falling-when-hit/discuss/121072/Java-Solution
145+ */
146+ public int [] hitBricks2 (int [][] grid , int [][] hits ) {
147+ if (hits .length == 0 || hits [0 ].length == 0 ) return null ;
148+ removeHitBrick (grid , hits );
149+ markRemainBricks (grid );
150+ return searchFallingBrick (grid , hits );
151+ }
152+
153+ private void markRemainBricks (int [][] grid ) {
154+ for (int i = 0 ; i < grid [0 ].length ; i ++) {
155+ deepSearch (grid , 0 , i );
156+ }
157+ }
158+
159+ private void removeHitBrick (int [][] grid , int [][] hits ) {
160+ for (int i = 0 ; i < hits .length ; i ++) {
161+ grid [hits [i ][0 ]][hits [i ][1 ]] = grid [hits [i ][0 ]][hits [i ][1 ]] - 1 ;
162+ }
163+ }
164+
165+ private int [] searchFallingBrick (int [][] grid , int [][] hits ) {
166+ int [] result = new int [hits .length ];
167+ for (int i = hits .length - 1 ; i >= 0 ; i --) {
168+ if (grid [hits [i ][0 ]][hits [i ][1 ]] == 0 ) {
169+ grid [hits [i ][0 ]][hits [i ][1 ]] = 1 ;
170+ if (isConnectToTop (grid , hits [i ][0 ], hits [i ][1 ])) {
171+ result [i ] = deepSearch (grid , hits [i ][0 ], hits [i ][1 ]) - 1 ;
172+ } else {
173+ result [i ] = 0 ;
174+ }
175+ }
176+ }
177+ return result ;
178+ }
179+
180+ private boolean isConnectToTop (int [][] grid , int i , int j ) {
181+ if (i == 0 ) return true ;
182+
183+ if (i - 1 >= 0 && grid [i - 1 ][j ] == 2 ) {
184+ return true ;
185+ }
186+ if (i + 1 < grid .length && grid [i + 1 ][j ] == 2 ) {
187+ return true ;
188+ }
189+ if (j - 1 >= 0 && grid [i ][j - 1 ] == 2 ) {
190+ return true ;
191+ }
192+ if (j + 1 < grid [0 ].length && grid [i ][j + 1 ] == 2 ) {
193+ return true ;
194+ }
195+ return false ;
196+ }
197+
198+ private int deepSearch (int [][] data , int row , int column ) {
199+ int arrayRow = data .length ;
200+ int arrayLine = data [0 ].length ;
201+ int effectBricks = 0 ;
202+ if (row < 0 || row >= arrayRow ) return effectBricks ;
203+ if (column < 0 || column >= arrayLine ) return effectBricks ;
204+ if (data [row ][column ] == 1 ) {
205+ data [row ][column ] = 2 ;
206+ effectBricks = 1 ;
207+ effectBricks += deepSearch (data , row + 1 , column );
208+ effectBricks += deepSearch (data , row - 1 , column );
209+ effectBricks += deepSearch (data , row , column + 1 );
210+ effectBricks += deepSearch (data , row , column - 1 );
211+ }
212+ return effectBricks ;
213+ }
214+
215+
216+
217+
218+
219+
220+
141221}
142222
0 commit comments