There are a total of n courses you have to take, labeled from 0
to n-1
.html
Some courses may have prerequisites, for example to take course 0 you have to first take course 1, which is expressed as a pair: [0,1]
git
Given the total number of courses and a list of prerequisite pairs, return the ordering of courses you should take to finish all courses.github
There may be multiple correct orders, you just need to return one of them. If it is impossible to finish all courses, return an empty array.express
Example 1:數組
Input: 2, [[1,0]] Output: Explanation: There are a total of 2 courses to take. To take course 1 you should have finished course 0. So the correct course order is [0,1][0,1] .
Example 2:ide
Input: 4, [[1,0],[2,0],[3,1],[3,2]] Output: Explanation: There are a total of 4 courses to take. To take course 3 you should have finished both courses 1 and 2. Both courses 1 and 2 should be taken after you finished course 0. So one correct course order is . Another correct ordering is [0,1,2,3] or [0,2,1,3][0,1,2,3][0,2,1,3] .
Note:post
這題是以前那道 Course Schedule 的擴展,那道題只讓咱們判斷是否能完成全部課程,即檢測有向圖中是否有環,而這道題咱們得找出要上的課程的順序,即有向圖的拓撲排序 Topological Sort,這樣一來,難度就增長了,可是因爲咱們有以前那道的基礎,而此題正是基於以前解法的基礎上稍加修改,咱們從 queue 中每取出一個數組就將其存在結果中,最終如有向圖中有環,則結果中元素的個數不等於總課程數,那咱們將結果清空便可。代碼以下:ui
class Solution { public: vector<int> findOrder(int numCourses, vector<pair<int, int>>& prerequisites) { vector<int> res; vector<vector<int> > graph(numCourses, vector<int>(0)); vector<int> in(numCourses, 0); for (auto &a : prerequisites) { graph[a.second].push_back(a.first); ++in[a.first]; } queue<int> q; for (int i = 0; i < numCourses; ++i) { if (in[i] == 0) q.push(i); } while (!q.empty()) { int t = q.front(); res.push_back(t); q.pop(); for (auto &a : graph[t]) { --in[a]; if (in[a] == 0) q.push(a); } } if (res.size() != numCourses) res.clear(); return res; } };
Github 同步地址:url
https://github.com/grandyang/leetcode/issues/210spa
相似題目:
參考資料:
https://leetcode.com/problems/course-schedule-ii/