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?
For example:
2, [[1,0]]
There are a total of 2 courses to take. To take course 1 you should have finished course 0. So it is possible.
2, [[1,0],[0,1]]
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.
public class Solution { public boolean canFinish(int numCourses, int[][] prerequisites) { int[] pre = new int[numCourses]; List<Integer>[] satisfies = new List[numCourses]; for(int i=0; i<numCourses; i++) satisfies[i] = new ArrayList<>(); for(int i=0; i<prerequisites.length; i++) { satisfies[prerequisites[i][1]].add(prerequisites[i][0]); pre[prerequisites[i][0]] ++; } int finish = 0; LinkedList<Integer> queue = new LinkedList<>(); for(int i=0; i<numCourses; i++) { if (pre[i] == 0) queue.add(i); } while (!queue.isEmpty()) { int course = queue.remove(); finish ++; if (satisfies[course] == null) continue; for(int c: satisfies[course]) { pre[c] --; if (pre[c] == 0) queue.add(c); } } return finish == numCourses; } }