题目描述
题目详情:
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