1. class Solution {
  2. public int[] findOrder(int numCourses, int[][] prerequisites) {
  3.  
  4. // Step 1: Create adjacency list
  5. ArrayList<ArrayList<Integer>> adj = new ArrayList<>();
  6. for(int i = 0; i < numCourses; i++)
  7. adj.add(new ArrayList<>());
  8.  
  9. // Step 2: fill adjacency list and indegree array
  10. int[] indegree = new int[numCourses];
  11. for(int[] edge : prerequisites)
  12. {
  13. int prereq = edge[1];
  14. int course = edge[0];
  15.  
  16. adj.get(prereq).add(course);
  17. indegree[course]++;
  18. }
  19.  
  20. // Step 3: Queue for nodes with indegree 0
  21. Queue<Integer> q = new LinkedList<>();
  22.  
  23. for(int i = 0; i < numCourses; i++)
  24. if(indegree[i] == 0)
  25. q.add(i);
  26.  
  27. // Step 4: Topological Sort
  28. int[] ans = new int[numCourses];
  29. int index = 0;
  30.  
  31. while(!q.isEmpty())
  32. {
  33. int node = q.poll();
  34. ans[index++] = node;
  35.  
  36. for(int next : adj.get(node))
  37. {
  38. indegree[next]--;
  39. if(indegree[next] == 0)
  40. q.add(next);
  41. }
  42. }
  43.  
  44. // Cycle check
  45. if(index != numCourses)
  46. return new int[0];
  47.  
  48. return ans;
  49. }
  50. }