File tree 1 file changed +68
-0
lines changed
1 file changed +68
-0
lines changed Original file line number Diff line number Diff line change
1
+ /**
2
+ * Question Link: https://leetcode.com/problems/accounts-merge/
3
+ */
4
+
5
+ class UnionFind {
6
+ var parents = [ Int: Int] ( )
7
+ var ranks = [ Int: Int] ( )
8
+
9
+ init ( n: Int ) {
10
+ for i in 0 ..< n + 1 {
11
+ parents [ i] = i
12
+ ranks [ i] = 0
13
+ }
14
+ }
15
+
16
+ func find( n: Int ) -> Int {
17
+ var p = parents [ n] !
18
+ while p != parents [ p] {
19
+ parents [ p] = parents [ parents [ p] !]
20
+ p = parents [ p] !
21
+ }
22
+ return p
23
+ }
24
+
25
+ func union( n1: Int , n2: Int ) -> Bool {
26
+ let p1 = find ( n: n1)
27
+ let p2 = find ( n: n2)
28
+ if p1 == p2 {
29
+ return false
30
+ }
31
+ if ranks [ p1] ! > ranks [ p2] ! {
32
+ parents [ p2] = p1
33
+ } else if ranks [ p1] ! < ranks [ p2] ! {
34
+ parents [ p1] = p2
35
+ } else {
36
+ parents [ p1] = p2
37
+ ranks [ p2, default: 0 ] += 1
38
+ }
39
+ return true
40
+ }
41
+ }
42
+
43
+ class Solution {
44
+ func accountsMerge( _ accounts: [ [ String ] ] ) -> [ [ String ] ] {
45
+ let unionFind = UnionFind ( n: accounts. count)
46
+ var emailToAcc = [ String: Int] ( )
47
+ for (i, a) in accounts. enumerated ( ) {
48
+ for j in 1 ..< a. count {
49
+ if let index = emailToAcc [ a [ j] ] {
50
+ unionFind. union ( n1: i, n2: index)
51
+ } else {
52
+ emailToAcc [ a [ j] ] = i
53
+ }
54
+ }
55
+ }
56
+ var emailGroup = [ Int: [ String] ] ( )
57
+ for (e, i) in emailToAcc {
58
+ let leader = unionFind. find ( n: i)
59
+ emailGroup [ leader, default: [ ] ] . append ( e)
60
+ }
61
+ var res = [ [ String] ] ( )
62
+ for (i, emails) in emailGroup {
63
+ let name = accounts [ i] [ 0 ]
64
+ res. append ( [ name] + emails. sorted ( ) )
65
+ }
66
+ return res
67
+ }
68
+ }
You can’t perform that action at this time.
0 commit comments