【Leetcode】721
前言
并查集很好的使用场景了
思路
将有同一个邮箱地址的视为同一个账户下的地址,这就是并查集
具体实现起来就是找到所有的邮箱所在的根即可。唯一需要注意的就是名称一样的不代表是同一个账户,所以名称并不能作为一个hash值去检索邮箱所在的账户。
class Solution:
def accountsMerge(self, accounts: List[List[str]]) -> List[List[str]]:
t = {}
fa = {} # 记录所属的账户
def find(x):
if x != fa[x]:
fa[x] = find(fa[x])
return fa[x]
for account in accounts:
name = account[0] # 当前帐户的名字
head = account[1] if account[1] not in fa else find(account[1]) # 找当当前的头部
for email in account[1:]:
fa[find(email) if email in fa else email] = head
t[head] = name
cnt = {}
ans = []
for email in sorted(fa.keys()):
head = find(email) # 找到头部
if head in cnt:
ans[cnt[head]].append(email)
else:
cnt[head] = len(ans)
ans.append([t[head], email])
return ans
至于最后为什么需要排序之后再添加。原因是需要返回是账户的字典序,也就是字符串ASCII顺序排列

浙公网安备 33010602011771号