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

相关推荐
sheeta19982 小时前
LeetCode 每日一题笔记 日期:2025.03.24 题目:2906.构造乘积矩阵
笔记·leetcode·矩阵
老鼠只爱大米8 小时前
LeetCode经典算法面试题 #295:数据流的中位数(双堆法、有序列表、平衡树等多种实现方案详解)
算法·leetcode·优先队列··数据流·中位数·java 面试题
x_xbx8 小时前
LeetCode:215. 数组中的第K个最大元素
数据结构·算法·leetcode
进击的荆棘9 小时前
优选算法——分治
数据结构·算法·leetcode·分治
木井巳10 小时前
【递归算法】找出所有子集的异或总和再求和
java·算法·leetcode·决策树·深度优先
Aaswk11 小时前
回溯算法的本质理解
c语言·算法·leetcode·力扣·剪枝
迷海11 小时前
力扣原题《分发糖果》,采用二分原则,纯手搓,待验证
c++·算法·leetcode
玛卡巴卡ldf11 小时前
【LeetCode 手撕算法】(普通数组)53-最大子数组和、56-合并区间、189-轮转数组、238-除了自身以外数组的乘积
数据结构·算法·leetcode
Sakinol#11 小时前
Leetcode Hot 100 ——动态规划part02
算法·leetcode·动态规划
Frostnova丶12 小时前
LeetCode 238 & 2906.构造乘积数组与乘积矩阵
算法·leetcode·矩阵