#721
Medium
并查集

Accounts Merge

合并共享邮箱的账户记录。

GraphUnion Find

题目定位

共享邮箱定义了账户之间的连通关系,因此这题本质上是在把相关标识符分组成连通块,而不是逐行处理表格。

关键观察

真正的难点是把字符串邮箱映射到 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 的节点到底应该是账户还是邮箱?

继续刷相关题

先把 并查集 这个模式刷成体系,再去做更难变体。

view_week回到模式页
LeetCode 721. Accounts Merge 题解思路 | Interview AiBox