题目描述: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]].append(s[0])
def find(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)