leetcode Course Schedule II

来源:互联网 发布:成都易森画室知乎 编辑:程序博客网 时间:2024/05/16 16:59

这道题可以用拓扑排序去做,

对于图的拓扑排序,有邻接表和邻接矩阵的做法,邻接表会快一些。

邻接矩阵的复杂度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;                }};


0 0
原创粉丝点击