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

相关推荐
dying_man1 小时前
LeetCode--42.接雨水
算法·leetcode
黑听人2 小时前
【力扣 困难 C】115. 不同的子序列
c语言·leetcode
前端拿破轮4 小时前
🤡🤡🤡面试官:就你这还每天刷leetcode?连四数相加和四数之和都分不清!
算法·leetcode·面试
无聊的小坏坏6 小时前
单调栈通关指南:从力扣 84 到力扣 42
c++·算法·leetcode
Yasin Chen10 小时前
C# Dictionary源码分析
算法·unity·哈希算法
FirstFrost --sy19 小时前
数据结构之二叉树
c语言·数据结构·c++·算法·链表·深度优先·广度优先
qq_5139704421 小时前
力扣 hot100 Day37
算法·leetcode
不見星空21 小时前
leetcode 每日一题 1865. 找出和为指定值的下标对
算法·leetcode
chao_7891 天前
回溯题解——子集【LeetCode】二进制枚举法
开发语言·数据结构·python·算法·leetcode
GEEK零零七1 天前
Leetcode 1070. 产品销售分析 III
sql·算法·leetcode