1. public int[] findOrder(int numCourses, int[][] prerequisites) {
    2. int[] ans = new int[numCourses];
    3. for (int i = 0; i < numCourses; i++) {
    4. ans[i] = i;
    5. }
    6. if (prerequisites == null || prerequisites.length == 0) {
    7. return ans;
    8. }
    9. HashMap<Integer, Node> nodes = new HashMap<>();
    10. // 先把图建好
    11. for (int[] prerequisite : prerequisites) {
    12. int to = prerequisite[0];
    13. int from = prerequisite[1];
    14. if (!nodes.containsKey(to)) {
    15. nodes.put(to, new Node(to));
    16. }
    17. if (!nodes.containsKey(from)) {
    18. nodes.put(from, new Node(from));
    19. }
    20. Node t = nodes.get(to);
    21. Node f = nodes.get(from);
    22. f.nexts.add(t);
    23. t.in++;
    24. }
    25. int needNum = nodes.size();
    26. Queue<Node> zeroInQueue = new LinkedList<>();
    27. int index = 0;
    28. for (int i = 0; i < numCourses; i++) {
    29. if (!nodes.containsKey(i)) {
    30. ans[index++] = i;
    31. } else {
    32. if (nodes.get(i).in == 0) {
    33. zeroInQueue.add(nodes.get(i));
    34. }
    35. }
    36. }
    37. int count = 0;
    38. while (!zeroInQueue.isEmpty()) {
    39. Node cur = zeroInQueue.poll();
    40. ans[index++] = cur.name;
    41. count++;
    42. for (Node next : cur.nexts) {
    43. if (--next.in == 0) {
    44. zeroInQueue.add(next);
    45. }
    46. }
    47. }
    48. return count == needNum ? ans : new int[0];
    49. }
    50. // 一个node,就是一个课程
    51. // name是课程的编号
    52. // in是课程的入度
    53. public static class Node {
    54. public int name;
    55. public int in;
    56. public ArrayList<Node> nexts;
    57. public Node(int n) {
    58. name = n;
    59. in = 0;
    60. nexts = new ArrayList<>();
    61. }
    62. }