package com.heu.wsq.leetcode.bingchaji;
/** * 803. 打磚塊
* @author wsq
* @date 2021/1/16
* 有乙個 m x n 的二元網格,其中 1 表示磚塊,0 表示空白。磚塊 穩定(不會掉落)的前提是:
* 一塊磚直接連線到網格的頂部,或者
* 至少有一塊相鄰(4 個方向之一)磚塊 穩定 不會掉落時
* 給你乙個陣列 hits ,這是需要依次消除磚塊的位置。每當消除 hits[i] = (rowi, coli) 位置上的磚塊時,對應位置的磚塊(若存在)會消失,然後其他的磚塊可能因為這一消除操作而掉落。一旦磚塊掉落,它會立即從網格中消失(即,它不會落在其他穩定的磚塊上)。
* 返回乙個陣列 result ,其中 result[i] 表示第 i 次消除操作對應掉落的磚塊數目。
* 注意,消除可能指向是沒有磚塊的空白位置,如果發生這種情況,則沒有磚塊掉落。
* * 示例 1:
* 輸入:grid = [[1,0,0,0],[1,1,1,0]], hits = [[1,0]]
* 輸出:[2]
* 解釋:
* 網格開始為:
* [[1,0,0,0],
* [1,1,1,0]]
* 消除 (1,0) 處加粗的磚塊,得到網格:
* [[1,0,0,0]
* [0,1,1,0]]
* 兩個加粗的磚不再穩定,因為它們不再與頂部相連,也不再與另乙個穩定的磚相鄰,因此它們將掉落。得到網格:
* [[1,0,0,0],
* [0,0,0,0]]
* 因此,結果為 [2] 。
* */
public
class
hitbricks,,
,};public
int[
]hitbricks
(int
grid,
int[
] hits)
}for
(int
hit : hits)
// 2.建圖,將磚塊之間的連線關係輸入並查集
// size表示並查集的大小,同時也用於表示虛擬的屋頂結點
int size =
this
.rows *
this
.cols;
unionfind unionfind =
newunionfind
(size +1)
;//將下標為0的行磚塊與屋頂相連
for(
int i =
0; i <
this
.cols; i++)}
// 其餘網路,如果是磚塊,則向上、向左看一下,如果也是磚塊在並查集進行合併
for(
int i =
1; i <
this
.rows; i++)if
(j >
0&& copy[i]
[j -1]
==1)}
}}// 3. 按照hits的逆序,在copy中補回磚塊,並記錄每次補回磚塊導致與屋頂相連磚塊數量的變化。
int hitlen = hits.length;
int[
] res =
newint
[hitlen]
;for
(int i = hitlen -
1; i >=
0; i--
)int origin = unionfind.
getsize
(size);if
(x ==0)
for(
int[
] direction : directions)
}int current = unionfind.
getsize
(size)
; res[i]
= math.
max(
0, current - origin -1)
; copy[x]
[y]=1;
}return res;
}private
boolean
isarea
(int newx,
int newy)
private
intgetindex
(int i,
int j)
private
class
unionfind
}public
intfind
(int x)
return parent[x];}
public
void
union
(int x,
int y)
parent[rootx]
= rooty;
// 在合併的時候維護陣列 size
size[rooty]
+= size[rootx];}
public
intgetsize
(int x)
}}
LeetCode 803 打磚塊 困難
題目 803.打磚塊 有乙個 m x n 的二元網格,其中 1 表示磚塊,0 表示空白。磚塊 穩定 不會掉落 的前提是 一塊磚直接連線到網格的頂部,或者 至少有一塊相鄰 4 個方向之一 磚塊 穩定 不會掉落時 給你乙個陣列 hits 這是需要依次消除磚塊的位置。每當消除 hits i rowi,co...
每日一題 打磚塊 LeetCode803
如何計算每次擊碎磚塊而消失的磚塊數量 和頂部相連的磚塊不會掉落 擊碎乙個磚塊,可能使得其它與之連線的磚塊不再與頂部相連而消失 消失的磚塊數量 擊碎之前與頂部相連的磚塊數量 擊碎之後與頂部相連的磚塊數量 1 1就是直接被敲碎的那塊磚 並查集的按秩優化的秩即可以指當前子樹的高度rank,也可以指當前集合...
並查集 並查集
本文參考了 挑戰程式設計競賽 和jennica的github題解 陣列版 int parent max n int rank max n void init int n int find int x else void union int x,int y else 結構體版 struct node ...