其他分享
首页 > 其他分享> > Leetcode-并查集(hashmap)-721. 账户合并

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