# Java solution - explanation with example

• ``````public class Solution {
public int[] findOrder(int numCourses, int[][] prerequisites) {
int[] emptyCourses = new int[]{};
if(numCourses < 1) return emptyCourses;

/*
define an array to maintain the count of prereqs a course has,
so that later we can start visiting from the courses which doesn't
have  any prereq's
*/
int[] prereqCount = new int[numCourses];

// this list will maintain the relation of [ prereq ->  List<course>]
/* this is needd so that we know what to visit next whle visiting
courses in order */
/*
For eg. is course '1' is a prereq for 2 and 3, then if we have
visited 1, we can next go to 2 and 3
if 2 & 3 doesn't have any other prereq other than '1'
*/
List<List<Integer>> prereqs = new ArrayList<List<Integer>>(numCourses);
int n = numCourses;

for(int[] arr : prerequisites) {
/* increment the counter for number of prereqs for a
particular course
*/
prereqCount[arr[0]]++;
// For eg. in [1 2] (2 is prereq for 1), add 1 to list of '2'
}

int[] coursesTaken = new int[numCourses];
int currentCourse = 0;

for(int i = 0; i<numCourses; i++) {
}

while(!visited.isEmpty()) {
int visit = visited.poll();
coursesTaken[currentCourse++] = visit;
/*
- whenever we visit a course, we can next check which all
courses have this visited course as a prereq.
-For eg. if 3 was a prereq for 2,4,5 then it means one prereq is
done for all these courses.
- So now traverse that list and decrement the counter of
prereqCount of each course in that list 2,4 & 5

- Now after decrementing, if prereqCount[course in list == 0],
then it means we can visit that course too as there are no more
prereqs, so add it to the visit Queue.
*/
List<Integer> nextInOrder = prereqs.get(visit);
for(int c: nextInOrder) {