地方新闻网站好坏东莞网络营销推广公司
2023-09-10每日一题
一、题目编号
210. 课程表 II
二、题目链接
点击跳转到题目位置
三、题目描述
现在你总共有 numCourses 门课需要选,记为 0 到 numCourses - 1。给你一个数组 prerequisites ,其中 prerequisites[i] = [ai, bi] ,表示在选修课程 ai 前 必须 先选修 bi 。
例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示:[0,1] 。
返回你为了学完所有课程所安排的学习顺序。可能会有多个正确的顺序,你只要返回 任意一种 就可以了。如果不可能完成所有课程,返回 一个空数组 。
示例 1:
示例 2:
示例 3:
提示:
- 1 <= numCourses <= 2000
- 0 <= prerequisites.length <= numCourses * (numCourses - 1)
- prerequisites[i].length == 2
- 0 <= ai, bi < numCourses
- ai != bi
- 所有[ai, bi] 互不相同
四、解题代码
class Solution {
public:#define maxn 100010vector<int> Edges[maxn];int hash[maxn];int deg[maxn];void addEdge(int u,int v){Edges[u].push_back(v);deg[v]++;}vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {memset(hash,0,sizeof(hash));memset(deg,0,sizeof(deg));int length=prerequisites.size();for(int i=0;i<length;i++){Edges[i].clear();hash[i]=0;}for(int i=0;i<length;i++){addEdge(prerequisites[i][1],prerequisites[i][0]);}queue<int> q;vector<int> res;int x=0;for(int i=0;i<numCourses;i++){if(deg[i]==0){x++;q.push(i);hash[i]=1;res.push_back(i);}}vector<int> path;while(!q.empty()){int u=q.front();q.pop();for(int i=0;i<Edges[u].size();i++){deg[Edges[u][i]]--;if(deg[Edges[u][i]]==0 && hash[Edges[u][i]]==0){q.push(Edges[u][i]);hash[Edges[u][i]]=1;res.push_back(Edges[u][i]);x++;}}}if(x==numCourses){return res;}return path;}
};
五、解题思路
(1) 依然是一道拓扑排序的经典题目。