Leetcode 721. 账户合并

news/2024/10/18 10:41:23

1.题目基本信息

1.1.题目描述

给定一个列表 accounts,每个元素 accounts[i] 是一个字符串列表,其中第一个元素 accounts[i][0] 是 名称 (name),其余元素是 emails 表示该账户的邮箱地址。

现在,我们想合并这些账户。如果两个账户都有一些共同的邮箱地址,则两个账户必定属于同一个人。请注意,即使两个账户具有相同的名称,它们也可能属于不同的人,因为人们可能具有相同的名称。一个人最初可以拥有任意数量的账户,但其所有账户都具有相同的名称。

合并账户后,按以下格式返回账户:每个账户的第一个元素是名称,其余元素是 按字符 ASCII 顺序排列 的邮箱地址。账户本身可以以 任意顺序 返回。

1.2.题目地址

https://leetcode.cn/problems/accounts-merge/description/

2.解题方法

2.1.解题思路

并查集+哈希表

2.2.解题步骤

第一步,构建email->username的映射,同时构建邮箱之间的并查集(同一个账户的邮箱属于一个集合)

第二步,根据并查集的映射,构建rootEmail->emails的映射

第三步,根据rootEmail->emails的映射构建题解并返回

3.解题代码

Python代码

# # ==> 并查集模板(附优化)
class UnionFind():def __init__(self):self.roots={}self.setCnt=0   # 连通分量的个数# Union优化:存储根节点主导的集合的总节点数self.rootSizes={}def add(self,x):if x not in self.roots:self.roots[x]=xself.rootSizes[x]=1self.setCnt+=1def find(self,x):root=xwhile root != self.roots[root]:root=self.roots[root]# 优化:压缩路径while x!=root:temp=self.roots[x]self.roots[x]=rootx=tempreturn rootdef union(self,x,y):rootx,rooty=self.find(x),self.find(y)if rootx!=rooty:# 优化:小树合并到大树上if self.rootSizes[rootx]<self.rootSizes[rooty]:self.roots[rootx]=rootyself.rootSizes[rooty]+=self.rootSizes[rootx]else:self.roots[rooty]=rootxself.rootSizes[rootx]+=self.rootSizes[rooty]self.setCnt-=1from collections import defaultdictclass Solution:def accountsMerge(self, accounts: List[List[str]]) -> List[List[str]]:uf=UnionFind()# 第一步,构建email->username的映射,同时构建邮箱之间的并查集(同一个账户的邮箱属于一个集合)emailToUserMap={}for account in accounts:username=account[0]firstEmail=account[1]for email in account[1:]:emailToUserMap[email]=usernameuf.add(email)uf.union(firstEmail,email)        # 第二步,根据并查集的映射,构建rootEmail->emails的映射rootToEmailsMap=defaultdict(list)for email in uf.roots.keys():rootEmail=uf.find(email)rootToEmailsMap[rootEmail].append(email)# print(rootToEmailsMap)# 第三步,根据rootEmail->emails的映射构建题解并返回result=[]for key,emails in rootToEmailsMap.items():result.append([emailToUserMap[key]]+sorted(emails))# print(result)return result

4.执行结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/72971.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

网管平台(基础篇):网管系统的重要性

网管系统的核心地位:数字世界的稳定舵手 在信息技术日新月异的今天,网络如同一条无形的纽带,将世界紧密相连。然而,这条纽带背后隐藏着无数复杂的节点与链路,如何确保它们高效、稳定地运行,成为了一个亟待解决的问题。网管系统,作为数字世界的稳定舵手,以其强大的监控与…

揭秘!如何设计高可用、高性能、高扩展的异地多活系统?【转】

1 关于基础架构 2 关于异地多活 3 写时延是关键 4 写量大拆分片 5 做隔离拆分片 6 其他影响因素 7 数据复制架构 8 数据影响路由 9 架构选型模式异地多活是分布式系统架构设计的一座高峰,当业务系统走到需要考虑异地多活这一步,其体量和复杂度都会达到很高的水准。接入层、逻…

引擎模块自身占用

引擎自身中存在内存开销的部分纷繁复杂,可以说是由巨量的“微小”内存所累积起来的,比如GameObject及其各种Component(最大量的Component应该算是Transform了)、ParticleSystem、MonoScript以及各种各样的模块Manager(SceneManager、CanvasManager、PersistentManager等)……

怎样修改网站ftp密码?

修改网站FTP密码的方法取决于你使用的FTP服务提供商或Web主机控制面板。以下是一些常见情况下的步骤:通过cPanel修改FTP密码:登录到你的cPanel账户。 在文件部分找到“FTP账户”选项并点击。 选择你想要修改密码的FTP账户。 点击“更改密码”按钮。 输入新密码,并确认。 点击…

CMDB平台(基础篇):CMDB的概念以及现状

CMDB:IT界的“超级大脑”,现状却让人哭笑不得 在IT界,有一个神秘而强大的存在,它被称为CMDB——资产配置管理。听起来就像是《复仇者联盟》里的超级英雄,但实际上,它更像是IT界的“超级大脑”,默默记录着每一个IT组件的“身世”和“关系网”。 那CMDB到底是什么呢?下面…

网站如何修改后台代码?模板网站怎么修改?

修改网站后台代码通常涉及以下几个步骤,具体操作可能会因网站的技术栈和架构而有所不同。以下是一般流程: 1. 备份现有代码重要:在进行任何修改之前,务必备份现有的代码和数据库。这可以在出现问题时帮助你快速恢复。2. 确定修改需求明确你需要对后台代码进行哪些具体的修改…

【设计模式】适配器模式

设计模式【设计模式】工厂方法模式 【设计模式】抽象工厂模式 【设计模式】单例模式 【设计模式】策略模式 【设计模式】观察者模式 【设计模式】装饰模式 【设计模式】适配器模式 一、介绍 适配器模式是一种结构型设计模式, 它能使接口不兼容的对象能够相互合作。 适配器可担…

如何修改公司网站文案?网站修改后台资料?

修改公司网站文案时,可以遵循以下几个步骤来确保内容既专业又吸引人:明确目标:确定修改文案的目的。是为了提高转化率、增强品牌形象还是更新产品信息? 明确目标受众是谁,了解他们的需求和偏好。收集反馈:从客户、同事或行业专家那里收集关于现有文案的反馈。 分析网站访…