日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

leetcode 721. 账户合并(并查集)

發布時間:2023/11/29 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 leetcode 721. 账户合并(并查集) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

給定一個列表 accounts,每個元素 accounts[i] 是一個字符串列表,其中第一個元素 accounts[i][0] 是 名稱 (name),其余元素是 emails 表示該賬戶的郵箱地址。

現在,我們想合并這些賬戶。如果兩個賬戶都有一些共同的郵箱地址,則兩個賬戶必定屬于同一個人。請注意,即使兩個賬戶具有相同的名稱,它們也可能屬于不同的人,因為人們可能具有相同的名稱。一個人最初可以擁有任意數量的賬戶,但其所有賬戶都具有相同的名稱。

合并賬戶后,按以下格式返回賬戶:每個賬戶的第一個元素是名稱,其余元素是按字符 ASCII 順序排列的郵箱地址。賬戶本身可以以任意順序返回。

示例 1:

輸入:
accounts = [[“John”, “johnsmith@mail.com”, “john00@mail.com”], [“John”, “johnnybravo@mail.com”], [“John”, “johnsmith@mail.com”, “john_newyork@mail.com”], [“Mary”, “mary@mail.com”]]
輸出:
[[“John”, ‘john00@mail.com’, ‘john_newyork@mail.com’, ‘johnsmith@mail.com’], [“John”, “johnnybravo@mail.com”], [“Mary”, “mary@mail.com”]]
解釋:
第一個和第三個 John 是同一個人,因為他們有共同的郵箱地址 “johnsmith@mail.com”。
第二個 John 和 Mary 是不同的人,因為他們的郵箱地址沒有被其他帳戶使用。
可以以任何順序返回這些列表,例如答案 [[‘Mary’,‘mary@mail.com’],[‘John’,‘johnnybravo@mail.com’],
[‘John’,‘john00@mail.com’,‘john_newyork@mail.com’,‘johnsmith@mail.com’]] 也是正確的。

代碼

class Solution {int[] fa;public void init(){for(int i=0;i<fa.length;i++)fa[i]=i;}public int find(int x){if(x!=fa[x])fa[x]=find(fa[x]);return fa[x];}public void union(int x,int y){x=find(x);y=find(y);if(x==y) return;fa[x]=y;}public List<List<String>> accountsMerge(List<List<String>> accounts) {Map<String,Integer> index=new HashMap<>();Map<Integer,String> name=new HashMap<>();int inx=0;for(List<String> list:accounts){String accName=list.get(0);for(int i=1;i<list.size();i++)if(!index.containsKey(list.get(i))) {//為每個郵箱地址創建下標和姓名映射name.put(inx,accName);index.put(list.get(i), inx++);}}fa=new int[inx];init();for(List<String> list:accounts)//將具有相同郵箱的 連接起來{int father=index.get(list.get(1));for(int i=2;i<list.size();i++)union(index.get(list.get(i)),father);}Map<Integer,List<String>> map=new HashMap<>();for(String s:index.keySet())//創建每個集合中 父節點下標 對 所有郵箱地址的映射{int fa=find(index.get(s));List<String> list=map.getOrDefault(fa,new ArrayList<>());list.add(s);map.put(fa,list);}List<List<String>> res=new ArrayList<>();for(int f:map.keySet())//按特定格式 寫入結果{List<String> temp=new ArrayList<>();List<String> email=map.get(f);Collections.sort(email);temp.add(name.get(f));temp.addAll(email);res.add(temp);}return res;} }

總結

以上是生活随笔為你收集整理的leetcode 721. 账户合并(并查集)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。