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:
提示:文章來源:http://www.zghlxwxcb.cn/news/detail-709095.html
- 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 100010
vector<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)典題目。文章來源地址http://www.zghlxwxcb.cn/news/detail-709095.html
到了這里,關(guān)于2023-09-10 LeetCode每日一題(課程表 II)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!