[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 ...
随机推荐
- C/C++预处理指令#include,#define,#undef,#if,#ifdef,#ifndef,#elif,#endif,#error......
本文主要记录了C/C++预处理指令,常见的预处理指令如下: #空指令,无任何效果 #include包含一个源代码文件 #define定义宏 #undef取消已定义的宏 #if如果给定条件为真,则编译下 ...
- 算法笔记 4.4 贪心 问题 A: 看电视
问题 A: 看电视 题目描述 暑假到了,小明终于可以开心的看电视了.但是小明喜欢的节目太多了,他希望尽量多的看到完整的节目. 现在他把他喜欢的电视节目的转播时间表给你,你能帮他合理安排吗? 输入 输入 ...
- 定义变量|dirname|basename|printf
$ basename /xxxx/test test $ dirname /xxxx/test /xxx $ dirname /xxx/test|while read p;do sp=$p" ...
- ibatis in语句参数传入方法
第一种:传入参数仅有数组 <select id="GetEmailList_Test" resultClass="EmailInfo_"& ...
- Rearrangement
In a two dimensional array of integers of size 2×n2 \times n2×n, is it possible to rearrange integer ...
- 如何查看Linux系统下程序运行时使用的库?
Linux系统下程序运行会实时的用到相关动态库,某些场景下,比如需要裁剪不必要的动态库时,就需要查看哪些动态库被用到了. 以运行VLC为例. VLC开始运行后,首先查看vlc的PID,比如这次查到的V ...
- javascript 实现最简单的阶乘!
<script type='text/javascript'> window.onload = get(5); function get(n){ document.w ...
- Smarty使用-模版中编写js
在smarty模版中编写js使用literal标签, Literal 标签区域内的数据将被当作文本处理,此时模板将忽略其内部的所有字符信息. 该特性用于显示有可能包含大括号等字符信息的 javas ...
- 二:MySQL的操作
1:创建数据库 create database bjpowernode ; 2:使用数据库 use bjpowernode; 3:导入数据库文件sql source 然后把SQL文件拖过来就可以了 ...
- python后端面试第三部分:数据储存与缓存相关--长期维护
1. 列举常见的关系型数据库和非关系型都有哪些?2. MySQL常见数据库引擎及比较?3. 简述数据三大范式?4. 什么是事务?MySQL如何支持事务?5. 简述数据库设计中一对多和多对多的应用场景? ...