Skip to content

Commit 863497a

Browse files
authored
Merge pull request soapyigu#354 from soapyigu/Graph
Graph
2 parents c45f7b2 + 71de320 commit 863497a

File tree

3 files changed

+60
-29
lines changed

3 files changed

+60
-29
lines changed

Graph/CourseSchedule.swift

Lines changed: 15 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -8,39 +8,32 @@
88

99
class CourseSchedule {
1010
func canFinish(_ numCourses: Int, _ prerequisites: [[Int]]) -> Bool {
11-
var inDegrees = Array(repeating: 0, count: numCourses), fromTo = [Int: [Int]]()
12-
var coursesCouldTake = [Int](), queue = [Int]()
11+
var inDegrees = Array(repeating: 0, count: numCourses), toCourses = [Int: [Int]]()
1312

14-
// init graph
15-
for prerequisite in prerequisites {
16-
fromTo[prerequisite[1], default: []].append(prerequisite[0])
17-
inDegrees[prerequisite[0]] += 1
13+
for courses in prerequisites {
14+
inDegrees[courses[0]] += 1
15+
toCourses[courses[1], default:[]].append(courses[0])
1816
}
1917

20-
// BFS
21-
for course in 0..<numCourses {
22-
if inDegrees[course] == 0 {
23-
queue.append(course)
24-
}
25-
}
18+
var queue = (0..<numCourses).filter { inDegrees[$0] == 0 }, validCourseCount = 0
2619

2720
while !queue.isEmpty {
28-
let currentCourse = queue.removeFirst()
29-
coursesCouldTake.append(currentCourse)
21+
let course = queue.removeFirst()
3022

31-
guard let toCourses = fromTo[currentCourse] else {
23+
validCourseCount += 1
24+
25+
guard let toCourses = toCourses[course] else {
3226
continue
3327
}
3428

35-
toCourses.forEach {
36-
inDegrees[$0] -= 1
37-
38-
if inDegrees[$0] == 0 {
39-
queue.append($0)
29+
for toCourse in toCourses {
30+
inDegrees[toCourse] -= 1
31+
if inDegrees[toCourse] == 0 {
32+
queue.append(toCourse)
4033
}
4134
}
4235
}
43-
44-
return coursesCouldTake.count == numCourses
36+
37+
return validCourseCount == numCourses
4538
}
4639
}

Graph/CourseScheduleII.swift

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,15 @@
99
class CourseScheduleII {
1010
func findOrder(_ numCourses: Int, _ prerequisites: [[Int]]) -> [Int] {
1111
var inDegrees = Array(repeating: 0, count: numCourses), fromTo = [Int: [Int]]()
12-
var coursesCouldTake = [Int](), queue = [Int]()
12+
var coursesCouldTake = [Int]()
1313

1414
// init graph
1515
for prerequisite in prerequisites {
1616
fromTo[prerequisite[1], default: []].append(prerequisite[0])
1717
inDegrees[prerequisite[0]] += 1
1818
}
1919

20-
// BFS
21-
for course in 0..<numCourses {
22-
if inDegrees[course] == 0 {
23-
queue.append(course)
24-
}
25-
}
20+
var queue = (0..<numCourses).filter { inDegrees[$0] == 0 }
2621

2722
while !queue.isEmpty {
2823
let currentCourse = queue.removeFirst()

Graph/EarliestMomentFriends.swift

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/**
2+
* Question Link: https://leetcode.com/problems/the-earliest-moment-when-everyone-become-friends/
3+
* Primary idea: Classic Union Find, union every node until the count drops down to 1.
4+
*
5+
* Time Complexity: O(nlogn), Space Complexity: O(n)
6+
*
7+
*/
8+
9+
class EarliestMomentFriends {
10+
func earliestAcq(_ logs: [[Int]], _ n: Int) -> Int {
11+
let logs = logs.sorted { $0[0] < $1[0] }
12+
13+
var roots = Array(0..<n), count = n
14+
15+
for log in logs {
16+
let time = log[0], friend1 = log[1], friend2 = log[2]
17+
18+
let root1 = find(friend1, roots)
19+
let root2 = find(friend2, roots)
20+
21+
if root1 != root2 {
22+
roots[root1] = root2
23+
count -= 1
24+
}
25+
26+
if count == 1 {
27+
return time
28+
}
29+
}
30+
31+
return -1
32+
}
33+
34+
private func find(_ node: Int, _ roots: [Int]) -> Int {
35+
var node = node
36+
37+
while node != roots[node] {
38+
node = roots[node]
39+
}
40+
41+
return node
42+
}
43+
}

0 commit comments

Comments
 (0)