File tree Expand file tree Collapse file tree 1 file changed +46
-0
lines changed Expand file tree Collapse file tree 1 file changed +46
-0
lines changed Original file line number Diff line number Diff line change
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
+
You can’t perform that action at this time.
0 commit comments