207. Course Schedule
There are a total of n courses you have to take, labeled from 0
to n-1
.
Some courses may have prerequisites, for example to take course 0 you have to first take course 1, which is expressed as a pair: [0,1]
Given the total number of courses and a list of prerequisite pairs, is it possible for you to finish all courses?
Example 1:
Input:
2, [[1,0]]
Output:
true
Explanation:
There are a total of 2 courses to take.
To take course 1 you should have finished course 0. So it is possible.
Example 2:
Input:
2, [[1,0],[0,1]]
Output:
false
Explanation:
There are a total of 2 courses to take.
To take course 1 you should have finished course 0, and to take course 0 you should
also have finished course 1. So it is impossible.
Note:
- The input prerequisites is a graph represented by a list of edges , not adjacency matrices. Read more about how a graph is represented .
- You may assume that there are no duplicate edges in the input prerequisites.
Solution
(1) Java
class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
if (prerequisites == null || prerequisites.length == 0 || prerequisites[0].length == 0) {
return true;
}
Set<Integer>[] list = new HashSet[numCourses];
for (int i = 0; i < numCourses; i++) {
list[i] = new HashSet<Integer>();
}
for (int[] prerequisite : prerequisites) {
list[prerequisite[0]].add(prerequisite[1]);
}
Queue<Integer> q = new LinkedList<>();
for (int i = 0; i < numCourses; i++) {
Set<Integer> l = list[i];
if (l.size() == 0) {
q.offer(i);
}
}
if (q.size() == 0) {
return false;
}
int count = 0;
while (q.size() > 0) {
int course = q.poll();
count++;
for (int i = 0; i < numCourses; i++) {
Set<Integer> l = list[i];
if (!l.isEmpty() && l.contains(course)) {
l.remove(course);
if (l.isEmpty()) {
q.offer(i);
}
}
}
}
return count == numCourses;
}
}
(2) Python
(3) Scala