Likou perforando en 2021.1.18 fusión de cuentas

Tema:
Dada una lista de cuentas, cada elemento cuentas [i] es una lista de cadenas, donde el primer elemento cuentas [i] [0] es el nombre (nombre), y los elementos restantes son correos electrónicos que representan la dirección de correo electrónico de la cuenta.

Ahora, queremos fusionar estas cuentas. Si dos cuentas tienen algunas direcciones de correo electrónico en común, las dos cuentas deben pertenecer a la misma persona. Tenga en cuenta que incluso si dos cuentas tienen el mismo nombre, pueden pertenecer a diferentes personas porque las personas pueden tener el mismo nombre. Una persona puede tener inicialmente cualquier número de cuentas, pero todas sus cuentas tienen el mismo nombre.

Después de fusionar las cuentas, las cuentas se devuelven en el siguiente formato: el primer elemento de cada cuenta es el nombre y los elementos restantes son las direcciones de correo electrónico en orden. La cuenta en sí se puede devolver en cualquier orden.

Ejemplo 1:

Ingresa:
cuentas = [["John", "[email protected]", "[email protected]"], ["John", "[email protected]"], ["John", "johnsmith @ mail .com "," [email protected] "], [" Mary "," [email protected] "]]
salida:
[[" John ", '[email protected]', '[email protected]' , 'johnsmith @ mail.com'], ["John", "[email protected]"], ["Mary", "[email protected]"]]
Explicación: El
primer y tercer John son las mismas personas, porque tienen una dirección de correo electrónico común "[email protected]".
El segundo John y Mary son personas diferentes porque sus direcciones de correo electrónico no son utilizadas por otras cuentas.
Estas listas se pueden devolver en cualquier orden, como las respuestas [['Mary', '[email protected]'], ['John', '[email protected]'],
['John', 'john00 @ mail .com ',' john_newyork @ mail.com ',' [email protected] ']] también son correctas.

Código:

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;
    }
};

Supongo que te gusta

Origin blog.csdn.net/weixin_45780132/article/details/112778441
Recomendado
Clasificación