You have to attend n number of courses (from 0 to n-1) where some of the courses have prerequisites. For instance: pair [2, 1] represents to attend course 2 you must have taken course 1. Given an integer n representing the total number of courses and the list of courses with their prerequisites. We need to return any order in which you can complete all the n courses. If there is no possible answer return an empty array. If there are multiple answers return which one you want.
Table of Contents
Example
Input : 4
[ [1,0], [2,0], [3,1], [3,2] ]
Output : [0, 1, 2, 3,]
Input : 2
[ [1, 0] ]
Output : [0, 1,]
Using Breadth First Search
Algorithm for Course Schedule II – LeetCode
- Initialize an integer n representing the number of courses and a 2D array course for storing courses and their prerequisites.
- If the course array is a null print empty array.
- Create an array pCounter of size n to store the courses which need prerequisites.
- Move from 0 to n-1 and increment pCounter[course[i][0]].
- Create a vector queue to store all the prerequisites.
- Move from 0 to n-1 and check if the value in pCounter for the current index is 0, add the current index in the queue.
- Initialize an array result of size n.
- While the queue is not empty remove the last element in the queue and store it in the result array and an integer c.
- Create an inner loop and check if the value at [][1] in course array is equal to c decrement pCounter[course[i][0]].
- Check if pCounter[course[i][0]] is 0 add course[i][0] in queue.
- Print the result array.
Implementation
C++ Program for Course Schedule II – LeetCode
#include <bits/stdc++.h> using namespace std; int len = 4; void findOrder(int n, int course[4][2]){ if(course == NULL){ cout<<"empty array"; } int pCounter[n]; for(int i=0; i<len; i++){ pCounter[course[i][0]]++; } vector<int> queue; for(int i=0; i<n; i++){ if(pCounter[i]==0){ queue.push_back(i); } } int numNoPre = queue.size(); int result[n]; int j=0; while(queue.size()!=0){ int c = 0; if(!queue.empty()){ c = queue.back(); queue.pop_back(); } result[j++]=c; for(int i=0; i<len; i++){ if(course[i][1]==c){ pCounter[course[i][0]]--; if(pCounter[course[i][0]]==0){ queue.push_back(course[i][0]); numNoPre++; } } } } cout<<"["; for(int i=0; i<n; i++){ cout<<result[i]<<","; } cout<<"]"; } int main(){ int n = 4; int course[4][2] = {{1,0}, {2,0}, {3,1}, {3,2}}; findOrder(n, course); return 0; }
[0,2,1,3,]
Java Program for Course Schedule II – LeetCode
import java.util.*; class selection{ static int[] findOrder(int n, int[][] course) { if(course == null){ throw new IllegalArgumentException("empty array"); } int len = course.length; if(len == 0){ int[] res = new int[n]; for(int m=0; m<n; m++){ res[m]=m; } return res; } int[] pCounter = new int[n]; for(int i=0; i<len; i++){ pCounter[course[i][0]]++; } LinkedList<Integer> queue = new LinkedList<Integer>(); for(int i=0; i<n; i++){ if(pCounter[i]==0){ queue.add(i); } } int numNoPre = queue.size(); int[] result = new int[n]; int j=0; while(!queue.isEmpty()){ int c = queue.remove(); result[j++]=c; for(int i=0; i<len; i++){ if(course[i][1]==c){ pCounter[course[i][0]]--; if(pCounter[course[i][0]]==0){ queue.add(course[i][0]); numNoPre++; } } } } if(numNoPre==n){ return result; } else{ return new int[0]; } } public static void main (String[] args) { int n = 4; int[][] course = {{1,0}, {2,0}, {3,1}, {3,2}}; int[] result = findOrder(n, course); System.out.print("["); for(int i=0; i<result.length; i++){ System.out.print(result[i]+","); } System.out.print("]"); } }
[0,1,2,3,]
Complexity Analysis for Course Schedule II – LeetCode
Time Complexity
O(Q*M) where Q is the size of vector or list containing prerequisites and M is the number of rows i.e. number of given pairs.
Space Complexity
O(M*N) where M denotes the number of rows and N denotes the number of columns in the given course array.