| 1 | class Solution { |
| 2 | |
| 3 | public int[] findOrder(int numCourses, int[][] prerequisites) { |
| 4 | Map<Integer, List<Integer>> adjList = new HashMap<Integer, List<Integer>>(); |
| 5 | int[] indegree = new int[numCourses]; |
| 6 | int[] topologicalOrder = new int[numCourses]; |
| 7 | |
| 8 | //creating the adjlist |
| 9 | for (int i = 0; i < prerequisites.length; i++) { |
| 10 | int post = prerequisites[i][0]; |
| 11 | int pre = prerequisites[i][1]; |
| 12 | List<Integer> lst = adjList.getOrDefault( |
| 13 | pre, |
| 14 | new ArrayList<Integer>() |
| 15 | ); |
| 16 | lst.add(post); |
| 17 | adjList.put(pre, lst); |
| 18 | |
| 19 | indegree[post] += 1; |
| 20 | } |
| 21 | |
| 22 | Queue<Integer> q = new LinkedList<Integer>(); |
| 23 | for (int i = 0; i < numCourses; i++) { |
| 24 | if (indegree[i] == 0) { |
| 25 | q.add(i); |
| 26 | } |
| 27 | } |
| 28 | |
| 29 | int i = 0; |
| 30 | while (!q.isEmpty()) { |
| 31 | int node = q.remove(); |
| 32 | topologicalOrder[i++] = node; |
| 33 | |
| 34 | if (adjList.containsKey(node)) { |
| 35 | for (Integer neighbor : adjList.get(node)) { |
| 36 | indegree[neighbor]--; |
| 37 | |
| 38 | if (indegree[neighbor] == 0) { |
| 39 | q.add(neighbor); |
| 40 | } |
| 41 | } |
| 42 | } |
| 43 | } |
| 44 | |
| 45 | if (i == numCourses) { |
| 46 | return topologicalOrder; |
| 47 | } |
| 48 | |
| 49 | return new int[0]; |
| 50 | } |
| 51 | } |