给定一个列表 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’]] 也是正确的。

代码

class Solution {int[] fa;public void  init(){for(int i=0;i<fa.length;i++)fa[i]=i;}public int  find(int x){if(x!=fa[x])fa[x]=find(fa[x]);return fa[x];}public void   union(int x,int y){x=find(x);y=find(y);if(x==y) return;fa[x]=y;}public List<List<String>> accountsMerge(List<List<String>> accounts) {Map<String,Integer> index=new HashMap<>();Map<Integer,String> name=new HashMap<>();int inx=0;for(List<String> list:accounts){String accName=list.get(0);for(int i=1;i<list.size();i++)if(!index.containsKey(list.get(i))) {//为每个邮箱地址创建下标和姓名映射name.put(inx,accName);index.put(list.get(i), inx++);}}fa=new int[inx];init();for(List<String> list:accounts)//将具有相同邮箱的 连接起来{int father=index.get(list.get(1));for(int i=2;i<list.size();i++)union(index.get(list.get(i)),father);}Map<Integer,List<String>> map=new HashMap<>();for(String s:index.keySet())//创建每个集合中 父节点下标 对 所有邮箱地址的映射{int fa=find(index.get(s));List<String> list=map.getOrDefault(fa,new ArrayList<>());list.add(s);map.put(fa,list);}List<List<String>> res=new ArrayList<>();for(int f:map.keySet())//按特定格式 写入结果{List<String> temp=new ArrayList<>();List<String> email=map.get(f);Collections.sort(email);temp.add(name.get(f));temp.addAll(email);res.add(temp);}return res;}
}

leetcode 721. 账户合并(并查集)相关推荐

  1. 20211229[按秩合并并查集 最小生成树][BZOJ4668]冷战

    20211229[按秩合并并查集.最小生成树][BZOJ4668]冷战 题意:给定N点,动态加边与询问两点最早是哪条边开始连通,强制在线 首先如果离线的话可以直接跑最小生成树,不过代码不好处理. 当然 ...

  2. BZOJ 4668 冷战(按秩合并并查集+LCA)

    4668: 冷战 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 627  Solved: 303 [Submit][Status][Discuss] ...

  3. BZOJ4399魔法少女LJJ——线段树合并+并查集

    题目描述 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了 LJJ感叹道"这里真是个迷人的绿色世界,空气清新.淡雅,到处散发着醉 ...

  4. leetcode 721. Accounts Merge | 721. 账户合并(HashMap版并查集)

    题目 https://leetcode.com/problems/accounts-merge/ 题解 HashMap 版的并查集.参考了:leetcode 684. Redundant Connec ...

  5. Leetcode(5)——遍历,并查集,回溯法和二分查找

    格式: 题号+题名+简单思路+code 遍历 深度优先遍历和广度优先遍历 很多dfs可以用Union Find解决 T130: 被围绕的区域 DFS的写法 func solve(board [][]b ...

  6. 动态图连通性(线段树分治+按秩合并并查集)

    在考场上遇到了这个的板子题,,,所以来学习了一下线段树分治 + 带撤销的并查集. 题目大意是这样的:有m个时刻,每个时刻有一个加边or撤销一条边的操作,保证操作合法,没有重边自环,每次操作后输出当前图 ...

  7. CCPC-Wannafly Winter Camp Day3 (Div2, onsite) I 石头剪刀布(按秩合并并查集)

    题解:每次有两个事件: y y去挑战xx,如果赢了可以坐在x x的位置,打平或者输了就要被淘汰. 询问在进行所有一类事件后,有多少种情况可以让x x现在还没有被淘汰. 对于第二类事件,我们假设x x挑 ...

  8. Codeforces.1051G.Distinctification(线段树合并 并查集)

    题目链接 \(Description\) 给定\(n\)个数对\(A_i,B_i\).你可以进行任意次以下两种操作: 选择一个位置\(i\),令\(A_i=A_i+1\),花费\(B_i\).必须存在 ...

  9. LeetCode题库:并查集问题(Python语言实现)

    并查集相关知识 并查集常用模板 class UnionSet:def init_tree(self,n):self.fa = [i for i in range(n)] # 必要,记录根节点,也可能是 ...

最新文章

  1. FCKeditor 2.6 精简版
  2. 从零入门 Serverless | 函数计算的可观测性
  3. tomcat线程循环异常终止_腾讯面试官:如何停止一个正在运行的线程?我一脸蒙蔽。。。...
  4. MVC模式 在Java Web应用程序中的实现
  5. 2021中考高考成绩查询,2021中考
  6. 西门子plm_好事连连 西门子PLM新品多项合作并举
  7. appcan slider轮播图和页面弹动冲突解决
  8. SQL工作笔记-达梦数据库关于时间的函数
  9. 你以为工厂模式很简单,可能是因为你懂的只是冰山的一角
  10. 基于 Eclipse 平台的代码生成技术
  11. SQL 2005数据库转为2000的终极解决方案
  12. 巩固——Vue中如何使用less和scss?
  13. 关系型数据库管理系统(RDBMS)与非关系型数据库(NoSQL)之间的区别
  14. 如何让百度云里的资源不被和谐掉?
  15. 常用Java静态代码分析工具的分析与比较
  16. 2022世界杯不扩军!国足教练:机会来了
  17. Miktex 修改经验
  18. 【限时删除】一个惊艳的神器,可全网爬取各种资源..........
  19. easyflow 流程图 节点自动布局
  20. 使用OpenLayers根据经纬度对地图进行单个标点,以及点击标点弹框的实现(没有从后台获取经纬度数据)

热门文章

  1. 1006. 换个格式输出整数 (15)
  2. eventfd(三)
  3. Leetcode 219. 存在重复元素 II
  4. Redis高级项目实战!北京java编程入门培训
  5. mysql数据库安装,真香!
  6. java过滤器如何操作数据库_jsp – 使用Java中的过滤器验证用户名,密码(与数据库联系)...
  7. eclipse警告与报错的修复
  8. Linux记录-TCP状态以及(TIME_WAIT/CLOSE_WAIT)分析(转载)
  9. python使用GUI(图形用户界面)
  10. tiny xml 使用总结