在题I代码基础上增加记录拓扑遍历顺序即可。
public class Solution { public int[] findOrder(int numCourses, int[][] prerequisites) { if (prerequisites == null) return new int[0]; int[] order = new int[numCourses]; List<Set<Integer>> graph = new ArrayList<Set<Integer>>(); int[] indegree = new int[numCourses]; for (int i = 0; i < numCourses; i++) graph.add(new HashSet<Integer>()); // build graph for (int i = 0; i < prerequisites.length; i++) { if (graph.get(prerequisites[i][1]).add(prerequisites[i][0])) indegree[prerequisites[i][0]]++; } LinkedList<Integer> queue = new LinkedList<Integer>(); for (int i = 0; i < numCourses; i++) { if (indegree[i] == 0) queue.offer(i); } int k = 0; while (!queue.isEmpty()) { int v = queue.poll(); order[k++] = v; for (Integer w : graph.get(v)) { if (--indegree[w] == 0) queue.offer(w); } } return k == numCourses ? order : new int[0]; } }