721.Accounts Merge

-

https://leetcode.com/problems/accounts-merge/discuss/109157

class Solution {
    public List<List<String>> accountsMerge(List<List<String>> accounts) {
        Map<String, String> emailToName = new HashMap<>();
        Map<String, String> emailToEmail = new HashMap<>();
        Map<String, Set<String>> rootToEmailList = new HashMap<>();

        for(int i = 0; i < accounts.size(); i++){
            List<String> curList = accounts.get(i);
            String name = curList.get(0);
            for(int j = 1; j < curList.size(); j++){
                String email = curList.get(j);
                emailToName.put(email, name);
                emailToEmail.put(email, email);
            }
        }

        for(int i = 0; i < accounts.size(); i++){
            List<String> curList = accounts.get(i);
            String rootMail = find(emailToEmail, curList.get(1));
            for(int j = 2; j < curList.size(); j++){
                String email = curList.get(j);
                String currentRoot = find(emailToEmail, email);
                emailToEmail.put(currentRoot, rootMail);
            }
        }
        for(int i = 0; i < accounts.size(); i++){
            List<String> curList = accounts.get(i);
            String rootMail = find(emailToEmail, curList.get(1));
            if(!rootToEmailList.containsKey(rootMail))
                rootToEmailList.put(rootMail, new HashSet());
            for(int j = 1; j < curList.size(); j++){
                String email = curList.get(j);
                rootToEmailList.get(rootMail).add(email);
            }
        }
        List<List<String>> ans = new ArrayList<>();
        for(String rootMail : rootToEmailList.keySet()){
            List<String> emails = new ArrayList<>(rootToEmailList.get(rootMail));
            Collections.sort(emails);
            emails.add(0, emailToName.get(rootMail));
            ans.add(emails);
        }
        return ans;
    }

    public String find(Map<String, String> emailToEmail, String email){
        if(emailToEmail.get(email).equals(email))
            return email;
        else{
            return find(emailToEmail, emailToEmail.get(email));
        }
    }
}

results matching ""

    No results matching ""