Skip to content

Commit dbe33f7

Browse files
committed
course schedule ii
1 parent c029d5d commit dbe33f7

File tree

3 files changed

+139
-34
lines changed

3 files changed

+139
-34
lines changed

.idea/workspace.xml

Lines changed: 46 additions & 34 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -391,3 +391,4 @@ codes may not be optimized
391391
1. [Single Number II](https://leetcode.com/problems/single-number-ii/description/)
392392
1. [Word Ladder](https://leetcode.com/problems/word-ladder/description/)
393393
1. [Lowest Common Ancestor of Binary Tree](https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree/description/)
394+
1. [Course Schedule II](https://leetcode.com/problems/course-schedule-ii/description/)
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
package com.github.chen0040.leetcode.day18.medium;
2+
3+
4+
import java.util.ArrayList;
5+
import java.util.List;
6+
import java.util.Stack;
7+
8+
9+
/**
10+
* Created by xschen on 13/8/2017.
11+
*
12+
* link: https://leetcode.com/problems/course-schedule-ii/description/
13+
*/
14+
public class CourseScheduleII {
15+
16+
static class Graph {
17+
int V;
18+
List<Integer>[] adjList;
19+
public Graph(int V) {
20+
this.V = V;
21+
adjList =(List<Integer>[])new List[V];
22+
for(int v = 0; v < V; ++v) {
23+
adjList[v] = new ArrayList<Integer>();
24+
}
25+
}
26+
27+
public List<Integer> adj(int v) {
28+
return adjList[v];
29+
}
30+
31+
public void addEdge(int v, int w){
32+
adj(v).add(w);
33+
}
34+
35+
private boolean hasCycle;
36+
public int[] topoSort() {
37+
hasCycle = false;
38+
boolean[] marked = new boolean[V];
39+
boolean[] onStack = new boolean[V];
40+
Stack<Integer> postOrder = new Stack<Integer>();
41+
for(int v = 0; v < V; ++v) {
42+
if(!marked[v]) {
43+
dfs(v, marked, postOrder, onStack);
44+
}
45+
}
46+
47+
if(hasCycle){
48+
return new int[0];
49+
} else {
50+
int[] result = new int[V];
51+
int index = 0;
52+
while(!postOrder.isEmpty()) {
53+
result[index++] = postOrder.pop();
54+
}
55+
return result;
56+
}
57+
}
58+
59+
private void dfs(int v, boolean[] marked, Stack<Integer> postOrder, boolean[] onStack) {
60+
marked[v] = true;
61+
onStack[v] = true;
62+
List<Integer> adj_v = adj(v);
63+
for(Integer w : adj_v){
64+
if(onStack[w]){
65+
hasCycle = true;
66+
}
67+
if(!marked[w]) {
68+
dfs(w, marked, postOrder, onStack);
69+
}
70+
}
71+
postOrder.push(v);
72+
onStack[v] = false;
73+
}
74+
75+
}
76+
77+
public class Solution {
78+
79+
80+
public int[] findOrder(int numCourses, int[][] prerequisites) {
81+
Graph g = new Graph(numCourses);
82+
for(int i=0; i < prerequisites.length; ++i) {
83+
int[] pre = prerequisites[i];
84+
int from = pre[1];
85+
int to = pre[0];
86+
g.addEdge(from, to);
87+
}
88+
89+
return g.topoSort();
90+
}
91+
}
92+
}

0 commit comments

Comments
 (0)