代码:
写了一个超时版本 又学了并查集
超时版本:
- class Solution {
- public List
> accountsMerge(List> accounts)
{
- List
> newAcc = new ArrayList<>();
- Set
isArrive = new HashSet<>(); - int idx = 0;
-
- Iterator
> iterator = accounts.iterator();
- while(iterator.hasNext()){
- List
curAcc = iterator.next(); - if(isArrive.contains(idx)){
- idx++;
- continue;
- }
- Set
set = new HashSet<>(); - set.add(idx);
- set = getIdx(idx,set,accounts);
- List
curEmail = new ArrayList<>(); - for(int i:set){
- for(String str:accounts.get(i)){
- if(!curEmail.contains(str))curEmail.add(str);
- }
- }
- if(!isArrive.contains(idx)){
- String name = curEmail.get(0);
- curEmail.remove(0);
- Collections.sort(curEmail);
- curEmail.add(0,name);
- newAcc.add(curEmail);
- isArrive.add(idx);
- for(int i:set){
- isArrive.add(i);
- }
- }
- idx++;
- }
- return newAcc;
-
- }
- public Set
getIdx(int curIdx, Set set, List> accounts)
{ - List
curAccount = accounts.get(curIdx); - // curAccount.remove(0);
- for(String email:curAccount){
- for(int i=0;i
- if(set.contains(i))continue;
- List
acc = accounts.get(i); - if(acc.contains(email)&&email.contains("@")){
- set.add(i);
- set = getIdx(i,set,accounts);
- }
- }
- }
- return set;
- }
- }
并查集版:
- class Solution {
- public List
> accountsMerge(List> accounts)
{
- Map
emailToIndex = new HashMap(); - Map
emailToName = new HashMap(); - int emailsCount = 0;
- for(List
account:accounts){//遍历 写email的序号 和 email的name对 - String name = account.get(0);
- int size = account.size();
- for(int i=1;i
- String email = account.get(i);
- if(!emailToIndex.containsKey(email)){
- emailToIndex.put(email,emailsCount++);
- emailToName.put(email,name);
- }
- }
- }
-
- UnionFind uf = new UnionFind(emailsCount);
- for(List
account:accounts){ //把同一个人的邮箱合并到一个父节点下 - String firstEmail = account.get(1);
- int firstIndex = emailToIndex.get(firstEmail);
- int size = account.size();
- for(int i=2;i
- String nextEmail = account.get(i);
- int nextIndex = emailToIndex.get(nextEmail);
- uf.union(firstIndex,nextIndex);
- }
- }
-
- Map
> indexToEmails = new HashMap>(); - for(String email:emailToIndex.keySet()){//把相同根节点的email放一起
- int index = uf.find(emailToIndex.get(email));
- List
account = indexToEmails.getOrDefault(index, new ArrayList()); - account.add(email);
- indexToEmails.put(index, account);
- }
-
- List
> merged = new ArrayList>();
- for(List
emails:indexToEmails.values()){ - Collections.sort(emails);
- String name = emailToName.get(emails.get(0));
- List
account = new ArrayList<>(); - account.add(name);
- account.addAll(emails);
- merged.add(account);
- }
- return merged;
- }
- }
- class UnionFind{
- int[] parent;
- public UnionFind(int n){
- parent = new int[n];
- for(int i=0;i
- parent[i]=i;
- }
- }
- public void union(int index1,int index2){
- parent[find(index2)] = find(index1);
- }
-
- public int find(int index){
- if(parent[index]!=index){
- parent[index] = find(parent[index]);
- }
- return parent[index];
- }
- }
-
相关阅读:
等数值计算方法学习笔记第4章第三部分【数值积分(数值微分)】
【云原生 | 44】Docker搭建Registry私有仓库之管理访问权限
RK3588平台开发系列讲解(SARADC篇)SARADC的工作流程
基于springboot的二手物品交易管理系统
【总】HEC-RAS学习记录
C++:学习大纲目录:30天学会C++
动规算法-地下城游戏
数学建模不会 LaTex 排版 | 教你如何在 Word 中优雅地使用漂亮的 LaTex 公式
天猫京东整站商品数据分析,天猫商品价格数据接口,京东商品价格数据接口,电商平台商品价格数据接口流程介绍
SL1588A 18V转3.3V、5V、12V/ 2A同步降压稳压器
-
原文地址:https://blog.csdn.net/stacey777/article/details/133427128