947 移除最多的同行或同列石頭

2021-10-14 20:21:25 字數 1306 閱讀 1046

題目描述:n 塊石頭放置在二維平面中的一些整數座標點上。每個座標點上最多只能有一塊石頭。

如果一塊石頭的 同行或者同列 上有其他石頭存在,那麼就可以移除這塊石頭。

給你乙個長度為 n 的陣列 stones ,其中 stones[i] = [xi, yi] 表示第 i 塊石頭的位置,返回 可以移除的石子 的最大數量。

解題思路:其實這道題的本質是對乙個有向圖,求連通分量的數量,因為對每乙個聯通分量我們都可以按照dfs遍歷逆序的順序移除石子,讓這個連通分量只剩下乙個石子,求聯通分量我們可以用並查集來求,因為這裡的座標涉及到兩個維度,但並查集的查詢單元都是一維的,這裡我們按列考元素進行合併,因為最終剩下的元素都在不同行不同列,我們可以一開始就做乙個粗略的劃分,將同一行的元素放在乙個連通域內,用行座標表示所屬的連通域,這要我們只需要考慮每一列的元素,然後將他們所代表的行進行合併即可,**如下:

class

solution

:def

removestones

(self, stones: list[list[

int]])

->

int:

tabel =

from collections import defaultdict

g = defaultdict(

list

)for s in stones:

tabel[s[0]

]= s[0]

g[s[1]

]0])

deffind

(x):

root = x

while

(root != tabel[root]):

root = tabel[root]

while

(x != root)

: origin_r = tabel[x]

tabel[x]

= root

x = origin_r

return root

for k, v in g.items():

root = find(v[0]

)for i in v[1:

]:root_i = find(i)

if root != root_i:

tabel[root_i]

= root

vs =

set(

[find(v)

for v in tabel.keys()]

)return

len(stones)

-len

(vs)

947 移除最多的同行或同列石頭

在二維平面上,我們將石頭放置在一些整數座標點上。每個座標點上最多只能有一塊石頭。現在,move 操作將會移除與網格上的某一塊石頭共享一列或一行的一塊石頭。我們最多能執行多少次 move 操作?示例 1 輸入 stones 0,0 0,1 1,0 1,2 2,1 2,2 輸出 5示例 2 輸入 sto...

947 移除最多的同行或同列石頭

947.移除最多的同行或同列石頭 n塊石頭放置在二維平面中的一些整數座標點上。每個座標點上最多只能有一塊石頭。如果一塊石頭的同行或者同列上有其他石頭存在,那麼就可以移除這塊石頭。給你乙個長度為n的陣列stones,其中stones i xi,yi 表示第i塊石頭的位置,返回可以移除的石子的最大數量。...

947 移除最多的同行或同列石頭 並查集

n 塊石頭放置在二維平面中的一些整數座標點上。每個座標點上最多只能有一塊石頭。如果一塊石頭的 同行或者同列 上有其他石頭存在,那麼就可以移除這塊石頭。給你乙個長度為 n 的陣列 stones 其中 stones i xi,yi 表示第 i 塊石頭的位置,返回 可以移除的石子 的最大數量。示例 1 輸...