这道题可以用拓扑排序去做,
对于图的拓扑排序,有邻接表和邻接矩阵的做法,邻接表会快一些。
邻接矩阵的复杂度O(V*V) 邻接表复杂度(V+E)
class Solution {
public:
vector<int> findOrder(int numCourses, vector<pair<int, int>>& prerequisites) {
vector<int> res;
int lc[numCourses];
memset(lc,0,sizeof(int)*numCourses);
vector<vector<int> >mm(numCourses);
vector<pair<int, int> >& p=prerequisites;
for(int i=0;i<p.size();i++){
int m=p[i].second;
int n=p[i].first;
//increse the numcourses needed prepare
mm[m].push_back(n);
lc[n]++;
}
queue<int> q;
for(int i=0;i<numCourses;i++){
if(lc[i]==0)q.push(i);
}
while(!q.empty()){
int curv=q.front();
res.push_back(curv);
q.pop();
for(int i=0;i<mm[curv].size();i++){
int n=mm[curv][i];
lc[n]--;
if(!lc[n]){
q.push(n);
}
}
}
for(int i=0;i<numCourses;i++){
if(lc[i]){
res.clear();
return res;
}
}
return res;
}
};
class Solution {
public:
vector<int> findOrder(int numCourses, vector<pair<int, int>>& prerequisites) {
vector<int> res;
bool visit[numCourses];
int lc[numCourses];
memset(visit,0,sizeof(bool)*numCourses);
memset(lc,0,sizeof(int)*numCourses);
bool mm[numCourses][numCourses];
memset(mm,0,sizeof(bool)*numCourses*numCourses);
vector<pair<int, int> >& p=prerequisites;
for(int i=0;i<p.size();i++){
int m=p[i].second;
int n=p[i].first;
//increse the numcourses needed prepare
if(!mm[m][n]){
lc[n]++;
mm[m][n]=true;
}
}
queue<int> q;
for(int i=0;i<numCourses;i++){
if(lc[i]==0)q.push(i);
}
while(!q.empty()){
int curv=q.front();
res.push_back(curv);
q.pop();
for(int i=0;i<numCourses;i++){
if(mm[curv][i]){
lc[i]--;
if(!lc[i]){
q.push(i);
}
}
}
}
for(int i=0;i<numCourses;i++){
if(lc[i]){
res.clear();
return res;
}
}
return res;
}
};