803 打磚塊 並查集,要學會建立連通關係

2021-10-16 09:39:27 字數 2603 閱讀 6718

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 ...