Skip to content

Latest commit

 

History

History
53 lines (41 loc) · 1.49 KB

721.md

File metadata and controls

53 lines (41 loc) · 1.49 KB

Accounts Merge

Description

link


Solution

  • See Code

此题最巧妙之处在于使用邮箱并查集方式查找对应的账号,通过这种方式把所有连通的账号遍历完成,在DFS的过程中记录答案emails


Code

最坏情况:O(n^2)

class Solution:
    def accountsMerge(self, accounts: List[List[str]]) -> List[List[str]]:
        from collections import defaultdict
        visited_accounts = [False] * len(accounts)
        emails_accounts_map = defaultdict(list)
        res = []
        # Build up the graph.
        for i, account in enumerate(accounts):
            for j in range(1, len(account)):
                email = account[j]
                emails_accounts_map[email].append(i)

        # DFS code for traversing accounts.
        def dfs(i, emails):
            if visited_accounts[i]:
                return
            visited_accounts[i] = True
            for j in range(1, len(accounts[i])):
                email = accounts[i][j]
                emails.add(email)
                for neighbor in emails_accounts_map[email]:
                    dfs(neighbor, emails)

        # Perform DFS for accounts and add to results.
        for i, account in enumerate(accounts):
            if visited_accounts[i]:
                continue
            name, emails = account[0], set()
            dfs(i, emails)
            res.append([name] + sorted(emails))
        return res