题目链接
法一(拓扑排序)
private int[] inDegree;
private List<Integer>[] graph;
private void createGraphByAdjList(int numCourses, int[][] prerequisites) {
graph = new LinkedList[numCourses];
for (int i = 0; i < numCourses; i++) {
graph[i] = new LinkedList<>();
}
inDegree = new int[numCourses];
for (int[] pre : prerequisites) {
int from = pre[1], to = pre[0];
graph[from].add(to);
inDegree[to]++;
}
}
public int[] findOrder(int numCourses, int[][] prerequisites) {
createGraphByAdjList(numCourses, prerequisites);
Queue<Integer> queue = new LinkedList<>();
for (int i = 0; i < numCourses; i++) {
if (inDegree[i] == 0) {
queue.offer(i);
}
}
int num = 0;
int[] order = new int[numCourses];
while (!queue.isEmpty()) {
int from = queue.poll();
order[num++] = from;
for (int to : graph[from]) {
inDegree[to]--;
if (inDegree[to] == 0) {
queue.offer(to);
}
}
}
return num == numCourses ? order : new int[0];
}
法二(DFS)
private List<Integer>[] graph;
private int[] visited;
private boolean hasCircle = false;
private int[] order;
private int num = 0;
private void createGraphByInverseAdjList(int numCourses, int[][] prerequisites) {
graph = new LinkedList[numCourses];
for (int i = 0; i < numCourses; i++) {
graph[i] = new LinkedList<>();
}
for (int[] pre : prerequisites) {
int from = pre[1], to = pre[0];
graph[to].add(from);
}
}
private void findCircle(int to) {
visited[to] = 1;
for (int from : graph[to]) {
if (visited[from] == 0) {
findCircle(from);
} else if (visited[from] == 1) {
hasCircle = true;
return;
}
}
visited[to] = 2;
order[num++] = to;
}
public int[] findOrder_2(int numCourses, int[][] prerequisites) {
createGraphByInverseAdjList(numCourses, prerequisites);
visited = new int[numCourses];
order = new int[numCourses];
for (int i = 0; i < numCourses; i++) {
if (visited[i] == 0) {
findCircle(i);
}
}
return hasCircle ? new int[0] : order;
}
本地测试
lay.showTitle(210);
Solution210 sol210 = new Solution210();
int numCourses210 = 4;
int[][] prerequisites210 = new int[][]{{1, 0}, {2, 0}, {3, 1}, {3, 2}};
arrayOpt.showIntTwoDimArray(prerequisites210, prerequisites210.length);
int[] order210_1 = sol210.findOrder(numCourses210, prerequisites210);
System.out.println(Arrays.toString(order210_1));
int[] order210_2 = sol210.findOrder_2(numCourses210, prerequisites210);
System.out.println(Arrays.toString(order210_2));