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

相关推荐
星空下的曙光13 小时前
Node.js crypto模块所有 API 详解 + 常用 API + 使用场景
算法·node.js·哈希算法
2351615 小时前
【LeetCode】146. LRU 缓存
java·后端·算法·leetcode·链表·缓存·职场和发展
tkevinjd18 小时前
反转链表及其应用(力扣2130)
数据结构·leetcode·链表
程序员烧烤20 小时前
【leetcode刷题007】leetcode116、117
算法·leetcode
Swift社区1 天前
LeetCode 395 - 至少有 K 个重复字符的最长子串
算法·leetcode·职场和发展
Espresso Macchiato1 天前
Leetcode 3710. Maximum Partition Factor
leetcode·职场和发展·广度优先遍历·二分法·leetcode hard·leetcode 3710·leetcode双周赛167
少许极端1 天前
算法奇妙屋(六)-哈希表
java·数据结构·算法·哈希算法·散列表·排序
巴里巴气1 天前
第15题 三数之和
数据结构·算法·leetcode
西阳未落1 天前
LeetCode——双指针(进阶)
c++·算法·leetcode
熬了夜的程序员1 天前
【LeetCode】69. x 的平方根
开发语言·算法·leetcode·职场和发展·动态规划