和course schedule一样的要求,只是要求输出toplogicl排序的结果。一个tricky的地方就是如果没有正常结果,输出new int[0
public class Solution {
public int[] findOrder(int numCourses, int[][] prerequisites) {
int[] result = new int[numCourses];
int resultInd = 0;
int[] indegree = new int[numCourses];
int n = prerequisites.length;
Map<Integer, List<Integer>> nodes = new HashMap<Integer, List<Integer>>();
for (int i = 0; i < n; i++) {
int indegreeNode = prerequisites[i][0];
int outdegreeNode = prerequisites[i][1];
indegree[indegreeNode]++;
if (nodes.get(outdegreeNode) == null) {
nodes.put(outdegreeNode, new ArrayList<Integer>());
}
nodes.get(outdegreeNode).add(indegreeNode);
}
int count = numCourses;
Queue<Integer> queue = new LinkedList<Integer>();
for (int i = 0; i < numCourses; i++) {
if (indegree[i] == 0) {
indegree[i]--;
queue.offer(i);
count--;
}
}
while (!queue.isEmpty()) {
int zeroDegree = queue.poll();
result[resultInd++] = zeroDegree;
List<Integer> list = nodes.get(zeroDegree);
if (list != null) {
for (int i = 0; i < list.size(); i++) {
int num = list.get(i);
indegree[num]--;
if (indegree[num] == 0) {
indegree[num]--;
queue.offer(num);
count--;
}
}
}
}
return resultInd == numCourses ? result : new int[0]
}
}