码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【英雄哥七月集训】第 26天:并查集


    文章目录

    • 一、面试题 17.07. 婴儿名字
      • leetcode面试题 17.07 java
      • 思路
        • 并查集 名字-parent,次数-size
        • find,寻找每个名字的父节点
        • 将父节点一样的name,次数相加
    • 总结


    一、面试题 17.07. 婴儿名字

    面试题 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)”]

    leetcode面试题 17.07 java

    思路

    并查集 名字-parent,次数-size

    find,寻找每个名字的父节点

    将父节点一样的name,次数相加

    class Solution {
        public String[] trulyMostPopular(String[] names, String[] synonyms) {
            UnionFind uf = new UnionFind();
            for(String name:names){
                int idx1 = name.indexOf('(');
                int idx2 = name.indexOf(')');
                String new_name = name.substring(0,idx1);
                int fre = Integer.valueOf(name.substring(idx1+1,idx2));
                uf.parent.put(new_name,new_name);
                uf.size.put(new_name,fre);
            }
            for(String syn:synonyms){
                int idx = syn.indexOf(',');
                String name1 = syn.substring(1,idx);
                String name2 = syn.substring(idx+1,syn.length()-1);
                //初始化
                if(!uf.parent.containsKey(name1)){
                    uf.parent.put(name1,name1);
                    uf.size.put(name1,0);
                }
                if(!uf.parent.containsKey(name2)){
                    uf.parent.put(name2,name2);
                    uf.size.put(name2,0);
                }
                uf.union(name1,name2);
            }
    
            //System.out.println(uf.size);
    
            List<String> res = new ArrayList<>();
            for(String name:names){
                int idx1 = name.indexOf('(');
                String new_name = name.substring(0,idx1);
                if(new_name.equals(uf.find(new_name))){
                    res.add(new_name+'('+uf.size.get(new_name)+')');
                }
            }
            return res.toArray(new String[res.size()]);
        }
        public class UnionFind{
            //父节点
            Map<String,String> parent;
            //人数
            Map<String,Integer> size;
    
            public UnionFind(){
                this.parent = new HashMap<>();
                this.size = new HashMap<>();
            }
    
            public String find(String x){
                if(parent.get(x).equals(x)) return x;
                parent.put(x,find(parent.get(x)));
                return parent.get(x);
            }
    
            public void union(String x, String y){
                String str1 = find(x), str2 = find(y);
                if(str1.equals(str2)) return;
                //如果str2字序小
                if(str1.compareTo(str2)>0){
                    parent.put(str1,str2);
                    size.put(str2,size.get(str1)+size.get(str2));
                } else {
                    parent.put(str2,str1);
                    size.put(str1,size.get(str1)+size.get(str2));
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70

    总结

  • 相关阅读:
    爬虫到底难在哪里?
    GO: 快速升级Go版本
    案例 | 3D可视化工具HOOPS助力SolidWorks edrawings成功引入AR/VR技术
    不愧是阿里架构师,吐血更新笔记,这应该是对“Spring家族”最完美的诠释了!
    2022年Python顶级自动化特征工程框架⛵
    详解FreeRTOS:FreeRTOS任务删除过程源码分析(进阶篇—2)
    Matlab论文插图绘制模板第124期—三维气泡图
    git都在自己的个人分支开发吗?功能分支和个人分支工作流
    c++图片取出每一个像素的值
    猫爪插件-官网下载方法
  • 原文地址:https://blog.csdn.net/weixin_39348931/article/details/125990474
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号