leetcode 721 賬戶合併 並查集

2021-10-23 23:16:28 字數 1037 閱讀 7834

查詢並返回所在集合的根節點:find():

注意:根節點特性是:father[i]==i; 每次查詢時進行路徑壓縮,保證集合樹的高度不大於2;

int

find

(int i)

return f;

//根節點

}

合併兩個元素所在集合:combine():

void

combine

(int i,

int j)

}

本題的重點是抽象、對映、確定**需要用到並查集。

class

solution

return f;

//根節點

}void

combine

(int i,

int j)

} vector>

accountsmerge

(vector>

& accounts)

}//把郵箱歸於真正所屬的父使用者中(並set排序)

unordered_map<

int, set

>user_mails;

//父使用者編號,所含郵箱

for(

int i =

0; i < n;

++i)

//轉化為規定形式 返回

vector>ret;

for(

auto it : user_mails)

;//先加入使用者名稱

for(string mail : it.second)

tmp.

push_back

(mail)

;//加入郵箱

ret.

push_back

(tmp);}

return ret;}}

;

leetCode 721 賬戶合併

賬戶之間只要有乙個郵箱相同那麼就是同乙個賬戶,也就是同屬乙個連通分量因此可以使用並查集。由於並查集底層使用了陣列,需要知道一共有多少個不同的郵箱,因此可以使用雜湊表給每個郵箱編號,並使用雜湊表記錄每個郵箱對應的姓名。遍歷所有賬戶,對每個賬戶的郵箱進行合併就能知道合併完成後一共有幾個賬戶。查詢每個郵箱...

721 賬戶合併

給定乙個列表 accounts,每個元素 accounts i 是乙個字串列表,其中第乙個元素 accounts i 0 是 名稱 name 其餘元素是 emails 表示該賬戶的郵箱位址。現在,我們想合併這些賬戶。如果兩個賬戶都有一些共同的郵箱位址,則兩個賬戶必定屬於同乙個人。請注意,即使兩個賬戶...

Leetcode 712 賬戶合併

1,根據並查集對每一行關聯到其父節點 乙個int值,相同則表示關聯 先以行數作為父節點,相關聯的行數的父節點改為同乙個。for int i 0 i n i 2,使用map將每個email關聯到這一行,實際行數 for int i 1 i accounts 0 size i 第一行直接寫入 for i...