Leetcode-721 账户合并

简介: Leetcode-721 账户合并

题目(此题还可用作合并 json 数据)


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


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


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


示例


输入:


accounts = [[“John”, “johnsmith@mail.com”, “john00@mail.com”], [“John”, “johnnybravo@mail.com”], [“John”, “johnsmith@mail.com”, “john_newyork@mail.com”], [“Mary”, “mary@mail.com”]]


输出:


[[“John”, ‘john00@mail.com’, ‘john_newyork@mail.com’, ‘johnsmith@mail.com’], [“John”, “johnnybravo@mail.com”], [“Mary”, “mary@mail.com”]]


解释:


第一个和第三个 John 是同一个人,因为他们有共同的邮箱地址 “johnsmith@mail.com”。


第二个 John 和 Mary 是不同的人,因为他们的邮箱地址没有被其他帐户使用。


可以以任何顺序返回这些列表,例如答案 [[‘Mary’,‘mary@mail.com’],


[‘John’,‘johnnybravo@mail.com’],


[‘John’,‘john00@mail.com’,‘john_newyork@mail.com’,‘johnsmith@mail.com’]] 也是正确的。


题解

class Solution:
    def accountsMerge(self, accounts: List[List[str]]) -> List[List[str]]:
        belongs = collections.defaultdict(list)
        for i, j in enumerate(accounts):
            for email in j[1:]:
                belongs[email].append(i)
        email_visited = set()
        id_visited = set()
        def dfs(id):
            if id in id_visited:
                return
            id_visited.add(id)
            for email in accounts[id][1:]:
                if email in email_visited:
                    continue
                email_visited.add(email)
                ans[-1].append(email)
                for i in belongs[email]:
                    dfs(i)
        ans = []
        for i in range(len(accounts)):
            if i not in id_visited:
                ans.append(accounts[i][:1])
                dfs(i)
        for i in range(len(ans)):
            ans[i] = ans[i][:1] + sorted(ans[i][1:])
        return ans


相关文章
|
机器学习/深度学习 监控
大模型开发:你如何在保持模型性能的同时减少过拟合的风险?
为应对大模型过拟合,采用正则化(L1/L2/Dropout)、早期停止训练以监控验证集性能,通过数据增强提升模型泛化能力,选择适合问题复杂度的模型,使用集成方法(如Bagging/Boosting)增强稳定性,以及利用预训练模型进行迁移学习。这些策略结合使用能有效降低过拟合风险,提高模型泛化性能。
990 2
|
缓存 JavaScript 算法
vue2和vue3之间diff算法的差异
vue2和vue3之间diff算法的差异
|
Web App开发 缓存 应用服务中间件
【CDN 最佳实践】获取历史脏数据的处理思路及规避方法
保证提供给客户端准确的数据是保障服务质量的最基本的要求。但是在实际使用过程中经常会发现客户端访问到的数据为历史脏数据影响客户体验。本文将在包括 CDN 的场景下分析常见出现该问题的原因以及规避方法,希望大家可以在遇到该问题时可依据该思路尽快恢复解决。
4834 0
|
12月前
|
Linux 开发工具 iOS开发
【Vim 核心攻略】 —— 文本编辑高手的进阶秘籍
Vim 是效率与优雅的化身,蕴藏着无尽的可能。在这里,我希望通过记录点滴心得,让更多人发现它的魅力。或许,某个不经意的技巧、一个贴心的配置,便能让你与 Vim 的旅途更加契合。愿这片小小的天地,成为你探索高效编辑世界的一盏微光。
【Vim 核心攻略】 —— 文本编辑高手的进阶秘籍
|
存储 机器学习/深度学习 自然语言处理
LLM微调方法(Efficient-Tuning)六大主流方法:思路讲解&优缺点对比[P-tuning、Lora、Prefix tuing等]
LLM微调方法(Efficient-Tuning)六大主流方法:思路讲解&优缺点对比[P-tuning、Lora、Prefix tuing等]
LLM微调方法(Efficient-Tuning)六大主流方法:思路讲解&优缺点对比[P-tuning、Lora、Prefix tuing等]
|
人工智能
AIGC应用爆发:创意设计人的新机遇与挑战
AIGC技术驱动创意设计行业变革,岗位需求增长超300%,设计师借助AI提高效率,创造多样化作品。同时,AIGC拓宽设计边界,增强作品互动性,提升艺术和商业价值。设计师需掌握新技术,适应竞争,保持创新和独立思考,通过认证如Adobe国际认证提升竞争力。面对挑战,持续学习与同行合作是关键。
|
存储 安全 数据库连接
【C++智能指针】深入探究C++智能指针:自定义删除器的设计与选择
【C++智能指针】深入探究C++智能指针:自定义删除器的设计与选择
1029 0
|
数据采集 存储 算法
数据分享|Weka数据挖掘Apriori关联规则算法分析用户网购数据
数据分享|Weka数据挖掘Apriori关联规则算法分析用户网购数据
|
缓存 监控 小程序
微信小程序全栈开发中的性能监控与调优
【4月更文挑战第12天】本文探讨了微信小程序全栈开发中的性能监控与调优。页面加载速度、响应速度、内存占用和电量消耗是关键性能问题。开发者可利用微信小程序开发者工具进行性能监控,分析指标并优化代码、数据缓存、资源管理。通过综合性能调优,提升小程序性能和用户体验,降低用户流失。开发者需持续关注和学习新性能优化技术。
606 2
|
JSON 安全 Java
如何基于 Swagger 使用 OpenAPI Generator生成 JMeter 脚本
【2月更文挑战第24天】如何基于 Swagger 使用 OpenAPI Generator生成 JMeter 脚本
700 0
如何基于 Swagger 使用 OpenAPI Generator生成 JMeter 脚本