題目描述: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 輸...