210. Course Schedule II!
DFS postorder traversal
class Solution {
boolean[] visited;
boolean[] isVisitedOnPath;
boolean hasCircle;
List<Integer> result;
public int[] findOrder(int numCourses, int[][] prerequisites) {
// 1.check if there is circle in graph, otherwise dfs will not end
isVisitedOnPath = new boolean[numCourses];
visited= new boolean[numCourses];
result = new LinkedList<>();
List<Integer>[] graph=buildGraph(numCourses, prerequisites);
for(int i=0; i<numCourses; i++){
dfs(i, graph);
}
//invalid
if(hasCircle) return new int[0];
int[] intResult = new int[numCourses];
for(int i=0; i<numCourses; i++){
intResult[i]=result.get(i);
}
return intResult;
}
private void dfs(int numCourses, List<Integer>[] graph){
if(isVisitedOnPath[numCourses]){
hasCircle=true;
return;
}
if(visited[numCourses]) return;
visited[numCourses]=true;
isVisitedOnPath[numCourses] = true;
List<Integer> neighbors = graph[numCourses];
for(int neighbor: neighbors){
dfs(neighbor, graph);
}
result.add(numCourses);
isVisitedOnPath[numCourses]=false;
}
private List<Integer>[] buildGraph(int numCourses, int[][] prerequisites){
List<Integer>[] graph = new LinkedList[numCourses];
// initialize
for(int i=0; i<numCourses;i++){
graph[i]=new LinkedList();
}
for(int[] relation: prerequisites){
int from = relation[0];
int to = relation[1];
graph[from].add(to);
}
return graph;
}
}
Last updated
Was this helpful?