思路:拓補排序
其實就是對于第一個題的問題變了一個問法,上一個題本質上是求有沒有環,這道題本質上就是讓你求出來符合沒有環的路徑輸出而已,本質上沒有什么區別。
不同就在于這里需要你額外開一個數組用來存儲你遍歷這個有向圖的路徑。
注意:并不是說存儲返回就完事了,因為所給的數據有可能是不構成拓補排序的要求的,我們需要判斷一下這個圖是不是有向無環圖,如果是,那么拓補排序是可以的;不是的話,我們在存儲路徑的時候會重復一個環的點,導致輸出錯誤。
這里的判斷有沒有環其實就是用一個計數器判斷是不是符合全部點都遍歷,不出現重復的情況下。
上代碼:
class Solution {
public:vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {vector<vector<int>>s(numCourses);vector<int>counts(numCourses,0);for(int i=0;i<prerequisites.size();i++){s[prerequisites[i][1]].push_back(prerequisites[i][0]);counts[prerequisites[i][0]]++;}queue<int>q;vector<int>res;int cnt=0;for(int i=0;i<numCourses;i++){if(counts[i]==0){q.push(i);res.push_back(i);}}while(!q.empty()){int tmp=q.front();q.pop();++cnt;for(int i:s[tmp]){if(--counts[i]==0){q.push(i);res.push_back(i);}}}if(cnt==numCourses){return res;}else{return {};}}
};