class Solution {
public:
    vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
        vector<int> inDegree(numCourses, 0);
        vector<int> result;
        unordered_map<int, vector<int>> umap;
        for (int i = 0; i < prerequisites.size(); i++) {

            // prerequisites[i][0] is the course's in-degree, prerequisites[i][1] is the course's out-degree
            // That is: Before taking course prerequisites[i][0], you must take course prerequisites[i][1]
            // prerequisites[i][1] -> prerequisites[i][0]
            inDegree[prerequisites[i][0]]++; // Increase the in-degree of the current course
            umap[prerequisites[i][1]].push_back(prerequisites[i][0]); // Add the course pointed by prerequisites[i][1]
        }
        queue<int> que;
        for (int i = 0; i < numCourses; i++) {
            if (inDegree[i] == 0) que.push(i); // All courses with in-degree 0, i.e., starting courses, are added to the queue
        }
        int count = 0;
        while (que.size()) {
            int cur = que.front(); // Current course chosen
            que.pop();
            count++; // Increase the selected course count by 1
            result.push_back(cur);
            vector<int> courses = umap[cur]; // Get the courses that follow this course
            if (courses.size()) { // If there are subsequent courses
                for (int i = 0; i < courses.size(); i++) {
                    inDegree[courses[i]]--; // Decrease the in-degree of its subsequent courses by 1
                    if (inDegree[courses[i]] == 0) que.push(courses[i]); // If in-degree is 0, add to the queue
                }
            }
        }
        if (count == numCourses) return result;
        else return vector<int>();
    }
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Last updated:: 9/4/2025, 3:19:38 PM
Copyright © 2025 keetcoder