721.账户合并

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代码,主要考的是并查集的思想。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值