思路: 利用图来解决,首先根据数组中的课程构建图的所有边,然后对每一门课程进行深度优先搜索,搜索过程中使用数组标记课程是否被访问过,使用标志位标记是否满足题意,若存在二次访问即图中存在环则不满足题意,标志为置为false,结果返回空,否则将课程入结果栈,返回即可。
class Solution {
public:
vector<vector<int>>edges;
vector<int>visited;
vector<int>res;
bool valid=true;
void dfs(int i){
visited[i]=1;
for(auto j:edges[i]){
if(visited[j]==0){
dfs(j);
if(!valid){
return;
}
}else if(visited[j]==1){
valid=false;
return;
}
}
visited[i]=2;
res.push_back(i);
}
vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
edges.resize(numCourses);
visited.resize(numCourses);
for(auto info:prerequisites){
edges[info[1]].push_back(info[0]);
}
for(int i=0;i<numCourses;i++){
if(!visited[i]){
dfs(i);
}
}
if(!valid){
return {};
}
reverse(res.begin(),res.end());
return res;
}
};