力扣打卡2021.1.18 账号合并

题目:
给定一个列表 accounts,每个元素 accounts[i] 是一个字符串列表,其中第一个元素 accounts[i][0] 是 名称 (name),其余元素是 emails 表示该账户的邮箱地址。

现在,我们想合并这些账户。如果两个账户都有一些共同的邮箱地址,则两个账户必定属于同一个人。请注意,即使两个账户具有相同的名称,它们也可能属于不同的人,因为人们可能具有相同的名称。一个人最初可以拥有任意数量的账户,但其所有账户都具有相同的名称。

合并账户后,按以下格式返回账户:每个账户的第一个元素是名称,其余元素是按顺序排列的邮箱地址。账户本身可以以任意顺序返回。

示例 1:

输入:
accounts = [[“John”, “[email protected]”, “[email protected]”], [“John”, “[email protected]”], [“John”, “[email protected]”, “[email protected]”], [“Mary”, “[email protected]”]]
输出:
[[“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]’]] 也是正确的。

代码:

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

猜你喜欢

转载自blog.csdn.net/weixin_45780132/article/details/112778441