[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 ...
随机推荐
- Spring的@Transactional(readOnly=true)注解,对其效果进行测试
https://blog.csdn.net/xcdsdf14545/article/details/86164012
- 吴裕雄--天生自然python学习笔记:python 文件批量处理
Python 在文件处理方面表现突出,关于文件的处理 也是很多人经常用到的功能. 对 Python 的文件处理的技巧进行综合应用,比如把大量文件 的复制.按指定的文件名进行保存.找出重复的照片.将 所 ...
- VBA引用管理加载宏
下载文件: VBA引用管理加载宏.rar 下载后,解压缩. Excel的 开发工具/加载项 在对话框中浏览 VBA引用管理.xlam VBA界面中,在工程右键菜单中出现:
- Linux修改主机名称方法
碰到这个问题的时候,是在安装Zookeeper集群的时候,碰到如下问题 java.net.UnknownHostException: XXXX Name or service not knownjav ...
- Create Collection Type with Class Type Constraints
Create Collection Type with Class Type Constraints: new TypeToken<ArrayList<ClassType>>( ...
- phpcms添加图片投票
1phpcms加入投票选项的图片上传功能,从我的文件下载,然后到phpcms目录下直接覆盖即可. 当然这边出现了一个bug,修改投票选项不能修改的bug,只需要修改vote_option_class. ...
- Point Estimate|unbiased estimator|Confidence-Interval Estimate
8.1 Estimating a Population Mean Point Estimate estimate a single number, or point. 因为:the mean of ...
- Angular开发者指南(七)依赖注入
依赖注入 依赖注入(DI)是一种软件设计模式,处理组件如何获取其依赖关系. AngularJS注入器子系统负责创建组件,解析它们的依赖关系,并根据请求将它们提供给其他组件. 使用依赖注入 DI遍布An ...
- FPGA开平方的实现
3种方法: 1.JPL近似的实现方法 `timescale 1ns / 1ps )( clk, syn_rst, dataa, datab, ampout); input clk; :] dataa; ...
- c语言函数指针的理解与使用(学习)
1.函数指针的定义 顾名思义,函数指针就是函数的指针.它是一个指针,指向一个函数.看例子: 1 2 3 A) char * (*fun1)(char * p1,char * p2); B) char ...