【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顺序排列

posted @ 2024-07-15 20:25  TICSMC  阅读(10)  评论(0)    收藏  举报