西安有什么網(wǎng)站網(wǎng)絡(luò)輿情監(jiān)測中心
2023-09-10每日一題
一、題目編號
210. 課程表 II
二、題目鏈接
點擊跳轉(zhuǎn)到題目位置
三、題目描述
現(xiàn)在你總共有 numCourses 門課需要選,記為 0 到 numCourses - 1。給你一個數(shù)組 prerequisites ,其中 prerequisites[i] = [ai, bi] ,表示在選修課程 ai 前 必須 先選修 bi 。
例如,想要學(xué)習(xí)課程 0 ,你需要先完成課程 1 ,我們用一個匹配來表示:[0,1] 。
返回你為了學(xué)完所有課程所安排的學(xué)習(xí)順序??赡軙卸鄠€正確的順序,你只要返回 任意一種 就可以了。如果不可能完成所有課程,返回 一個空數(shù)組 。
示例 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) 依然是一道拓?fù)渑判虻慕?jīng)典題目。