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.
Solution:
1 public class Solution { 2 public boolean canFinish(int numCourses, int[][] prerequisites) { 3 if (numCourses <= 1) 4 return true; 5 6 int[] visited = new int[numCourses]; 7 HashMap<Integer, List<Integer>> childMap = new HashMap<Integer, List<Integer>>(); 8 for (int[] pair : prerequisites) { 9 int course1 = pair[0], course2 = pair[1]; 10 if (childMap.containsKey(course1)) { 11 childMap.get(course1).add(course2); 12 } else { 13 List<Integer> childList = new ArrayList<Integer>(); 14 childList.add(course2); 15 childMap.put(course1, childList); 16 } 17 } 18 19 20 for (int i=0;i<numCourses;i++) 21 if (visited[i]==0){ 22 if (!traverse(visited,i,childMap)) return false; 23 } 24 25 return true; 26 } 27 28 public boolean traverse(int[] visited, int curNode, HashMap<Integer,List<Integer>> childMap){ 29 visited[curNode] = 1; 30 if (childMap.containsKey(curNode)){ 31 List<Integer> childs = childMap.get(curNode); 32 for (int child : childs){ 33 if (visited[child]==1) return false; 34 if (visited[child]==2) continue; 35 if (!traverse(visited,child,childMap)) return false; 36 } 37 } 38 visited[curNode] = 2; 39 return true; 40 } 41 42 }