• 图论27(Leetcode721账户合并)


    代码:

    写了一个超时版本 又学了并查集

    超时版本:

    1. class Solution {
    2. public List> accountsMerge(List> accounts) {
    3. List> newAcc = new ArrayList<>();
    4. Set isArrive = new HashSet<>();
    5. int idx = 0;
    6. Iterator> iterator = accounts.iterator();
    7. while(iterator.hasNext()){
    8. List curAcc = iterator.next();
    9. if(isArrive.contains(idx)){
    10. idx++;
    11. continue;
    12. }
    13. Set set = new HashSet<>();
    14. set.add(idx);
    15. set = getIdx(idx,set,accounts);
    16. List curEmail = new ArrayList<>();
    17. for(int i:set){
    18. for(String str:accounts.get(i)){
    19. if(!curEmail.contains(str))curEmail.add(str);
    20. }
    21. }
    22. if(!isArrive.contains(idx)){
    23. String name = curEmail.get(0);
    24. curEmail.remove(0);
    25. Collections.sort(curEmail);
    26. curEmail.add(0,name);
    27. newAcc.add(curEmail);
    28. isArrive.add(idx);
    29. for(int i:set){
    30. isArrive.add(i);
    31. }
    32. }
    33. idx++;
    34. }
    35. return newAcc;
    36. }
    37. public Set getIdx(int curIdx, Set set, List> accounts){
    38. List curAccount = accounts.get(curIdx);
    39. // curAccount.remove(0);
    40. for(String email:curAccount){
    41. for(int i=0;i
    42. if(set.contains(i))continue;
    43. List acc = accounts.get(i);
    44. if(acc.contains(email)&&email.contains("@")){
    45. set.add(i);
    46. set = getIdx(i,set,accounts);
    47. }
    48. }
    49. }
    50. return set;
    51. }
    52. }

    并查集版:

    1. class Solution {
    2. public List> accountsMerge(List> accounts) {
    3. Map emailToIndex = new HashMap();
    4. Map emailToName = new HashMap();
    5. int emailsCount = 0;
    6. for(Listaccount:accounts){//遍历 写email的序号 和 email的name对
    7. String name = account.get(0);
    8. int size = account.size();
    9. for(int i=1;i
    10. String email = account.get(i);
    11. if(!emailToIndex.containsKey(email)){
    12. emailToIndex.put(email,emailsCount++);
    13. emailToName.put(email,name);
    14. }
    15. }
    16. }
    17. UnionFind uf = new UnionFind(emailsCount);
    18. for(List account:accounts){ //把同一个人的邮箱合并到一个父节点下
    19. String firstEmail = account.get(1);
    20. int firstIndex = emailToIndex.get(firstEmail);
    21. int size = account.size();
    22. for(int i=2;i
    23. String nextEmail = account.get(i);
    24. int nextIndex = emailToIndex.get(nextEmail);
    25. uf.union(firstIndex,nextIndex);
    26. }
    27. }
    28. Map> indexToEmails = new HashMap>();
    29. for(String email:emailToIndex.keySet()){//把相同根节点的email放一起
    30. int index = uf.find(emailToIndex.get(email));
    31. List account = indexToEmails.getOrDefault(index, new ArrayList());
    32. account.add(email);
    33. indexToEmails.put(index, account);
    34. }
    35. List> merged = new ArrayList>();
    36. for(List emails:indexToEmails.values()){
    37. Collections.sort(emails);
    38. String name = emailToName.get(emails.get(0));
    39. List account = new ArrayList<>();
    40. account.add(name);
    41. account.addAll(emails);
    42. merged.add(account);
    43. }
    44. return merged;
    45. }
    46. }
    47. class UnionFind{
    48. int[] parent;
    49. public UnionFind(int n){
    50. parent = new int[n];
    51. for(int i=0;i
    52. parent[i]=i;
    53. }
    54. }
    55. public void union(int index1,int index2){
    56. parent[find(index2)] = find(index1);
    57. }
    58. public int find(int index){
    59. if(parent[index]!=index){
    60. parent[index] = find(parent[index]);
    61. }
    62. return parent[index];
    63. }
    64. }

  • 相关阅读:
    等数值计算方法学习笔记第4章第三部分【数值积分(数值微分)】
    【云原生 | 44】Docker搭建Registry私有仓库之管理访问权限
    RK3588平台开发系列讲解(SARADC篇)SARADC的工作流程
    基于springboot的二手物品交易管理系统
    【总】HEC-RAS学习记录
    C++:学习大纲目录:30天学会C++
    动规算法-地下城游戏
    数学建模不会 LaTex 排版 | 教你如何在 Word 中优雅地使用漂亮的 LaTex 公式
    天猫京东整站商品数据分析,天猫商品价格数据接口,京东商品价格数据接口,电商平台商品价格数据接口流程介绍
    SL1588A 18V转3.3V、5V、12V/ 2A同步降压稳压器
  • 原文地址:https://blog.csdn.net/stacey777/article/details/133427128