安排课程-LintCode
来源:互联网 发布:哪个炒股软件最好 编辑:程序博客网 时间:2024/06/05 20:43
你需要去上n门九章的课才能获得offer,这些课被标号为 0 到 n-1 。
有一些课程需要“前置课程”,比如如果你要上课程0,你需要先学课程1,我们用一个匹配来表示他们: [0,1]
给你课程的总数量和一些前置课程的需求,返回你为了学完所有课程所安排的学习顺序。
可能会有多个正确的顺序,你只要返回一种就可以了。如果不可能完成所有课程,返回一个空数组。
样例:
给定 n = 2, prerequisites = [[1,0]]
返回 [0,1]
给定 n = 4, prerequisites = [1,0],[2,0],[3,1],[3,2]]
返回 [0,1,2,3] or [0,2,1,3]
思路:
拓扑排序。
#ifndef C616_H#define C616_H#include<iostream>#include<vector>#include<queue>#include<utility>using namespace std;class Solution {public: /* * @param numCourses: a total of n courses * @param prerequisites: a list of prerequisite pairs * @return: the course order */ vector<int> findOrder(int numCourses, vector<pair<int, int>> &prerequisites) { // write your code here vector<int> res; if (numCourses <= 0) return res; queue<int> que; vector<vector<int>> graph(numCourses);//构建邻接矩阵存放图 vector<int> indegree(numCourses,0); //存放每个节点的入度 for (auto c : prerequisites) { indegree[c.second]++; graph[c.first].push_back(c.second); } //将入度为0的节点入队 for (int i = 0; i < numCourses; ++i) { if (indegree[i] == 0) que.push(i); } //将队头节点插入到res的开始位置 while (!que.empty()) { int p = que.front(); res.insert(res.begin(),p); que.pop(); //遍历队头节点的邻接节点 for (int j = 0; j < graph[p].size(); ++j) { if (--indegree[graph[p][j]]==0) que.push(graph[p][j]); } } if (res.size() < numCourses) res.clear(); return res; }};#endif
阅读全文
0 1
- lintcode(616)安排课程
- LintCode 安排课程
- lintcode安排课程答案
- 安排课程-LintCode
- 课程安排
- 安排课程
- 不合理的课程安排
- 培训课程安排
- 大三大四课程安排
- 培训课程安排
- 培训课程安排
- 培训课程安排
- 培训课程安排
- 培训课程安排
- 培训公司课程安排
- 软件学院课程安排
- LintCode_安排课程
- 学院课程安排系统, 代码
- Java并发编程线程中:Callable、Future和FutureTask类
- Codeforces Round #444 (Div. 2) C
- jQuery中ajax学习记录
- jsonp原理详解
- 78. Subsets
- 安排课程-LintCode
- Alpha、Beta、RC、GA版本的区别
- CSS学习05-定位和浮动
- 统计1出现的次数
- Vue调试神器vue-devtools安装
- Linux下C语音基本的多线程socket服务器
- 查看当前项目的FPS
- 数据库学习前瞻
- python视频教程集合