面试题.17.07.婴儿名字--并查集

2023-10-26

LeetCode

面试题 17.07.婴儿名字

每年,政府都会公布一万个最常见的婴儿名字和它们出现的频率,也就是同名婴儿的数量。有些名字有多种拼法,例如,John 和 Jon 本质上是相同的名字,但被当成了两个名字公布出来。给定两个列表,一个是名字及对应的频率,另一个是本质相同的名字对。设计一个算法打印出每个真实名字的实际频率。注意,如果 John 和 Jon 是相同的,并且 Jon 和 Johnny 相同,则 John 与 Johnny 也相同,即它们有传递和对称性。

在结果列表中,选择字典序最小的名字作为真实名字。

示例:

输入:names = ["John(15)","Jon(12)","Chris(13)","Kris(4)","Christopher(19)"], synonyms = ["(Jon,John)","(John,Johnny)","(Chris,Kris)","(Chris,Christopher)"]
输出:["John(27)","Chris(36)"]

解法:并查集

解题思路:

用并查集的思想就是,如果两个名字分属两个不同的集合,那么就将这两个集合合并,然后计算出新的出现次数

代码如下:

class Solution {
    public String[] trulyMostPopular(String[] names, String[] synonyms) {
        Map<String, Integer> map = new HashMap<>();
        Map<String, String> unionMap = new HashMap<>();     //并查集, key(子孙)->value(祖宗)
        for (String name : names) 
        {     //统计频率
            int idx1 = name.indexOf('(');
            int idx2 = name.indexOf(')');
            int frequency = Integer.valueOf(name.substring(idx1 + 1, idx2));
            map.put(name.substring(0, idx1), frequency);
        }
        for (String pair : synonyms) 
        {  //union同义词
            int idx = pair.indexOf(',');
            String name1 = pair.substring(1, idx);
            String name2 = pair.substring(idx + 1, pair.length() - 1);
            while (unionMap.containsKey(name1)) 
            {   //找name1祖宗
                name1 = unionMap.get(name1);
            }
            while (unionMap.containsKey(name2)) 
            {   //找name2祖宗
                name2 = unionMap.get(name2);
            }
            if(!name1.equals(name2))
            {   //祖宗不同,要合并
                int frequency = map.getOrDefault(name1, 0) + map.getOrDefault(name2, 0);    //出现次数是两者之和
                String trulyName = name1.compareTo(name2) < 0 ? name1 : name2;
                String nickName = name1.compareTo(name2) < 0 ? name2 : name1;
                unionMap.put(nickName, trulyName);      //小名作为大名的分支,即大名是小名的祖宗
                map.remove(nickName);       //更新一下数据
                map.put(trulyName, frequency);
            }
        }
        String[] res = new String[map.size()];
        int index = 0;
        for (String name : map.keySet()) 
        {
            StringBuilder sb = new StringBuilder(name);
            sb.append('(');
            sb.append(map.get(name));
            sb.append(')');
            res[index++] = sb.toString();
        }
        return res;
    }
}

解法来源

作者:accountofjizhiwei
链接:https://leetcode-cn.com/problems/baby-names-lcci/solution/bing-cha-ji-si-lu-yong-hashmapzuo-95ms-by-accounto/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

感想

在做这道题时,其实我的思路还是挺清晰的,但是太执着于用parent数组来实现并查集,没想到还可以用哈希表来当做并查集的树,学到了

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

面试题.17.07.婴儿名字--并查集 的相关文章

  • 朋友圈--并查集

    LeetCode 朋友圈 班上有 N 名学生 其中有些人是朋友 有些则不是 他们的友谊具有是传递性 如果已知 A 是 B 的朋友 B 是 C 的朋友 那么我们可以认为 A 也是 C 的朋友 所谓的朋友圈 是指所有朋友的集合 给定一个 N N
  • 面试题.17.07.婴儿名字--并查集

    LeetCode 面试题 17 07 婴儿名字 每年 政府都会公布一万个最常见的婴儿名字和它们出现的频率 也就是同名婴儿的数量 有些名字有多种拼法 例如 John 和 Jon 本质上是相同的名字 但被当成了两个名字公布出来 给定两个列表 一
  • python: 字典 (dict) 的使用

    摘要 在刷 leecode 的题目时 会经常使用哈希表 在 python 中称为字典 dict 由于本人平时不怎么多使用字典 在真正运用时经常忘记其常规用法 特别是其成员函数的使用 因此 本人根据自己在刷 leecode 时经常使用字典的方
  • 哈希表:线性探测法和链地址法求查找成功与不成功的平均查找长度

    哈希表 线性探测法和链地址法求查找成功与不成功的平均查找长度 了解ASL的公式 线性探测法求ASL 链地址法求ASL 了解ASL的公式 查找成功时 ASL 1 n frac 1 n n1
  • LeetCode 349. 两个数组的交集

    题目链接 https leetcode cn problems intersection of two arrays 思路如下 由题目可知 nums1 数组和 nums2 数组中的元素的大小都在 0 1000 0 1000
  • 数据结构--并查集

    并查集适用情况 1 有时候 并不关心数据之间的前后关系 也不关心数据的层次关系 一些确定元素只是单纯的聚集在一起 这样的元素聚集集合被称为集合 当希望知道某个数据是否存在一个集合中 或者两个元素是否在同一个集合中时 就需要使用一些集合数据结
  • 散列表查找成功和不成功时的平均查找长度

    已知散列表长度为13 散列函数为H key key 11 处理冲突的方法为线性探测法 请画出依次插入关键字 10 8 40 27 21 57 46 23 19 56 以后的散列表 并计算查找成功和不成功时的平均查找长度 解 散列表是哈希表的
  • AcWing 837. 连通块中点的数量 并查集模板题

    题 注意根节点不一样才合并 否则size会重复相加 注意size要加在根节点上 include
  • 种类并查集+入门题A Bug's Life

    我觉得种类并查集还是先从一个基础入门题讲起吧 Background Professor Hopper is researching the sexual behavior of a rare species of bugs He assum
  • Redis源码分析(三)—— 字典的设计与实现

    前言 字典是一种用于保存键值对的数据结构 Redis数据库使用字典做为底层实现 字典也是哈希键的底层实现之一 C语言中并没有内置字典这个数据结构 Redis自己实现了字典 以下结合源码分析Redis字典的设计与实现 源码版本 Redis 6
  • 哈希表结构

    1 哈希值 1 概念 是一个十进制的整数 由系统随机给出 就是对象的地址值 但这是一个逻辑地址 是模拟出来的 不是数据实际存储的物理地址 2 获取哈希值 可通过Object类的 hasCode 方法获取哈希值 hasCode 源码如下 pu
  • AcWing 238. 银河英雄传说 并查集模板题

    题 参考 include
  • 并查集学习

    并查集 看的很好的博文 链接如下 https blog csdn net chen134225 article details 82052537 两个函数 1 查找 int pre 1000 int find int x 查找x的顶级 in
  • LeetCode 1.两数之和

    题目链接 1 两数之和 思路分析 可以暴力枚举时间复杂度为 O n 2 O n 2 O n2 也可以用哈希表
  • Supermarket 【POJ - 1456】【并查集+哈希表思想+贪心】

    题目链接 原来 并查集还有这样的作用 题记 我想用个哈希表的思维来解这道题 但是 显然O N 2 的哈希表去查询并插入显然是不行的 那么既然挂在图论专题 我就得用相应的方式解答咯 要是不挂在图论专题 我可能会自闭了 我们对于每个物品按照价值
  • 数组(六)-- LC[1851] 包含每个查询的最小区间

    1 包含每个查询的最小区间 1 1 题目描述 给你一个二维整数数组 intervals 其中 i n t e r v a l
  • Leetcode 题解系列--Leetcode1 两数之和

    题目描述 两数之和 给定一个整数数组 nums 和一个目标值 target 请你在该数组中找出和为目标值的那 两个 整数 并返回他们的数组下标 你可以假设每种输入只会对应一个答案 但是 数组中同一个元素不能使用两遍 解题思路 解法一 直观的
  • 力扣(LeetCode)2488. 统计中位数为 K 的子数组(C++)

    哈希表 找不到 O n O n O n 思路 试一下等价代换 数组所有数字大小不同 说明数组中最多有一个 k 数组的 k 要包含在 子数组 里 为了便于思考 分析奇数长度的子数组 在子数组里 大于 k 的数 和小于 k 的数 二者数量相等时
  • 哈希表设计思想及实现

    哈希表设计思想及实现 定义 哈希表在 算法4 这本书中是这么介绍的 哈希表其实又叫散列表 是算法在时间和空间上做出权衡的经典例子 如果一个表所有的键都是小整数 我们就可以用一个数组来实现无序的符号表 将键作为数组的索引而数组中i出存储的值就
  • 不相交集类(并查集)

    并查集 就是只有合并和 查找操作的一种数据结构 很简单 主要判断一个元素是否在一个集合里 主要应用在最小生成树 Kruskal算法 看到图的时候会将实现代码贴上 package chapter8 类名 DisjSets 说明 实现并查集 按

随机推荐

  • HTTP传输协议原理

    目录 1 简介 1 1 简单的HTTP协议 1 2 主要特点 1 3 HTTP请求响应模型 2 工作原理与过程 2 1 工作原理 2 2 用户访问网站的过程 2 3 HTTP协议栈中各层数据流 3 请求 1 请求方法 2 请求的网址 3 请
  • scala ide + helloworld

    http blog csdn net asongoficeandfire article details 21490101 简介 在上一篇文章中 我们阐述了Coursera使用Scala的理由 以及Scala的优缺点 说多不如少练 我们今天
  • 一文讲透缓存方案及常见问题——初篇

    Hello 大家好 今天跟大家聊的一个话题就是 缓存 目前 面向C端的服务架构中 除开管理后台等访问量很少 实时性要求较高的服务可不使用缓存外 缓存已成为高性能分布式系统里不可或缺的一环 本文不打算过多涉及具体的缓存组件如Memcached
  • Python读取文件并修改文件内容后保存为新文件

    下面是例子是读取一个文件内容 并且改变其中满足正则的行 进行内容追加 use command reWriteFile py oldFileName txt newFileName txt import re import sys param
  • 计算机内存比外存容量大吗,内存容量一般比外存容量大吗

    大家好 我是时间财富网智能客服时间君 上述问题将由我为大家进行解答 内存容量一般比外存容量大 计算机的内存容量通常是指随机存储器 RAM 的容量 是内存条的关键性参数 内存容量以MB作为单位 可以简写为M 内存的容量一般都是2的整次方倍 比
  • qt qmake 生成的makefile介绍

    参考 概述 跟我一起写Makefile 1 0 文档 NMAKE参考之五 Makefile中的命令 nmake在指定目录下生成 XanaduT的博客 CSDN博客 NMAKE Reference Microsoft Learn 目录 序 m
  • ARM基础--指令集汇编常用指令

    目录 简单的ARM程序 ARM指令集的分类 ARM数据处理指令 ARM跳转指令 ARM的Load Srore指令 ARM的状态寄存器传送指令 ARM软中断指令 ARM伪指令 ARM混合编程 简单的ARM程序 text 表示当前为代码段 gl
  • 拯救者笔记本ubuntu亮度调节

    终端 nvidia settings 点击 DP 2 点击右侧 Color Correction 调节 Brightness即可
  • centos7 arm内核配置yum源

    yum配置文件替换 一 cd到目录 etc yum repos d 创建 替换下面三个文件 1 CentOS Base repo CentOS Base repo The mirror system uses the connecting
  • Java中常用API和标准类的使用与优化

    目录 一 API和Java API简介 二 Object类的重要性 三 Objects工具类的使用 四 标准类的设计与使用 五 String类的特点和常用方法 六 API查找文档及其方法和技巧 一 API和Java API简介 API是Ap
  • 鸿蒙系统应用开发初体验(一)

    上学时期就对操作系统非常有兴趣 甚至还想自己动手尝试尝试 曾买来一堆关于操作系统的书籍肯 这不 翻出来几年前的博客 动手写简单的嵌入式操作系统https blog csdn net yyz 1987 article details 9901
  • VirtualBox虚拟机安装CentOS7.6后无法ssh远程连接虚拟机

    问题如题所述 安装完 一般都是使用ip addr查看虚拟机IP后通过远程工具来尝试连接 虚拟机IP 然后会发现通过此IP无法连接 解决办法 修改VirtualBox的网络配置 1 查看VirtualBox对应网卡的IP地址 对应的IP为19
  • 【数组】点菜题目描述小木呆去食堂吃中饭,食堂提供的菜比较丰富有n(0<n<=1000)种,各种菜都有一个价格ci(ci>0并且都是整数),但他口袋里只剩下m元钱,他计划买两个不同的菜,请问他有多少

    数组 点菜 题目描述 小木呆去食堂吃中饭 食堂提供的菜比较丰富有n 0
  • MySql修改表名的两种方法

    一 rename rename table 旧表名 to 新表名 rename table mysu to new su 二 alter alter table 旧表名 rename as 新表名 alter table mysu rena
  • Python Crypto.Cipher加密包

    The Crypto Cipher package contains algorithms for protecting the confidentiality of data Crypto Cipher包含保护机密数据的加密算法 Inst
  • copy()及copy.deepcopy()

    在说浅拷贝和深拷贝之前先咱们先看看这张图片 A 1 2 3 4 5 6 B A B 0 S print B print A 可以看到只是修改了B中的值但A中的值也随之改变 可以直接推断出A B的存储位置都在同一个地方 现在上浅拷贝 浅拷贝和
  • pnpm install 安装依赖失败

    在使用 pnpm install pnpm i 遇到了一个报错 在使用 EPERM operation not permitted unlink E pnpm store v3 files 9e 经过咨询和查询 得到解决方案是 键盘 win
  • python-pptx处理替换文本

    python中使用python ppt库操作ppt来替换文本内容 包括图片在前方的 from pptx import Presentation from pptx enum shapes import MSO SHAPE TYPE def
  • Whitted光线追踪

    更详细的内容可以看知乎的这篇文章 这里简要的说了一下几何光学的规则 这里引出了光线追踪 正向 从光源开始 和反向 从眼睛开始 在介绍光线追踪前 先来看一些比较简单的 W h i t t e d
  • 面试题.17.07.婴儿名字--并查集

    LeetCode 面试题 17 07 婴儿名字 每年 政府都会公布一万个最常见的婴儿名字和它们出现的频率 也就是同名婴儿的数量 有些名字有多种拼法 例如 John 和 Jon 本质上是相同的名字 但被当成了两个名字公布出来 给定两个列表 一