ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Leetcode-并查集(hashmap)-721. 账户合并

2021-01-18 12:02:52  阅读:175  来源: 互联网

标签:account hashmap get int ArrayList 查集 List 721 new


题目:

题解:

还是并查集,注意最后输出要排序

代码:

一开始拿两个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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有