[LeetCode] 207. Course Schedule 课程表
题目:

分析:
这是一道典型的拓扑排序问题。那么何为拓扑排序?
拓扑排序:
有三件事情A,B,C要完成,A随时可以完成,但B和C只有A完成之后才可完成,那么拓扑排序可以为A>B>C或A>C>B。
总的来说,拓扑排序就是对于相互之间有先后依赖关系的事件,给出一个行之有效的序列。
图解释:
反应到图中,就是一个有向无环图可以被拓扑排序,而有环图是无法进行拓扑排序的(比如,A依赖B,B依赖C,C依赖A,三者形成了环,是没有办法完成的)
很明显“课程表”这个题目就是判断题目所给的依赖关系,是否可以进行拓扑排序,或是否是有向无环图
思路:
对于拓扑排序,一般有两种方法进行判断:
1、深度优先搜索(DFS),判断是否有环
2、节点的入度,一个节点的入度是指向指向该节点的节点个数,比如拓扑排序举的例子,A的入度为0,BC的入度均为1
这里利用节点的入度来判断是否可以进行拓扑排序,或者是否是有向无环图
只要某个节点的入度为0,就说明其没有依赖条件,可以直接输出,同时减少以该节点为起点的节点的入度
回到题目
题目已知,n个课程会被从0至n-1编号
我们需要知道每个课程的入度,可以定义一个preNum数组, preNum[i]:代表i号课程所依赖的课程数
同时在寻找0入度的课程时,我们需要知道某个课程是否已上完,可以定义一个visited数组,visited[i]:表示i号课程已上完
为了寻找0入度课程方便,构造一个getNext()函数,用来寻找入度为0的课程
代码:
class Solution {
public:
int getNext(vector<int> preNum, vector<int> visited){
for(int i=; i<preNum.size(); i++) if(!visited[i] && !preNum[i]) return i;
return -;
}
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {int n = prerequisites.size();
vector<int> visited(numCourses);
vector<int> preNum(numCourses);
for(int i=; i<n; i++) preNum[prerequisites[i][]]++;
for(int i=getNext(preNum, visited); i!=-; i=getNext(preNum, visited)){
visited[i] = ;
numCourses--;
for(int j=; j<n; j++){
if(prerequisites[j][]==i) preNum[prerequisites[j][]]--;
}
if(!numCourses) return true;
}
return false;
}
};
当然,这段程序还有改进的余地,比如说获取下一个0入度的课程的方式,每次都利用了循环
可以动态维护一个栈,每当某个课程的入度为零时即压入栈,以此来节省时间,有兴趣的同学可以自己写一下
我做了一下测试,运行时间没有明显减少,反而是内存消耗降低了,应该是调用函数的次数减少,减少了内存的使用
[LeetCode] 207. Course Schedule 课程表的更多相关文章
- [leetcode]207. Course Schedule课程表
在一个有向图中,每次找到一个没有前驱节点的节点(也就是入度为0的节点),然后把它指向其他节点的边都去掉,重复这个过程(BFS),直到所有节点已被找到,或者没有符合条件的节点(如果图中有环存在). /* ...
- LeetCode - 207. Course Schedule
207. Course Schedule Problem's Link ---------------------------------------------------------------- ...
- Java for LeetCode 207 Course Schedule【Medium】
There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may have prer ...
- LN : leetcode 207 Course Schedule
lc 207 Course Schedule 207 Course Schedule There are a total of n courses you have to take, labeled ...
- [LeetCode] 207. Course Schedule 课程安排
There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may have prer ...
- [LeetCode] 207. Course Schedule 课程清单
There are a total of n courses you have to take, labeled from 0 to n-1. Some courses may have prereq ...
- (medium)LeetCode 207.Course Schedule
There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may have prer ...
- LeetCode 207. Course Schedule(拓扑排序)
题目 There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may have p ...
- Java for LeetCode 210 Course Schedule II
There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may have prer ...
随机推荐
- Git ubuntu 升级
外文文档 This team will distribute the most current stable package of Git for Ubuntu. Stable releases: h ...
- 信息检索盛会 微软“领衔主演”——记ACM SIGIR 2013信息检索国际会议
微软"领衔主演"--记ACM SIGIR 2013信息检索国际会议" title="信息检索盛会 微软"领衔主演"--记ACM SIGIR ...
- HTML颜色表
1.配色原则 2.HTML颜色表 颜色名列表 单击一个颜色名或者16进制值,就可以查看与不同文字颜色搭配的背景颜色 3.总参考表:
- 2019ICPC南京网络赛B super_log(a的b塔次方)
https://nanti.jisuanke.com/t/41299 分析:题目给出a,b,mod求满足条件的最小a,由题目的式子得,每次只要能递归下去,b就会+1,所以就可以认为b其实是次数,什么的 ...
- 机器学习算法之——LR(未完成)
LR的形式 sklearn中的LR模块sklearn.linear_model.LogisticRegression LR的目标函数 主要的考虑点有三个:处理什么类型的问题?是否正则以及什么正则?求解 ...
- peculiar|retreated|civilize|conceivable
ADJ-GRADED 奇怪的:古怪的:不寻常的If you describe someone or something as peculiar, you think that they are str ...
- svn使用2(转)
首先打开VisualSVN Server Manager,如图: 可以在窗口的右边看到版本库的一些信息,比如状态,日志,用户认证,版本库等.要建立版本库,需要右键单击左边窗口的Repositores, ...
- pycharm中无法调用pip的安装包
https://blog.csdn.net/sinat_23619409/article/details/79962518 较详细:https://blog.csdn.net/weixin_41287 ...
- React中key的讲解
通过阅读React的文档我们知道React这个框架的核心思想是,将页面分割成一个个组件,一个组件还可能嵌套更小的组件,每个组件有自己的数据(属性/状态);当某个组件的数据发生变化时,更新该组件部分的视 ...
- 高效JS简化版
详:.doc (颜色标注)2章17条 2018.6.24 星期日 1:24 第 1 章 让自己习惯 JavaScript 第 1 条:了解你使用的 JavaScript 版本 ES5 引入了另一种版本 ...