LeetCode721 账户合并
题解
对于\(vector<vector<string>> accounts\),我们定义\(accounts[i]\)为一个列表项。对于\(accounts\)中的一条列表项,第一个元素代表用户名称,其余元素均代表该用户所拥有的邮箱地址。如下图所示,是一个具有三条列表项的\(accounts\):

对于一个用户名称,其拥有的邮箱地址,不妨视为一个不包含重复元素的集合。当且仅当列表项之间的邮箱地址集合有交集时,可以合并列表项。
不妨假设\(n = accounts.size()\),那么本质就是问这\(n\)条列表项在所有具有交集的列表项进行合并后的集合信息。
可以用并查集维护\(n\)个不同的集合。
对于第\(i(0 \leq i \leq n-1)\)条列表项,易知该条列表项的邮箱地址都曾出现于第\(i\)个邮箱地址集合中。
那么不妨用\(map<string, vector<int>>\)维护邮箱地址出现过的集合序号,结果只需要将全部集合序号所指的集合合并为一个集合,最后的结果就是所求答案。
例如上述给出的图片,其集合序号信息如下:
邮箱地址1
1
邮箱地址2
1 2
邮箱地址3
1
邮箱地址4
2
邮箱地址5
2
邮箱地址6
3
由邮箱地址2 {1, 2},可知集合1和集合2是具有交集的,可以合并,并且可以证明,除此之外再无其他集合有交集。进行合并后,集合信息为:
- 1(2) {邮箱地址1, 邮箱地址2, 邮箱地址3, 邮箱地址4, 邮箱地址5};
- 3 {邮箱地址6}。
参考代码
class Solution {
public:
void merge(vector<int> &bcj, int a, int b) {
bcj[find(bcj, a)] = find(bcj, b);
}
int find(vector<int> &bcj, int x) {
while (x != bcj[x]) {
return bcj[x] = find(bcj, bcj[x]);
}
return x;
}
vector<vector<string>> accountsMerge(vector<vector<string>>& accounts) {
vector<vector<string>> ans;
map<string, vector<int>> mp;
int n = accounts.size();
vector<int> bcj(n);
iota(bcj.begin(), bcj.end(), 0);
for (int i = 0; i < n; ++ i) {
for (int j = 1; j < accounts[i].size(); ++ j) {
mp[accounts[i][j]].emplace_back(i);
}
}
for (auto &it: mp) {
vector<int> &v = it.second;
int len = v.size();
for (int i = 1; i < len; ++ i) {
merge(bcj, v[0], v[i]);
}
}
map<int, set<string>> res;
for (int i = 0; i < n; ++ i) {
int anc = find(bcj, i);
for (int j = 1; j < accounts[i].size(); ++ j) {
res[anc].insert(accounts[i][j]);
}
}
for (auto &it: res) {
vector<string> vec;
vec.emplace_back(accounts[it.first][0]);
vec.insert(vec.end(), it.second.begin(), it.second.end());
ans.emplace_back(vec);
}
return ans;
}
};
LeetCode721 账户合并的更多相关文章
- [Swift]LeetCode721. 账户合并 | Accounts Merge
Given a list accounts, each element accounts[i] is a list of strings, where the first element accoun ...
- Java实现 LeetCode 721 账户合并(并查集)
721. 账户合并 给定一个列表 accounts,每个元素 accounts[i] 是一个字符串列表,其中第一个元素 accounts[i][0] 是 名称 (name),其余元素是 emails ...
- 【leetcode】721. Accounts Merge(账户合并)
Given a list of accounts where each element accounts[i] is a list of strings, where the first elemen ...
- [LeetCode] Accounts Merge 账户合并
Given a list accounts, each element accounts[i] is a list of strings, where the first element accoun ...
- [LeetCode] 721. Accounts Merge 账户合并
Given a list accounts, each element accounts[i] is a list of strings, where the first element accoun ...
- Leetcode(712)-账户合并
给定一个列表 accounts,每个元素 accounts[i] 是一个字符串列表,其中第一个元素 accounts[i][0] 是 名称 (name),其余元素是 emails 表示该帐户的邮箱地址 ...
- [leetcode]721. Accounts Merge账户合并
Given a list accounts, each element accounts[i] is a list of strings, where the first element accoun ...
- [转]passport.js学习笔记
概述 passport.js是Nodejs中的一个做登录验证的中间件,极其灵活和模块化,并且可与Express.Sails等Web框架无缝集成.Passport功能单一,即只能做登录验证,但非常强大, ...
- Swift LeetCode 目录 | Catalog
请点击页面左上角 -> Fork me on Github 或直接访问本项目Github地址:LeetCode Solution by Swift 说明:题目中含有$符号则为付费题目. 如 ...
- 【公众号】微信第三方登录(静默授权和非静默授权)(具体代码:U盘 新浪云SAE)
一.微信联合登录是怎么登录的,有几种登录方式:微信联合登录和微信授权登录[授权登录(非静默授权)与静默授权] [主动授权]:需要用户确认登录,这样可以通过用户的个人确认,获取用户全面的信息,无论是否关 ...
随机推荐
- C++ 指针动态内存分配
动态内存分配 动态内存分配:即由程序员手动的进行内存空间的分配.内存空间的释放的内存管理操作 C++代码中,变量.数组等对象的创建,是由C++自动分配内存的,称之为(自动)静态内存分配 (自动)静态内 ...
- Maven 依赖项管理&&依赖范围
依赖管理 使用坐标导入jar包 1.在pom.xml 中编写 <dependencies> 标签 2.在 <dependencies> 标签中使用 < ...
- 东方通TongWeb7部署SuperMap iServer War包
一.软件版本 操作系统: CentOS 7.5.1804 JDK:1.8_201 东方通:TongWeb7.0.4.2 SuperMap iServer:10.2 二.东方通TongWeb7部署流程 ...
- USB-A, Micro, lightning and USB-C
- Oracle ADG 自动切换脚本分享
为大家分享一个[Oracle ADG自动切换]的脚本,由云和恩墨工程师HongyeDBA编写,支持Switchover.Failover. 下载链接:https://www.modb.pro/down ...
- DNShell
DNShell 一款基于DNS C2隧道的反弹shell工具. 支持 功能: 支持DNS-recordA-直连型 的C2隧道. 目标: Windows下基于Powershell的反弹. Linux下基 ...
- Paths和Files
Paths 类 Paths 类主要用于操作文件和目录路径.它提供了一些静态方法,用于创建java.nio.file.Path实例,代表文件系统中的路径. // 创建一个Path实例,表示当前目录下的一 ...
- 写代码被大语言模型坑之使用LocalDateTime比较两个时间差了几天
自从去年ChatGPT3.5发布后使用了几次,现在写代码基本上离不开它和它的衍生产品们了.一方面查资料很方便,快速提炼要点总结:另一方面想写什么样的代码一问就能生成出来,功能大差不差,稍微改改就能用, ...
- 矩阵怪 - 2024全新矩阵产品,一键分发抖音,快手,视频号,B站,小红书!
本方案面向谁,解决了什么问题 本方案主要面向C端客户,特别是那些在各大短视频平台(如小红书.抖音.视频号.快手.B站等)上进行内容创作和分发的个人用户.自由职业者.小型团队或企业.这些用户通常面临着在 ...
- 鸿蒙NEXT开发案例:指尖轮盘
[1]引言 "指尖轮盘"是一个简单而有趣的互动游戏(类似抓阄),这个应用通过触摸屏幕的方式,让玩家参与一个激动人心的游戏,最终选出幸运的赢家.未来可以进一步扩展功能,如增加游戏模式 ...