Consolidación de cuenta

Dada una lista de cuentas cuentasa c c o u n t s , cada elementocuenta [i] cuentas [i]un c c o u n t s [ i ] es una lista de cadenas, donde el primer elemento decuentas [i] [0] cuentas [i] [0]un c c o u n t s [ i ] [ 0 ] es el nombre (nombre), y los elementos restantes son mensajes de correo electrónico, lo que significa 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:

entrar:

accounts = [["John", "[email protected]", "[email protected]"], ["John", "[email protected]"], ["John", "[email protected]", "[email protected]"], ["Mary", "[email protected]"]]

Salida:

[["John", '[email protected]', '[email protected]', '[email protected]'],  ["John", "[email protected]"], ["Mary", "[email protected]"]]
解释:
第一个和第三个 John 是同一个人,因为他们有共同的邮箱地址 "[email protected]"。 
第二个 John 和 Mary 是不同的人,因为他们的邮箱地址没有被其他帐户使用。
可以以任何顺序返回这些列表,例如答案 [['Mary''[email protected]']['John''[email protected]']['John''[email protected]''[email protected]''[email protected]']] 也是正确的。

rápido:

cuentas cuentas La longitud de un c c o u n t s estará en[1, 1000] [1, 1000][ 1 , 1 0 0 0 ] .
cuentas [i] cuentas [i]un c c o u n t s [ i ] será de longitud[1, 10] [1, 10][ 1 , 1 0 ] .
cuentas [i] [j] cuentas [i] [j]un c c o u n t s [ i ] [ j ] serán de longitud[1, 30] [1, 30][ 1 , 3 0 ] .

class Solution {
    
    
public:
    int f[10000];
    int find(int x){
    
    
        return x==f[x]?x:f[x]=find(f[x]);
    }
    vector<vector<string>> accountsMerge(vector<vector<string>>& accounts) {
    
    
        int n=accounts.size();
        unordered_map<string,int>ma;
        for (int i=0;i<10000;i++){
    
    
            f[i]=i;
        }
        for (int i=0;i<n;i++){
    
    
            int m=accounts[i].size();
            for (int j=1;j<m;j++){
    
    
                if (ma.count(accounts[i][j])==0){
    
    
                    ma[accounts[i][j]]=i;
                }
                f[find(i)]=find(ma[accounts[i][j]]);
            }
        }
        unordered_map<int,vector<string> >ma1;
        for (auto &[str,i]:ma){
    
    
            ma1[find(i)].push_back(str);
        }
        vector<vector<string>>res;
        for (auto &[i,vec]:ma1){
    
    
            sort(vec.begin(),vec.end());
            vector<string>tmp;
            tmp.push_back(accounts[find(i)][0]);
            tmp.insert(tmp.end(),vec.begin(),vec.end());
            res.push_back(tmp);
        }
        return res;
    }
};

Supongo que te gusta

Origin blog.csdn.net/weixin_43601103/article/details/112763190
Recomendado
Clasificación