721.账户合并(python3)
python代码
class Solution:
def accountsMerge(self, accounts: List[List[str]]) -> List[List[str]]:
result = []
delect = []
for index in range(len(accounts)):
repeat = 0
flag = 0
if index in delect:
continue
user = []
emails = []
user.append(accounts[index][0])
emails.extend(set(accounts[index][1:]))
for index2 in range(index + 1, len(accounts)):
Flag = 0
for index1 in range(0, len(emails)):
if Flag == 1:
break
for index3 in range(1, len(accounts[index2])):
if(emails[index1] == accounts[index2][index3]):
emails = list(set(emails).union(accounts[index2][1:]))
delect.append(index2)
Flag = 1
flag = 1
break
if flag == 1:
delect.append(index)
user.extend(sorted(emails))
accounts.append(user)
for Index in range(len(accounts)):
if Index in delect:
continue
result.append(sorted(list(set(accounts[Index]))))
return result
在跑的时候超时了,权当参考
#定义并查集
class Unionset:
def __init__(self, n):
self.parent = list(range(n))
#将index1的根作为index2的根
def union(self, index1: int, index2: int):
self.parent[self.find(index2)] = self.find(index1)
#找到index的根,根的判别依据为父节点是自身
def find(self, index: int) -> int:
if self.parent[index] != index:
self.parent[index] = self.find(self.parent[index])
return self.parent[index]
class Solution:
def accountsMerge(self, accounts: List[List[str]]) -> List[List[str]]:
emailToIndex = dict()
emailToName = dict()
#对两个字典进行初始化
for account in accounts:
Name = account[0]
for email in account[1:]:
if email not in emailToIndex:
emailToName[email] = Name
emailToIndex[email] = len(emailToIndex)
ufs = Unionset(len(emailToIndex))
#先将已知为一个账户拥有的邮箱通过并查集进行合并
for account in accounts:
firstIndex = emailToIndex[account[1]]
for email in account[2:]:
ufs.union(firstIndex, emailToIndex[email])
#将根节点为相同节点的邮箱进行合并,最终项数的即为不同账户的个数
indexToEmails = collections.defaultdict(list)
for email, index in emailToIndex.items():
index = ufs.find(index)
indexToEmails[index].append(email)
#选取首部邮箱的账户名作为最终账户名,并对邮箱按ASKII顺序排序,得到最终结果
answer = list()
for emails in indexToEmails.values():
answer.append([emailToName[emails[0]]] + sorted(emails))
return answer
参考题解后的python3代码,主要考的是并查集的思想。