Leetcode-并查集(hashmap)-721. 账户合并
作者:互联网
题目:
题解:
还是并查集,注意最后输出要排序
代码:
一开始拿两个List做的,结果在最后检查根节点入列的时候,因为涉及到两个for循环,直接超时了
class Solution {
public List<List<String>> accountsMerge(List<List<String>> accounts)
{
List<String> email = new ArrayList<String>();
List<String> name = new ArrayList<String>();
int all = 0;
for(int i = 0; i< accounts.size(); i++)
{
List<String> account=accounts.get(i);
all+=account.size()-1;
for(int j=1;j<account.size();j++)
{
if(!email.contains(account.get(j)))
{
email.add(account.get(j));
name.add(account.get(0));
}
}
}
if(all==email.size())
{
for(int i =0;i<accounts.size();i++)
{
Collections.sort(accounts.get(i));
}
return accounts;
}
int f[]=new int[email.size()];
for(int i=0;i<email.size();i++){f[i]=i;}
for(int i=0; i<accounts.size(); i++)
{
for(int j=2;j<accounts.get(i).size();j++)
{
if(!accounts.get(i).get(1).equals(accounts.get(i).get(j)))
{
int x = email.indexOf(accounts.get(i).get(1));
int y = email.indexOf(accounts.get(i).get(j));
union(x,y,f);
}
}
}
List<List<String>> res= new ArrayList<List<String>>();
List<List<String>> merged= new ArrayList<List<String>>();
for(int i=0; i <email.size(); i++)
{
//System.out.println(email.get(i));
if(find(i,f)==i)
{
List<String> tmp = new ArrayList<String>();
tmp.add(name.get(i));
tmp.add(email.get(i));
for(int j = 0;j<f.length; j++)
{
if(find(j,f)==i&&i!=j)
{
tmp.add(email.get(j));
}
}
Collections.sort(tmp);
res.add(tmp);
}
}
return res;
}
public int find(int x ,int[]f)
{
if(x==f[x]) return x;
f[x]=find(f[x],f);
return f[x];
}
public void union(int x ,int y,int[]f)
{
int fx = find(x,f);
int fy = find(y,f);
if(f[x]==f[y]) return;
f[fy]=fx;
}
}
还是得用HashMap的getOrDefault方法来得到,根一样的结点集合,不会超时
class Solution {
public List<List<String>> accountsMerge(List<List<String>> accounts)
{
Map<String, Integer> emailToIndex = new HashMap<String, Integer>();
Map<String, String> emailToName = new HashMap<String, String>();
int all = 0;
int index = 0;
for(int i = 0; i< accounts.size(); i++)
{
List<String> account=accounts.get(i);
all+=account.size()-1;
String name=account.get(0);
for(int j=1;j<account.size();j++)
{
if(!emailToIndex.containsKey(account.get(j)))
{
emailToIndex.put(account.get(j),index++);
emailToName.put(account.get(j),name);
}
}
}
if(all==index)
{
for(int i =0;i<accounts.size();i++)
{
Collections.sort(accounts.get(i));
}
return accounts;
}
int f[]=new int[index];
for(int i=0;i<index;i++){f[i]=i;}
for(int i=0; i<accounts.size(); i++)
{
int x = emailToIndex.get(accounts.get(i).get(1));
for(int j=2;j<accounts.get(i).size();j++)
{
int y = emailToIndex.get(accounts.get(i).get(j));
union(x,y,f);
}
}
Map<Integer, List<String>> indexToEmails = new HashMap<Integer, List<String>>();
List<List<String>> res= new ArrayList<List<String>>();
for(String email : emailToIndex.keySet())
{
int indexi =find(emailToIndex.get(email),f);
List<String> account = indexToEmails.getOrDefault(indexi, new ArrayList<String>());
account.add(email);
indexToEmails.put(indexi, account);
}
for (List<String> emails : indexToEmails.values()) {
Collections.sort(emails);
String name = emailToName.get(emails.get(0));
List<String> account = new ArrayList<String>();
account.add(name);
account.addAll(emails);
res.add(account);
}
return res;
}
public int find(int x ,int[]f)
{
if(x==f[x]) return x;
f[x]=find(f[x],f);
return f[x];
}
public void union(int x ,int y,int[]f)
{
int fx = find(x,f);
int fy = find(y,f);
if(f[x]==f[y]) return;
f[fy]=fx;
}
}
标签:account,hashmap,get,int,ArrayList,查集,List,721,new 来源: https://blog.csdn.net/qq_40421671/article/details/112769167