Course Schedule II
Return the ordering of courses you should take to finish all courses. There may be multiple correct orders, you just need to return one of them.
- Time: O(N) Space: O(1)
public int[] findOrder(int numCourses, int[][] prerequisites) {
Queue<Integer> queue = new LinkedList<>();
int[] ret = new int[numCourses];
int[] indegree = new int[numCourses];
int counter = 0;
Map<Integer, List<Integer>> map = new HashMap<>();
for (int[] num : prerequisites) {
List list = map.containsKey(num[1]) ? map.get(num[1]) : new ArrayList<>();
list.add(num[0]);
map.put(num[1], list);
indegree[num[0]]++;
}
for (int i = 0; i < numCourses; i++)
if (indegree[i] == 0) queue.offer(i);
while (!queue.isEmpty()) {
Integer course = queue.poll();
ret[counter++] = course;
if (map.get(course) != null) {
for (Integer adjacent : map.get(course))
if (--indegree[adjacent] == 0) queue.offer(adjacent);
}
}
return counter == numCourses ? ret : new int[]{};
}