721.力扣每日一题7/15 Java(并查集)

  • 博客主页:音符犹如代码
  • 系列专栏:算法练习
  • 关注博主,后期持续更新系列文章
  • 如果有错误感谢请大家批评指出,及时修改
  • 感谢大家点赞👍收藏⭐评论✍

目录

解题思路

解题过程

时间复杂度

空间复杂度

Code


解题思路

本题的解题思想主要是利用并查集(Union Find)数据结构来合并具有相同账户名称的邮箱地址。首先,我们遍历所有账户信息,建立邮箱地址到唯一索引的映射(emailToIndex)和邮箱地址到账户名称的映射(emailToName)。这样做是为了能够快速地在后续步骤中查找邮箱的索引和对应的账户名称。

然后,我们使用并查集来跟踪哪些邮箱地址应该被合并到同一个账户中。对于每个账户,我们将其中的第一个邮箱地址作为代表,并将其与账户中的其他邮箱地址进行合并操作。这样,属于同一账户的邮箱地址在并查集中就会有相同的根节点。

最后,我们遍历所有邮箱地址,根据并查集的结果将它们分组到对应的账户中。对于每个组(即每个并查集的根节点),我们收集其下所有的邮箱地址,并从任意一个邮箱地址中获取对应的账户名称(因为我们已经假设了每个账户内的邮箱地址都关联到同一个名称)。然后,我们将账户名称和收集到的邮箱地址列表添加到结果列表中。

解题过程

  1. 初始化映射和计数器:创建emailToIndexemailToName映射,以及一个计数器emailsCount来跟踪邮箱地址的数量。

  2. 建立映射:遍历accounts列表,为每个邮箱地址分配一个唯一索引,并将其与账户名称关联起来。

  3. 构建并查集:创建UnionFind对象,并根据emailToIndex中的索引进行邮箱地址的合并操作。

  4. 分组邮箱地址:遍历所有邮箱地址,根据并查集的结果将它们分组到对应的账户中。

  5. 构建结果列表:对于每个分组,收集其下的邮箱地址,并从任意一个邮箱地址中获取账户名称,然后构建并添加到结果列表中。

时间复杂度

  • 遍历 accounts 列表建立映射的时间复杂度可以简化为 O(n),其中 n 是邮箱地址的总数(即 E)。
  • 构建并查集和进行合并操作的时间复杂度也是 O(n),因为每个邮箱地址最多被合并一次,并且 union 操作在并查集中通常是高效的。
  • 分组邮箱地址和构建结果列表的时间复杂度同样是 O(n),因为我们需要遍历所有邮箱地址一次。

因此,总的时间复杂度可以表示为 O(n),其中 n 是邮箱地址的总数。

空间复杂度

  • emailToIndexemailToName 映射和并查集都需要存储与邮箱地址数量成比例的信息,因此它们的空间复杂度都是 O(n)。
  • 结果列表的空间复杂度也是 O(n),因为每个邮箱地址在结果列表中只会出现一次(尽管它们被分组到了不同的账户中)。

因此,总的空间复杂度同样可以表示为 O(n),其中 n 是邮箱地址的总数。

Code

class Solution {public List<List<String>> accountsMerge(List<List<String>> accounts) {Map<String, Integer> emailToIndex = new HashMap<String, Integer>();Map<String, String> emailToName = new HashMap<String, String>();int emailsCount = 0;for (List<String> account : accounts) {String name = account.get(0);int size = account.size();for (int i = 1; i < size; i++) {String email = account.get(i);if (!emailToIndex.containsKey(email)) {emailToIndex.put(email, emailsCount++);emailToName.put(email, name);}}}UnionFind uf = new UnionFind(emailsCount);for (List<String> account : accounts) {String firstEmail = account.get(1);int firstIndex = emailToIndex.get(firstEmail);int size = account.size();for (int i = 2; i < size; i++) {String nextEmail = account.get(i);int nextIndex = emailToIndex.get(nextEmail);uf.union(firstIndex, nextIndex);}}Map<Integer, List<String>> indexToEmails = new HashMap<Integer, List<String>>();for (String email : emailToIndex.keySet()) {int index = uf.find(emailToIndex.get(email));List<String> account = indexToEmails.getOrDefault(index, new ArrayList<String>());account.add(email);indexToEmails.put(index, account);}List<List<String>> merged = new ArrayList<List<String>>();for (List<String> emails : indexToEmails.values()) {Collections.sort(emails);String name = emailToName.get(emails.get(0));List<String> account = new ArrayList<String>();account.add(name);account.addAll(emails);merged.add(account);}return merged;}
}
class UnionFind {  private int[] parent;  public UnionFind(int size) {  parent = new int[size];  for (int i = 0; i < size; i++) {  parent[i] = i;  }  }  public int find(int x) {  if (parent[x] != x) {  parent[x] = find(parent[x]); // 路径压缩  }  return parent[x];  }  public void union(int x, int y) {  int rootX = find(x);  int rootY = find(y);  if (rootX != rootY) {  parent[rootX] = rootY;  }  }  
}

 

你担心什么,什么就控制你——约翰·洛克(John Locke)

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

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

相关文章

有什么图片转word 免费软件?6个软件帮助你快速转换文件

有什么图片转word 免费软件&#xff1f;6个软件帮助你快速转换文件 转换图片到Word文档的免费软件通常包括一些在线工具和桌面应用程序&#xff0c;它们可以帮助用户将图片中的文本提取并转换为可编辑的Word格式。以下是六个推荐的免费软件&#xff1a; 迅捷文字识别&#xff…

【深度学习教程】

文章目录 pytorch官方教程知识蒸馏&#xff1a;https://pytorch.org/tutorials/beginner/knowledge_distillation_tutorial.html 李宏毅-机器学习/深度学习https://speech.ee.ntu.edu.tw/~hylee/ml/2021-spring.phphttps://speech.ee.ntu.edu.tw/~hylee/ml/2022-spring.phphttp…

【LeetCode】day18:530 - 二叉搜索树的最小绝对差, 501 - 二叉搜索树中的众数, 236 - 二叉树的最近公共祖先

LeetCode 代码随想录跟练 Day18 530.二叉搜索树的最小绝对差501.二叉搜索树中的众数236.二叉树的最近公共祖先 530.二叉搜索树的最小绝对差 题目描述&#xff1a; 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数&am…

基于组态王和S7-200实现传感器连接的简单人机界面

在当今社会&#xff0c;工业自动化正以前所未有的速度发展&#xff0c;成为推动经济增长和提升生产效率的关键因素之一。随着科技的不断进步&#xff0c;自动化不仅仅是制造业的专利&#xff0c;也逐渐渗透到农业、交通、建筑等各个领域&#xff0c;为人们的生活带来了诸多变革…

星际漫游闪耀LEC授权展,COSMOSPANDA星际熊猫与BUNBUNX包小冥共绘国潮新篇章

上海&#xff0c;2024年7月17日 —— 在全球瞩目的2024年LEC全球授权展上海站盛大开幕之际&#xff0c;星际漫游携其两大国潮明星IP——COSMOSPANDA星际熊猫与bunbunx包小冥精彩亮相&#xff0c;为现场观众带来了一场融合视觉与文化的国潮盛宴。 展位盛况空前&#xff0c;国潮…

uniapp封装请求拦截器,封装请求拦截和响应拦截的方法

首先我们先看一下uni官方给开发者提供的uni.request用来网络请求的api 1 2 3 4 5 6 7 8 9 uni.request({ url: , method: GET, data: {}, header: {}, success: res > {}, fail: () > {}, complete: () > {} }); 可以看到我们每次请求数据的时候都需…

pytest-fixture

资料来源&#xff1a;虫师2020的个人空间-虫师2020个人主页-哔哩哔哩视频 支持类似unittest风格的fixture&#xff0c;即setup和teardown class类中的方法分类 类方法可以直接调用&#xff0c;需要添加装饰器&#xff0c;修改类中的变量 实例方法&#xff0c;需要先实例化&…

【移动应用开发】创建Hello World应用

目录 一、安装Android Studio &#xff08;2023.1.28&#xff09; 二、创建HelloWorld的项目 1. 新建一个项目&#xff0c;选择Empty Views Activity 2. 点击next之后&#xff0c;为项目命名为HelloWorld 3. 点击Finish之后等待项目创建 三、观察项目结构 1. 选择以Proj…

预测性营销与开源AI智能名片商城系统的融合创新:探索数据驱动的营销新纪元

摘要&#xff1a;在当今这个数据驱动的时代&#xff0c;企业面临着前所未有的市场复杂性和消费者行为的快速变化。为了在这样的环境中保持竞争力并实现持续增长&#xff0c;预测性营销已成为企业不可或缺的战略工具。本文深入探讨了预测性营销的基本原理、技术架构及其在市场营…

常用注意力机制 SENet CBAM ECA

在处理脑电信号时通常会用到一些注意力机制,来给不同的脑电通道不同的权重,进而体现出不同脑电通道在分类中的重要性。下面整理几种常见的通道注意力机制,方便以后查阅。 常用注意力机制 SENet CBAM ECA 注意力机制SENet(Squeeze-and-Excitation Network)SENet原理SENet P…

MySQL相关知识

一、什么是数据库&#xff1f; 数据库&#xff08;Database&#xff0c;简称DB&#xff09;概念&#xff1a; 长期存放在计算机内&#xff0c;有组织、可共享的大量数据的集合&#xff0c;是一个 数据“仓库”。 二、数据库的特点&#xff1a; 1.结构化&#xff1a;数据在数…

【leetcode】二分查找本质

标题&#xff1a;【leetcode】二分查找本质 水墨不写bug 正文开始&#xff1a;&#xff08;点击题目标题转跳到OJ&#xff09; 目录 &#xff08;O&#xff09;前言* &#xff08;一&#xff09; 在排序数组中查找元素的第一个和最后一个位置 思路详解&#xff1a; 参考代…

Python 爬虫 获取Instagram用户数据信息 Instagram API接口

爬取instagram用户主页数据信息 详细采集页面如下 https://www.instagram.com/abdallhdev/?hlen 请求API http://api.xxxx.com/ins/profile/username?usernameabdallhdev&tokentest 请求参数 返回示例 联系我们&#xff08;更多接口详见主页专栏&#xff09; 更多精彩…

Redis--12--1--分布式锁---java

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Redis与分布式锁Jedis实现1.RedisConfig2.RedisDistLock3.应用4.加上看门狗逻辑 RedisDistLockWithDog redisson实现1.依赖2.代码 Redis与分布式锁 Jedis实现 1.Re…

VScode通过Graphviz插件和dot文件绘制层次图,导出svg

1、安装插件 在VScode中安装Graphviz Interactive Preview插件&#xff0c;参考。 2、创建dot文件 在本地创建一个后缀为dot的文件&#xff0c;如test.dot&#xff0c;并写入以下内容&#xff1a; digraph testGraph {label "层次图";node [shape square; widt…

一文读懂英伟达A800的性能及应用场景

随着人工智能&#xff08;AI&#xff09;和高性能计算&#xff08;HPC&#xff09;领域的快速发展&#xff0c;对处理器的性能要求日益提高。英伟达&#xff08;NVIDIA&#xff09;作为全球领先的图形处理器&#xff08;GPU&#xff09;和人工智能技术公司&#xff0c;不断推出…

全国区块链职业技能大赛国赛考题区块链产品需求分析与方案设计

任务1-1:区块链产品需求分析与方案设计 本任务需要依据项目背景完成需求分析与方案设计,具体要求如下: 依据给定区块链食品溯源系统的业务架构图,对考题进行业务分析,尽可能多的去考虑一个业务系统所需要的模块,使用Visio或思维导图工具展现本系统的基本设计概念和处理流…

python基础语法 007 文件操作-2文件支持模式文件的内置函数

1.3 文件支持的模式 模式含义ropen a file for reading(default)wopen a file for writing,creates a new file if it does not exist or truncates the file if it exists x open a file foe exclusive creation. if the file already exists, the operation fails.独创模式&…

约束

概述 概念 约束是作用于表中字段上的规则&#xff0c;用于限制存储在表中的数据。 目的 保证数据库中数据的正确、有效性和完整性。 分类 【注意】约束是作用于表中字段上的&#xff0c;可以在创建表/修改表的时候添加约束。 约束演示 根据需求&#xff0c;完成表结构的…

Docker核心技术:应用架构演进

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 Docker核心技术 系列文章&#xff1a;应用架构演进&#xff0c;其他文章快捷链接如下&#xff1a; 应用架构演进&#xff08;本文&#xff09;容器技术要解决哪些问题Docker的基本使用Docker是如何实现的 1.1.架…