leetcode721. 合并账户【两种方法;并查集;dfs】

文章目录

  • 并查集(方法一)
  • dfs(方法二)
  • dfs换一种写法

在这里插入图片描述
在这里插入图片描述

并查集(方法一)

class Solution {unordered_map<string, int> index; // 每个邮箱都有一个唯一编号int root[10010];                  // 并查集void unionset(int a, int b) {int rt1 = findrt(a), rt2 = findrt(b);if (rt1 == rt2) return; // 很重要root[rt1] += root[rt2];root[rt2] = rt1;}int findrt(int a) {if (root[a] < 0) return a;return root[a] = findrt(root[a]);}public:vector<vector<string>> accountsMerge(vector<vector<string>>& accounts) {memset(root, -1, sizeof(root));// 给出indexfor (int i = 0; i < accounts.size(); i++) {for (int j = 1; j < accounts[i].size(); j++) {index[accounts[i][j]]++;}}int email_cnt = 0;for (auto it = index.begin(); it != index.end(); it++) {it->second = email_cnt++;}// 并for (int i = 0; i < accounts.size(); i++) {for (int j = 2; j < accounts[i].size(); j++) {unionset(index[accounts[i][j - 1]], index[accounts[i][j]]);}}// 查unordered_map<int, int> rt_and_ansIndex;vector<vector<string>> ans;for (int i = 0; i < accounts.size(); i++) {int rt_index = findrt(index[accounts[i][1]]);if (rt_and_ansIndex.count(rt_index) == 0) {rt_and_ansIndex[rt_index] = ans.size();ans.push_back(vector<string>());ans.back().push_back(accounts[i][0]); // 账户名}for (int j = 1; j < accounts[i].size(); j++) {ans[rt_and_ansIndex[rt_index]].push_back(accounts[i][j]); // 邮箱}}for (int i = 0; i < ans.size(); i++) {sort(ans[i].begin() + 1, ans[i].end()); // 排序ans[i].erase(unique(ans[i].begin() + 1, ans[i].end()), ans[i].end()); // 去重}return ans;}
};

在这里插入图片描述

dfs(方法二)

class Solution {unordered_map<string, int> index; // 每个邮箱都有一个唯一编号string emails[10010];vector<vector<int>> g; // 图,邻接表存法bool visited[10010];vector<vector<string>> ans;void dfs(int n) {visited[n] = true;ans.back().push_back(emails[n]);for (int i = 0; i < g[n].size(); i++) {if (!visited[g[n][i]]) {dfs(g[n][i]);}}return;}public:vector<vector<string>> accountsMerge(vector<vector<string>>& accounts) {memset(visited, false, sizeof(visited));// 给出indexfor (int i = 0; i < accounts.size(); i++) {for (int j = 1; j < accounts[i].size(); j++) {index[accounts[i][j]]++;}}int email_cnt = 0;for (auto it = index.begin(); it != index.end(); it++) {it->second = email_cnt++;emails[it->second] = it->first;}g.resize(email_cnt);// 建图for (int i = 0; i < accounts.size(); i++) {for (int j = 2; j < accounts[i].size(); j++) {g[index[accounts[i][1]]].push_back(index[accounts[i][j]]);g[index[accounts[i][j]]].push_back(index[accounts[i][1]]); //双向边}}// dfsfor (int i = 0; i < accounts.size(); i++) {if (!visited[index[accounts[i][1]]]) {ans.push_back(vector<string>());ans.back().push_back(accounts[i][0]);dfs(index[accounts[i][1]]);}}for (int i = 0; i < ans.size(); i++) {sort(ans[i].begin() + 1, ans[i].end()); // 排序ans[i].erase(unique(ans[i].begin() + 1, ans[i].end()),ans[i].end()); // 去重}return ans;}
};

在这里插入图片描述

dfs换一种写法

class Solution {unordered_map<string, vector<string>> g; // 图,邻接表存法,存邮箱,而不是set<string> visited;vector<vector<string>> ans;void dfs(string str) {visited.insert(str);ans.back().push_back(str);for (int i = 0; i < g[str].size(); i++) {if (visited.count(g[str][i]) == 0) {dfs(g[str][i]);}}return;}public:vector<vector<string>> accountsMerge(vector<vector<string>>& accounts) {// 建图for (int i = 0; i < accounts.size(); i++) {for (int j = 2; j < accounts[i].size(); j++) {g[accounts[i][1]].push_back(accounts[i][j]);g[accounts[i][j]].push_back(accounts[i][1]);}}// dfsfor (int i = 0; i < accounts.size(); i++) {if (visited.count(accounts[i][1]) == 0) {ans.push_back(vector<string>());ans.back().push_back(accounts[i][0]);dfs(accounts[i][1]);}}for (int i = 0; i < ans.size(); i++) {sort(ans[i].begin() + 1, ans[i].end()); // 排序ans[i].erase(unique(ans[i].begin() + 1, ans[i].end()), ans[i].end()); // 去重}return ans;}
};

在这里插入图片描述
如果unordered_map改为map,更慢。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/587390.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

穿什么有这么重要?--装饰模式

1.1 穿什么有这么重要&#xff1f; 约会穿什么&#xff1f; "那要看你想给人家什么印象&#xff1f;是比较年轻&#xff0c;还是比较干练&#xff1b;是比较颓废&#xff0c;还是要比较阳光&#xff1b;也有可能你想给人家一种极其难忘的印象&#xff0c;那穿法又大不一样…

Vue3_2024_7天【回顾上篇watch常见的后两种场景】完

随笔&#xff1a;这年头工作不好找咯&#xff0c;大家有学历提升的赶快了&#xff0c;还有外出人多注意身体&#xff0c;没错我在深圳这边阳了&#xff0c;真的绝啊&#xff0c;最尴尬的还给朋友传染了&#xff01;&#xff01;&#xff01; 之前三种的监听情况&#xff0c;监听…

【高校科研动态】贵州师大博士生封清为一作在J. Clean. Prod.发文:中国扶贫搬迁对生态影响的量化研究——以贵州省为例

目录 1.文章简介 2.主要研究内容 3.文章引用 1.文章简介 论文名称&#xff1a;Quantifying the extent of ecological impact from Chinas poverty alleviation relocation program: A case study in Guizhou Province 第一作者及通讯作者&#xff1a;封清&#…

一文教你如何使用sngrep跟踪分析sip信令

sngrep是一个用于分析SIP信令的工具&#xff0c;它可以捕获和解码SIP信令也是一款专业的sip抓包工具&#xff0c;且可以解析tcpdump抓出来的包。 sip协议&#xff08;会话初始协议&#xff09;&#xff0c;是一种多媒体通信协议&#xff1b; sip协议的消息主体&#xff08;报文…

联系媒体要有方法莫让投稿发文章只剩一声长叹相见恨晚

曾有一位饱经世事的前辈以一句至理名言警醒世人:“人之所以领悟道理,往往不是源于抽象的道理本身,而是生活给予的实实在在的挫折教训,如同撞南墙一般的痛彻觉醒;同样,让人豁然开朗的,也不是空洞的说教,而是实实在在的人生磨砺。”这一哲理,放在我们日常工作中亦有深刻的启示作用…

ISELED氛围灯方案简介

ISELED目录 一、ISELED 介绍二、ISELED联盟三、ISELED的应用方向四、NXP在ISELED上的贡献一、ISELED 介绍 在当今汽车行业疯狂内卷的时代,各车企把更多精力花费在了车辆内部座舱的设计上,氛围灯出现其实已经有好多年,从最开始的单色氛围灯,到64色、128氛围灯,再到现在的2…

Linux系统----------探索mysql数据库MHA高可用

目录 一、MHA概述 1.1 什么是 MHA 1.2MHA 的组成 1.2.1MHA Node&#xff08;数据节点&#xff09; 1.2.2MHA Manager&#xff08;管理节点&#xff09; 1.3MHA 的特点 1.4MHA工作原理 1.5数据同步的方式 1.5.1同步复制 1.5.2异步复制 1.5.3半同步复制 二、搭建 MySQ…

CTK插件框架学习-信号槽(05)

CTK插件框架学习-事件监听(04)https://mp.csdn.net/mp_blog/creation/editor/137171155 一、主要流程 信号发送者告诉服务要发送的信号信号发送者发送信号信号接收者告诉服务当触发某个订阅的主题时通知槽函数信号接收者处理槽函数信号槽参数类型必须为&#xff08;const ctk…

redis数据类型介绍

字符串string&#xff1a; 字符串类型是Redis中最为基础的数据存储类型&#xff0c;是一个由字节组成的序列&#xff0c;他在Redis中是二进制安全的&#xff0c;这便意味着该类型可以接受任何格式的数据&#xff0c;如JPEG图像数据货Json对象描述信息等&#xff0c;是标准的key…

蓝桥杯嵌入式学习笔记(7):ADC程序设计

目录 前言 1. ADC原理 1.1 主要特性 1.2 模拟输出电路图 2. 使用CubeMX进行源工程的配置 2.1 引脚配置 2.2 配置AD1 2.3 配置AD2 2.4 配置时钟 3. 代码编程 3.1 预备工作 3.2 bsp_adc.h文件编写 3.3 bsp_adc.c文件编写 3.4 main.c编写 3.4.1 时钟函数配置 3…

windows下通过vscode访问ubuntu(绝大部分Linux下开发所采用的方案)

前言 本篇博客是介绍VSCode远程连接Ubuntu进行开发的解决方案&#xff0c;前提是安装好了VMWare&#xff0c;Ubuntu&#xff0c;windows下的VSCode。 嵌入式驱动学习专栏将详细记录博主学习驱动的详细过程&#xff0c;未来预计四个月将高强度更新本专栏&#xff0c;喜欢的可以关…

黄金票据攻击

黄金票据攻击——域内横向移动技术 一、黄金票据攻击介绍&#xff1a; 黄金票据攻击是一种滥用Kerberos身份认证协议的攻击方式&#xff0c;它允许攻击者伪造域控krbtgt用户的TGT&#xff08;Ticket-Granting Ticket&#xff09;。通过这种方法&#xff0c;攻击者可以生成有效…