哈希表实现的并查集:Leetcode 721. 账户合并

描述

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

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

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

示例 1:
输入: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’]] 也是正确的。

示例 2:
输入:accounts = [[“Gabe”,“Gabe0@m.co”,“Gabe3@m.co”,“Gabe1@m.co”],[“Kevin”,“Kevin3@m.co”,“Kevin5@m.co”,“Kevin0@m.co”],[“Ethan”,“Ethan5@m.co”,“Ethan4@m.co”,“Ethan0@m.co”],[“Hanzo”,“Hanzo3@m.co”,“Hanzo1@m.co”,“Hanzo0@m.co”],[“Fern”,“Fern5@m.co”,“Fern1@m.co”,“Fern0@m.co”]]
输出:[[“Ethan”,“Ethan0@m.co”,“Ethan4@m.co”,“Ethan5@m.co”],[“Gabe”,“Gabe0@m.co”,“Gabe1@m.co”,“Gabe3@m.co”],[“Hanzo”,“Hanzo0@m.co”,“Hanzo1@m.co”,“Hanzo3@m.co”],[“Kevin”,“Kevin0@m.co”,“Kevin3@m.co”,“Kevin5@m.co”],[“Fern”,“Fern0@m.co”,“Fern1@m.co”,“Fern5@m.co”]]

理解

一开始自己写了个笨方法,后来看了官解原来还可以用并查集写
官解的并查集中的每个结点是输入的每个account条目,这是个很好的思路
本人实现的并查集,每个结点直接是一个email,每个email对应根email。由于名字不同肯定属于不同账户,每个名字维护对应的并查集,由于结点是email,因此并查集用散列表实现

代码

class UnionMap:def __init__(self):self.union_map = {}def __contains__(self,other):return other in self.union_mapdef merge(self,i,j):if(i not in self.union_map):self.union_map[i] = iif(j not in self.union_map):self.union_map[j] = jri = self.root(i)rj = self.root(j)self.union_map[ri] = rjdef root(self,i):if(i == self.union_map[i]): return iself.union_map[i] = self.root(self.union_map[i])return self.union_map[i]   class Solution:def accountsMerge(self, accounts: List[List[str]]) -> List[List[str]]:name_union_map = {}for account in accounts:name = account[0]if(name not in name_union_map): name_union_map[name] = UnionMap()union_map = name_union_map[name]pre_root = account[1]for i in range(1,len(account)):email = account[i]union_map.merge(email,pre_root)ret = []for name,union_map in name_union_map.items():root_email_map = {}for email in union_map.union_map.keys():r = union_map.root(email)if(r not in root_email_map): root_email_map[r] = set()root_email_map[r].add(email)for email_set in root_email_map.values():ret.append([name] + sorted(email_set))return ret

再附上自己原来写的笨方法

class Solution:def accountsMerge(self, accounts: List[List[str]]) -> List[List[str]]:accounts_map = {}for account in accounts:emails = set(account[1:])if(account[0] not in accounts_map):accounts_map[account[0]] = []found_i = []for i,temp_emails in enumerate(accounts_map[account[0]]):if emails & temp_emails:emails.update(temp_emails)found_i.append(i)  while(found_i):accounts_map[account[0]].pop(found_i.pop())accounts_map[account[0]].append(emails)ret = []for name,all_emails in accounts_map.items():for emails in all_emails:ret.append([name] + sorted(list(emails)))return ret

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端框架学习之 搭建vue2的环境 书写案例并分析

目录 搭建vue的环境 Hello小案例 分析案例 搭建vue的环境 官方指南假设你已经了解关于HTML CSS 和JavaScript的中级知识 如果你刚开始学习前端开发 将框架作为你的第一步可能不是最好的主意 掌握好基础知识再来吧 之前有其他框架的使用经验会有帮助 但这不是必需的 最…

python开发面试-20240715

1、python GIL锁,以及如何避免 1、使用多进程 multiprocesssing 2、使用C扩展 3、使用异步编程 4、使用外部库如Numpy、Panda 5、GIL优化:python版本升级,可能会进行优化 2、python 内存回收 Python 使用自动内存管理来回收不再使用的对象&am…

JDK垃圾回收机制和垃圾回收算法

查看java相关信息 java -XX:PrintCommandLineFlags -version UseParallelGC 即 Parallel Scavenge Parallel Old,再查看详细信息 内存分配策略 1. 对象优先在 Eden 分配 大多数情况下,对象在新生代 Eden 区分配,当 Eden 区空间不够时,发…

PX4 UM982 配合F9P Base 进行 RTK 定位

UM982是新兴的常见双天线GPS模块,支持双天线定向,RTK功能,PX4也引入了对其的支持,需要按需额外设置 官方手册号称直接用F9P做地面站,搭配QGC使用就能进行RTK定位 但是经过实践,发现这样是进不了RTK模式的…

Docker---最详细的服务部署案例

提供python服务的docker一键部署,示例已配置负载均衡,不需要的在nginx.conf和docker-compose注释相关代码即可 文件结构 1、dockerfile # 服务的dockerfile# 服务依赖的镜像 FROM python:3.7# 设置容器内服务的工作目录 WORKDIR /app# 复制当前文件夹所…

AI作画入门指南:从基础到高级的全面教程

AI作画入门指南:从基础到高级的全面教程 AI作画是一项融合了技术与艺术的创新领域。本指南将带你从基础到高级,逐步掌握AI作画的技巧,打造出独具个性的艺术作品。 1. 什么是AI作画? 定义:AI作画是利用人工智能技术生…

基于Rspack实现大仓应用构建提效实践|得物技术

一、实践背景 随着项目的逐步迭代,代码量和依赖的逐渐增长,应用的构建速度逐步进入缓慢期。以目前所在团队的业务应用来看(使用webpack构建),应用整体构建耗时已经普遍偏高,影响日常开发测试的使用效率&am…

护网--2

实验要求: 1、办公区设备可以通过电信链路和移动链路上网(多对多的NAT,并且需要保留一个公网IP不能用来转换) 2、分公司设备可以通过总公司的移动链路和电信链路访问到Dmz区的http服务器 3、多出口环境基于带宽比例进行选路,但是,…

springboot 使用注解,对注解使用切面后,Controller调用service一直报null的问题解决。

百度后的答案是: springboot 注解加切面 后controller, service为null 报错问题:“springboot 注解加切面后controller, servise为null” 通常意味着在使用Spring Boot时,通过注解定义的切面成功创建了,但是与之相关联的Controll…

实现keepalive+Haproxyde 的高可用

需要准备五台实验机 一台客户机:test1 两台:一主一备的实验机:test2 test3 两台真实服务器:nginx1 nginx2 实验 首先在两台实验机上安装Haproxy 安装依赖环境,并将Haproxy的包进行解压处理 yum install -y pcre…

nodejs安装部署运行vue前端项目

文章目录 1.安装nodejs2.安装Vue CLI1.配置npm镜像源:2.安装Vue CLI:3.创建Vue项目4.启动Vue项目5.Express 1.安装nodejs Node.js 是一个免费、开源、跨平台的 JavaScript 运行时环境,它让开发人员能够创建服务器、Web 应用、命令行工具和脚…

【自动驾驶汽车通讯协议】UART通信详解:理解串行数据传输的基石

文章目录 0. 前言1. 同步通讯与异步通讯1.1 同步通信1.2 异步通信 2. UART的数据格式3. 工作原理3.1 波特率和比特率3.2 UART的关键特性 4. UART在自动驾驶汽车中的典型应用4.1 UART特性4.2应用示例 5. 结语 0. 前言 按照国际惯例,首先声明:本文只是我自…

MFC:文本可视化输出

文章目录 1. DrawText:2. TextOut:3. SetTextColor:4. SetBkColor:5. GetTextMetrics: 在MFC(Microsoft Foundation Classes)中,CDC(设备上下文类)提供了多种…

Barabási–Albert模型详解与Python代码示例

Barabsi–Albert模型详解与Python代码示例 模型介绍 Barabsi–Albert(BA)模型是一种用于模拟和分析复杂网络结构的数学模型,特别适用于描述那些具有“无标度”特性的网络。无标度网络是指网络中节点的连接度(度)分布…

xlive.dll丢失怎么办,xlive.dll文件的主要用途

xlive.dll丢失怎么办?目前是有很多方法可以解决这个xlive.dll丢失的问题的,只要你仔细的去了解xlive.dll这个文件,至于使用哪种方法,主要还是看你的实际情况,因为情况不同选择使用的方法也是不一样的,下面一…

底软驱动 | Linux虚拟内存

为了更有效的管理内存并且少出错,现代操作系统提供了一种对主存的抽象概念,叫做虚拟内存(VM)。虚拟内存提供了三个重要的能力: 1.它将主存(物理内存)看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保留活动区域,并且根据…

去除重复数字

1083. 【基础】去除重复数字 [ 刷题2路4线 ] 时间限制: 1000MS 空间限制: 16MB 结果评判: 文本对比 正确/提交: 29 (21) / 45 官方标签: 数组 普及- 题目描述 给你N个数(n<=100),每个数都在&am…

openEuler 安装 podman 和 podman compose

在 openEuler 22.03 LTS SP4 中,你可以使用 dnf 包管理器来安装 Podman 和 Podman Compose。openEuler 默认使用 dnf 作为包管理器,所以这是安装软件的首选方式。 关于 openEuler 22.03 LTS SP4 下载地址: https://www.openeuler.org/zh/dow…

【256 Days】我的创作纪念日

目录 🌼01 机缘 🌼02 收获 🌼03 日常 🌼04 成就 🌼05 憧憬 最近收到官方来信, 突然发现,不知不觉间,距离发布的第一篇博客已过256天,这期间我经历了春秋招、毕业答辩…

JS【详解】ES6 模块规范 vs CommonJS 模块规范

每个 js 文件都是一个模块,默认采用的 CommonJS 模块规范 新兴的 ES6 模块 pk 传统的 CommonJS 模块 特性CommonJSES6 模块化导出exports 对象export 关键字导入require()函数import 关键字加载模式同步异步执行模式单例单例依赖关系静态动态树形摇晃不支持支持 加…