题目定位
共享邮箱定义了账户之间的连通关系,因此这题本质上是在把相关标识符分组成连通块,而不是逐行处理表格。
关键观察
真正的难点是把字符串邮箱映射到 DSU 节点,再按最终根节点聚合结果。
目标复杂度
O(n alpha(n)) / O(n)
这题的解法思路怎么拆
1
共享邮箱定义了账户之间的连通关系,因此这题本质上是在把相关标识符分组成连通块,而不是逐行处理表格。
2
真正的难点是把字符串邮箱映射到 DSU 节点,再按最终根节点聚合结果。
3
初始化时每个节点都是自己的父节点。
4
find 时做路径压缩,保证后续查询足够快。
参考实现
Python# Generic pattern template
class UnionFind:
def __init__(self, n):
self.parent = list(range(n))
self.rank = [0] * n
def find(self, x):
if self.parent[x] != x:
self.parent[x] = self.find(self.parent[x])
return self.parent[x]
def union(self, a, b):
pa, pb = self.find(a), self.find(b)
if pa == pb:
return False
if self.rank[pa] < self.rank[pb]:
pa, pb = pb, pa
self.parent[pb] = pa
if self.rank[pa] == self.rank[pb]:
self.rank[pa] += 1
return True
常见坑点
warning
只合并账户下标,却没有做好邮箱级映射。
warning
路径压缩和分组还没完成就提前收集答案。
高频追问
这里也能用图遍历吗?
DSU 的节点到底应该是账户还是邮箱?
继续刷相关题
先把 并查集 这个模式刷成体系,再去做更难变体。