思路:
最核心的地方在于如何合并?这里是通过具有相同的email进行账户的合并,这个相同的email类似于图中的共同节点将两个账户连接起来,所以将原来
账户名 -> 邮件1 邮件2.。。变成hash
邮件1 ->账户id1,账户id2。。
方便进行具有相同邮件的账户id进行合并,合并成一个新的mergedaccount再sort一下保存即可。
代码:
class Solution {
public: // 原本给的是 用户名1 邮箱1 邮箱2 ...// 这里类似于邮箱作为连接节点, 邮箱1 用户1 用户2 ...(深度搜索合并起来)-->变这样存储vector<vector<string>> accountsMerge(vector<vector<string>>& accounts) {int n = accounts.size();unordered_map<string, vector<int>> mp;for(int i = 0; i < accounts.size(); i ++)for(int j = 1; j < accounts[i].size(); j ++)mp[accounts[i][j]].push_back(i); // 映射到账户记录上vector<bool> st(n, false); // 访问过的账户状态数组unordered_set<string> cur_emails; // 当前账户的所有emails集合// 定义匿名函数dfsfunction<void(int)> dfs = [&](int u) -> void { st[u] = true; // 打上访问过的标记for(int i = 1; i < accounts[u].size(); i ++){const string& t = accounts[u][i];if(cur_emails.count(t) == 0){ // 没加过才需要加入cur_emails.insert(t); // 查询拥有此email的其他账户的邮箱信息for(int idx: mp[t])if(!st[idx]) dfs(idx);}}};vector<vector<string>> mergedAccount;for(int i = 0; i < n; i ++){if(st[i]) continue; // 深搜后的账户记得跳过cur_emails.clear(); // 每次进入dfs前记得清空dfs(i); // 得到结果cur_emailsvector<string> t; // 合并后的记录t.push_back(accounts[i][0]); // 先插入第一个元素, 名字t.insert(t.end(), cur_emails.begin(), cur_emails.end());// 在t的末尾依次插入cur_emails的每一个元素sort(t.begin() + 1, t.end());mergedAccount.push_back(t);}return mergedAccount;}
};
其他:
①匿名函数的使用:
C++匿名函数lambda使用(闭包)-CSDN博客https://blog.csdn.net/zjjaibc/article/details/140640969?spm=1001.2014.3001.5501②