【Leetcode每日一题(Days3)】721. Accounts Merge(账户合并)

题目描述

在这里插入图片描述
题目详情:
721.账户合并

思考

(太衰了,学习第三天就碰到我最不擅长的图)这次题目是看懂了,但是一点思路都没有,查看了灵茶山艾府的思路和代码(看了好几遍,甚至一行一行分析代码我才知道他的思想和代码的对应关系【太菜了我】)
大概总结:将各账户和各邮箱都当作一个节点,然后通过一个dict将邮箱和该邮箱对应的所有账户在accounts中的行下标对应,输出的defaultdict是这样的:
defaultdict(<class 'list'>, {'johnsmith@mail.com': [0, 1], 'john_newyork@mail.com': [0], 'john00@mail.com': [1], 'mary@mail.com': [2], 'johnnybravo@mail.com': [3]})
上面创建的是邮箱对应账户,然后下面通过账户遍历,每遍历一个账户都查看该账户后面的邮箱有没有在email_set里面,如果在则跳出这个邮箱的循环,否则将其添加到email_set中,并且遍历该邮箱对应的所有账户是不是被访问了(就是去查看defaultdict中对应邮箱后面list里的所有值)

解答

from collections import defaultdict

class Solution:
    def accountsMerge(self, accounts: List[List[str]]) -> List[List[str]]:
        email2idx = defaultdict(list)
        for i, account in enumerate(accounts):
            for email in account[1:]:
                email2idx[email].append(i)
        def dfs(i):
            visit[i] = True
            for email in accounts[i][1:]:
                if email in email_set:
                    continue
                email_set.add(email)
                for j in email2idx[email]:
                    if not visit[j]:
                        dfs(j)
        results = []
        visit = [False] * len(accounts)
        for i, b in enumerate(visit):
            if not b:
                email_set = set()
                dfs(i)
                results.append([accounts[i][0]] + sorted(email_set))
        return results      

Finish

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值