1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| class Solution { public int[] findOrder(int numCourses, int[][] prerequisites) { Map<Integer, List<Integer>> courseDependentMap = new HashMap<>(); Map<Integer, Integer> preCount = new HashMap<>(); Queue<Integer> queue = new LinkedList<>(); int pos = 0; int[] result = new int[numCourses]; for (int i = 0; i < numCourses; i++) { preCount.put(i, 0); } for (int[] prerequisite : prerequisites) { courseDependentMap.putIfAbsent(prerequisite[1], new ArrayList<>()); courseDependentMap.get(prerequisite[1]).add(prerequisite[0]); preCount.put(prerequisite[0], preCount.get(prerequisite[0]) + 1); }
for (Map.Entry<Integer, Integer> entry : preCount.entrySet()) { if (entry.getValue() == 0) { queue.offer(entry.getKey()); } } while (!queue.isEmpty()) { int currCourse = queue.poll(); result[pos] = currCourse; pos += 1; if (courseDependentMap.containsKey(currCourse)) { for (Integer dependent : courseDependentMap.get(currCourse)) { preCount.put(dependent, preCount.get(dependent) - 1); if (preCount.get(dependent) == 0) { queue.offer(dependent); } } courseDependentMap.remove(currCourse); } } return courseDependentMap.isEmpty() ? result : new int[0]; } }
|