Likou lance la fusion de comptes 2021.1.18

Sujet:
Étant donné une liste de comptes, chaque élément comptes [i] est une liste de chaînes, où le premier élément comptes [i] [0] est le nom (nom) et les éléments restants sont des e-mails qui représentent l'adresse e-mail de le compte.

Maintenant, nous voulons fusionner ces comptes. Si deux comptes ont des adresses e-mail communes, les deux comptes doivent appartenir à la même personne. Veuillez noter que même si deux comptes ont le même nom, ils peuvent appartenir à des personnes différentes car les personnes peuvent avoir le même nom. Une personne peut initialement avoir n'importe quel nombre de comptes, mais tous ses comptes portent le même nom.

Après la fusion des comptes, les comptes sont renvoyés dans le format suivant: le premier élément de chaque compte est le nom, et les éléments restants sont les adresses e-mail dans l'ordre. Le compte lui-même peut être retourné dans n'importe quel ordre.

Exemple 1:

Saisissez:
accounts = [["John", "[email protected]", "[email protected]"], ["John", "[email protected]"], ["John", "johnsmith @ mail .com "," [email protected] "], [" Mary "," [email protected] "]]
sortie:
[[" John ", '[email protected]', '[email protected]' , 'johnsmith @ mail.com'], ["John", "[email protected]"], ["Mary", "[email protected]"]]
Explication: Le
premier et le troisième Jean sont les mêmes individus, car ils ont une adresse e-mail commune "[email protected]".
Le second John et Mary sont des personnes différentes car leurs adresses e-mail ne sont pas utilisées par d'autres comptes.
Ces listes peuvent être renvoyées dans n'importe quel ordre, comme les réponses [['Mary', '[email protected]'], ['John', '[email protected]'],
['John', 'john00 @ mail .com ',' john_newyork @ mail.com ',' [email protected] ']] sont également corrects.

Code:

class UnionFind {
    
    
public:
    vector<int> parent;

    UnionFind(int n) {
    
    
        parent.resize(n);
        for (int i = 0; i < n; i++) {
    
    
            parent[i] = i;
        }
    }

    void unionSet(int index1, int index2) {
    
    
        parent[find(index2)] = find(index1);
    }

    int find(int index) {
    
    
        if (parent[index] != index) {
    
    
            parent[index] = find(parent[index]);
        }
        return parent[index];
    }
};

class Solution {
    
    
public:
    vector<vector<string>> accountsMerge(vector<vector<string>>& accounts) {
    
    
        map<string, int> emailToIndex;
        map<string, string> emailToName;
        int emailsCount = 0;
        for (auto& account : accounts) {
    
    
            string& name = account[0];
            int size = account.size();
            for (int i = 1; i < size; i++) {
    
    
                string& email = account[i];
                if (!emailToIndex.count(email)) {
    
    
                    emailToIndex[email] = emailsCount++;
                    emailToName[email] = name;
                }
            }
        }
        UnionFind uf(emailsCount);
        for (auto& account : accounts) {
    
    
            string& firstEmail = account[1];
            int firstIndex = emailToIndex[firstEmail];
            int size = account.size();
            for (int i = 2; i < size; i++) {
    
    
                string& nextEmail = account[i];
                int nextIndex = emailToIndex[nextEmail];
                uf.unionSet(firstIndex, nextIndex);
            }
        }
        map<int, vector<string>> indexToEmails;
        for (auto& [email, _] : emailToIndex) {
    
    
            int index = uf.find(emailToIndex[email]);
            vector<string>& account = indexToEmails[index];
            account.emplace_back(email);
            indexToEmails[index] = account;
        }
        vector<vector<string>> merged;
        for (auto& [_, emails] : indexToEmails) {
    
    
            sort(emails.begin(), emails.end());
            string& name = emailToName[emails[0]];
            vector<string> account;
            account.emplace_back(name);
            for (auto& email : emails) {
    
    
                account.emplace_back(email);
            }
            merged.emplace_back(account);
        }
        return merged;
    }
};

Je suppose que tu aimes

Origine blog.csdn.net/weixin_45780132/article/details/112778441
conseillé
Classement