课程表(拓补排序)

题目链接:https://leetcode.cn/problems/course-schedule-ii/description/

题意:

给定n门课程,规定只有学完某一个课程才能继续学下一门课程,让你输出学习顺序。如果成环,则返回空数组

思路:

拓补排序,入度删除法
需要提前准备一个indegree数组用来统计每个节点的入度大小
用数组模拟双端队列,先把入度为0的点压入队列,再将这个点的影响消除(即把邻接表中该点的to删除,同时对应到indegree中),如果indegree因此出现为0的点则再次压入,直到压完
如果压入的个数刚好等于节点个数,说明不是环图。

class Solution {
public:
vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
vector<int>gra[2005];
vector<int>indegree(numCourses);
for(int i=0;i<prerequisites.size();i++)
{
int from=prerequisites[i][1];int to=prerequisites[i][0];
indegree[to]++;
gra[from].emplace_back(to);
}
vector<int> qu;
int l=0,r=0;
for(int i=0;i<numCourses;i++)
{
if(indegree[i]==0)
{
qu.emplace_back(i);
r++;
}
}
int cnt=0;
while(l<r)
{
int cur=qu[l++];
cnt++;
for(int next:gra[cur])
{
if(--indegree[next]==0)
{
qu.emplace_back(next);
r++;
}
}
}
vector<int>em;
return cnt==numCourses? qu:em;
}
};
posted @   Marinaco  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
//雪花飘落效果
点击右上角即可分享
微信分享提示