721. 账户合并

并查集就能实现,我都忘了并查集了,唉

用map记录每个邮箱的账号,再此之前判断该邮箱是否已经在map中有value,即该邮箱是否已经标记了账户

如果有,那就将当前邮箱的所有账号,转移到标记的账户

如果当前账户下的多个邮箱在map中有不同的value,那就统一转移到第一个value即可

用set存储每个邮箱的账户

class Solution {
public:

    set<string> s[1010];
    vector<vector<string>> ret;
    map<string, int> mmap;
    int vis[1010];
    void move(int flag, int k)
    {
        flag -= 1;
        k -= 1;
        vis[k] = 0;
        for(set<string>::iterator it = s[k].begin(); it != s[k].end(); it++)
        {
            s[flag].insert(*it);
            mmap[*it] = flag + 1;
        }
    }

    vector<vector<string>> accountsMerge(vector<vector<string>>& accounts) {
        int len1 = accounts.size();
        memset(vis, 0, sizeof(vis));
        for(int i = 0; i < len1; i++)
        {
            int len2 = accounts[i].size();
            int flag = -1;
            for(int j = 1; j < len2; j++)
            {
                if(mmap[accounts[i][j]])
                {
                    if(flag == -1)
                        flag = mmap[accounts[i][j]];
                    else if(mmap[accounts[i][j]] != flag)
                        move(flag, mmap[accounts[i][j]]);
                }
            }
            if(flag == -1)
            {
                vis[i] = 1;
                for(int j = 1; j < len2; j++)
                {
                    s[i].insert(accounts[i][j]);
                    mmap[accounts[i][j]] = i + 1;
                }
            }
            else
            {
                for(int j = 1; j < len2; j++)
                {
                    s[flag - 1].insert(accounts[i][j]);
                    mmap[accounts[i][j]] = flag;
                }
            }
        }

        int ans = 0;
        vector<string> v;
        for(int i = 0; i < len1; i++)
        {
            v.clear();
            if(vis[i])
            {
                // cout << 111 << endl;                
                v.push_back(accounts[i][0]);
                for(set<string>::iterator it = s[i].begin(); it != s[i].end(); it++)
                {
                    v.push_back(*it);
                }
                ret.push_back(v);
            }
        }
        return ret;

    }
};
自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。
原文地址:https://www.cnblogs.com/WTSRUVF/p/15381327.html