官方的提示给了很多啊,先根据给定数组建立有向图,然后通过DFS来检验图中是否有环
class Solution {
private:
bool dfs(int cur, vector<vector<int>>& graph, vector<int>& state, vector<int>& ans){
if(state[cur] == 1) return true; //有环
if(state[cur] == 2) return false; //访问过了就不妨问了
state[cur] = 1;
for(const int t : graph[cur]){
if(dfs(t,graph,state,ans))
return true;
}
state[cur] = 2;
ans.push_back(cur);
return false;
}
public:
vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
//建图
vector<vector<int>> graph(numCourses); //vector外层有num个
//看内层有几个
// int n = prerequisites[0].size();
for(const auto& p : prerequisites){
// for(int i = 1 ; i < n ; ++ i)
// graph[p[i]].push_back(p[i-1]);
graph[p[1]].push_back(p[0]);
}
//state : 0 = unknown 1 = visiting 2 = visited
vector<int> state(numCourses, 0);
vector<int> ans;
for(int i = 0 ; i < numCourses ; ++ i){
if(dfs(i,graph,state,ans))
return {};
}
std::reverse(ans.begin(),ans.end());
return ans;
}
};