Skip to content

Commit 9ac3a2a

Browse files
committed
Create 0721-accounts-merge.swift
1 parent 392f504 commit 9ac3a2a

File tree

1 file changed

+68
-0
lines changed

1 file changed

+68
-0
lines changed

swift/0721-accounts-merge.swift

+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
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+
}

0 commit comments

Comments
 (0)