Leetcode 721.账户合并(hash+dfs)☆

思路:

最核心的地方在于如何合并?这里是通过具有相同的email进行账户的合并,这个相同的email类似于图中的共同节点将两个账户连接起来,所以将原来

账户名 -> 邮件1 邮件2.。。变成hash

邮件1 ->账户id1,账户id2。。

方便进行具有相同邮件的账户id进行合并,合并成一个新的mergedaccount再sort一下保存即可。

代码:

cpp 复制代码
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集合
        
        // 定义匿名函数dfs
        function<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_emails
            vector<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

相关推荐
丸码17 小时前
Java HashMap深度解析
算法·哈希算法·散列表
初夏睡觉18 小时前
全排列题解
算法·深度优先·图论
在下赵某人19 小时前
概率数据结构的设计原理与误差分析
数据结构·算法·哈希算法
CoderYanger19 小时前
递归、搜索与回溯-综合练习:19.目标和
java·算法·leetcode·1024程序员节
路过君_P20 小时前
C++ 算法题解:迷宫寻路
c++·算法·深度优先
吃着火锅x唱着歌21 小时前
LeetCode 3185.构成整天的下标对数目II
算法·leetcode·职场和发展
资深web全栈开发21 小时前
LeetCode 1590:使数组和能被 p 整除(前缀和 + 哈希表优化)
算法·leetcode·前缀和·算法优化·哈希表·go 语言·取模运算
CoderYanger21 小时前
递归、搜索与回溯-综合练习:27.黄金矿工
java·算法·leetcode·深度优先·1024程序员节
sin_hielo1 天前
leetcode 1590
数据结构·算法·leetcode
吃着火锅x唱着歌1 天前
LeetCode 2748.美丽下标对的数目
数据结构·算法·leetcode