Skip to content

Commit c08a249

Browse files
authored
Create 0721-accounts-merge.py
1 parent b013345 commit c08a249

File tree

1 file changed

+46
-0
lines changed

1 file changed

+46
-0
lines changed

python/0721-accounts-merge.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
class UnionFind:
2+
def __init__(self, n):
3+
self.par = [i for i in range(n)]
4+
self.rank = [1] * n
5+
6+
def find(self, x):
7+
while x != self.par[x]:
8+
self.par[x] = self.par[self.par[x]]
9+
x = self.par[x]
10+
return x
11+
12+
def union(self, x1, x2):
13+
p1, p2 = self.find(x1), self.find(x2)
14+
if p1 == p2:
15+
return False
16+
if self.rank[p1] > self.rank[p2]:
17+
self.par[p2] = p1
18+
self.rank[p1] += self.rank[p2]
19+
else:
20+
self.par[p1] = p2
21+
self.rank[p2] += self.rank[p1]
22+
return True
23+
24+
class Solution:
25+
def accountsMerge(self, accounts: List[List[str]]) -> List[List[str]]:
26+
uf = UnionFind(len(accounts))
27+
emailToAcc = {} # email -> index of acc
28+
29+
for i, a in enumerate(accounts):
30+
for e in a[1:]:
31+
if e in emailToAcc:
32+
uf.union(i, emailToAcc[e])
33+
else:
34+
emailToAcc[e] = i
35+
36+
emailGroup = defaultdict(list) # index of acc -> list of emails
37+
for e, i in emailToAcc.items():
38+
leader = uf.find(i)
39+
emailGroup[leader].append(e)
40+
41+
res = []
42+
for i, emails in emailGroup.items():
43+
name = accounts[i][0]
44+
res.append([name] + sorted(emailGroup[i])) # array concat
45+
return res
46+

0 commit comments

Comments
 (0)