-
-
Notifications
You must be signed in to change notification settings - Fork 155
/
Copy pathcourseSchedule.js
73 lines (61 loc) · 2.03 KB
/
courseSchedule.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
//DFS:==> TC: O(V+E) SC: O(V+E)
function canFinish1(numCourses, prerequisites) {
let prerequisiteMap = Array(numCourses).fill(0).map(()=> []);
for(const pre of prerequisites){
prerequisiteMap[pre[0]]=[pre[1]];
}
let visitSet = new Set();
for (let i=0; i< numCourses; i++) {
if(!dfs(i, prerequisiteMap, visitSet)) return false;
}
return true;
}
function dfs(course, prerequisiteMap, visitSet) {
if(visitSet.has(course)) return false;
if(prerequisiteMap[course].length === 0) {
return true;
}
visitSet.add(course);
for (const pre of prerequisiteMap[course]) {
if(!dfs(pre, prerequisiteMap, visitSet)) return false;
}
visitSet.delete(course);
prerequisiteMap[course] = [];
return true;
}
//BFS:==> TC: O(V+E) SC: O(V+E)(Use Kahn's algorithm to see if topological order is possible or not)
function canFinish2(numCourses, prerequisites) {
let adjacencyMap = Array(numCourses).fill(0).map(()=> []);
let inDegree = Array(numCourses).fill(0);
for(let [to, from] of prerequisites) {
adjacencyMap[from].push(to);
inDegree[to]++;
}
let queue = [];
let enrolled = 0;
for(let i=0; i<numCourses;i++) {
if(inDegree[i] === 0) {
queue.push(i);
enrolled++;
}
}
while(queue.length >0) {
let currentCourse = queue.pop();
for(const neighbour of adjacencyMap[currentCourse]) {
inDegree[neighbour]--;
if(inDegree[neighbour] === 0) {
queue.push(neighbour);
enrolled++;
}
}
}
return enrolled === numCourses;
}
const numCourses1 =6;
const prerequisites1 = [[0, 4], [0, 5], [1, 3], [1, 4], [2, 5], [3, 2]];
const numCourses2 =2;
const prerequisites2 = [[0, 1], [1, 0]];
console.log(canFinish1(numCourses1, prerequisites1));
console.log(canFinish1(numCourses2, prerequisites2));
console.log(canFinish2(numCourses1, prerequisites1));
console.log(canFinish2(numCourses2, prerequisites2));