Skip to content

Commit 5f998cd

Browse files
committed
Added Course Schedule
1 parent 27023e7 commit 5f998cd

File tree

2 files changed

+64
-6
lines changed

2 files changed

+64
-6
lines changed

src/course_schedule.rs

+63-5
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
use std::collections::HashMap;
2+
use std::collections::HashSet;
3+
use std::collections::VecDeque;
4+
15
/// There are a total of `numCourses` courses you have to take, labeled from
26
/// `0` to `numCourses - 1`. You are given an array `prerequisites` where
37
/// `prerequisites[i] = [ai, bi]` indicates that you must take course `bi`
@@ -11,9 +15,53 @@ struct Solution;
1115

1216
impl Solution {
1317

14-
// TODO: Implement
15-
pub fn can_finish(_num_courses: i32, _prerequisites: Vec<Vec<i32>>) -> bool {
16-
false
18+
pub fn can_finish(num_courses: i32, prerequisites: Vec<Vec<i32>>) -> bool {
19+
let n = num_courses as usize;
20+
21+
let mut in_degrees = vec![0; n];
22+
let mut out_degrees = vec![0; n];
23+
let mut prereq_for = HashMap::new();
24+
25+
for p in prerequisites {
26+
let prereq = p[1] as usize;
27+
let for_class = p[0] as usize;
28+
prereq_for
29+
.entry(prereq)
30+
.or_insert(HashSet::new())
31+
.insert(for_class);
32+
out_degrees[prereq] += 1;
33+
in_degrees[for_class] += 1;
34+
}
35+
36+
let mut seen = HashSet::new();
37+
let mut queue = VecDeque::new();
38+
39+
for i in 0..n {
40+
if in_degrees[i] == 0 {
41+
queue.push_back(i);
42+
seen.insert(i);
43+
}
44+
}
45+
46+
while !queue.is_empty() {
47+
let current = queue.pop_front().unwrap();
48+
match prereq_for.get(&current) {
49+
Some(classes) => {
50+
for &class in classes {
51+
if !seen.contains(&class) {
52+
in_degrees[class] -= 1;
53+
if in_degrees[class] == 0 {
54+
queue.push_back(class);
55+
seen.insert(class);
56+
}
57+
}
58+
}
59+
}
60+
None => { }
61+
}
62+
}
63+
64+
seen.len() == n
1765
}
1866

1967
}
@@ -22,7 +70,6 @@ impl Solution {
2270
mod tests {
2371
use super::Solution;
2472

25-
#[ignore]
2673
#[test]
2774
fn example_1() {
2875
let num_courses = 2;
@@ -31,7 +78,6 @@ mod tests {
3178
assert!(result);
3279
}
3380

34-
#[ignore]
3581
#[test]
3682
fn example_2() {
3783
let num_courses = 2;
@@ -40,4 +86,16 @@ mod tests {
4086
assert!(!result);
4187
}
4288

89+
#[test]
90+
fn sedgewick_example() {
91+
let num_courses = 13;
92+
let prerequisites = vec![
93+
vec![0,2], vec![1,0], vec![3,2], vec![4,5], vec![4,6], vec![5,0], vec![5,3],
94+
vec![6,7], vec![7,8], vec![9,6], vec![10,9], vec![11,9], vec![12,9], vec![12,11]
95+
];
96+
97+
let result = Solution::can_finish(num_courses, prerequisites);
98+
assert!(result);
99+
}
100+
43101
}

src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ pub mod number_of_islands; // 200
9999
pub mod happy_number; // 202
100100

101101
pub mod reverse_linked_list; // 206
102-
pub mod course_schedule; // 207
102+
pub mod course_schedule; // 207
103103

104104
pub mod contains_duplicate; // 217
105105

0 commit comments

Comments
 (0)