There are a total of n courses you have to take, labeled from 0 to n-1.

Some courses may have prerequisites, for example to take course 0 you have to first take course 1, which is expressed as a pair: [0,1]

Given the total number of courses and a list of prerequisite pairs, is it possible for you to finish all courses?

Example 1:

Input: 2, [[1,0]]
Output: true
Explanation: There are a total of 2 courses to take.
  To take course 1 you should have finished course 0. So it is possible.

Example 2:

Input: 2, [[1,0],[0,1]]
Output: false
Explanation: There are a total of 2 courses to take.
  To take course 1 you should have finished course 0, and to take course 0 you should
  also have finished course 1. So it is impossible.

Note:

  1. The input prerequisites is a graph represented by a list of edges, not adjacency matrices. Read more about how a graph is represented.
  2. You may assume that there are no duplicate edges in the input prerequisites.

我的理解是这个题就是问, 如果有两门课互为prerequisite课, 那么就False, 否则True, 注意的是这里的互为有可能是中间隔了几门课, 而不是直接的prerequisite, 例如: [(0,1),(2,0),(1,2)], 这里 1 是0 的前置课, 0 是2 的前置课, 所以1是2 的间接前置课, 但是最后一个input说2 是1 的前置课, 所以就矛盾, 不可能完成, return False. 所以思路为, 建一个dictionary, 分别将input 的每个pair(c1, c2)放入dictionary里面, 前置课(c2)为key, 后置课(c1)为value, 不过放入之前要用bfs 判断c1 是否为c2 的前置课, 如果是, 那么矛盾, return False. 否则一直判断到最后的pair, 返回Ture.

12/05/2019 Update: 这个题目实际上是有向图里面找是否有环的问题。用dfs去遍历每个graph的点,可以参考Directed Graph Loop detection and if not have, path to print all path. T: O(n)   S: O(n)

1. Constraints:

1) 实际这里的n对我这个做法没有什么用处, 因为课程id 是unique的.

2. Ideas

BFS:     T: O(n)   number of nodes,     S: O(n^2)

1) init dictionary, d

2) for pair(c1,c2) in prerequisites, use bfs to see if c1 is a prerequisity of c2, if so , return False, else, d[c2].add(c1), and until all pairs been checked. return True

3) bfs: use queue and visited to check whether there is a path from source to target.

3. Code

 class Solution:
def courseSchedule(self, numCourse, prerequisites):
def bfs(d, source, target):
if source not in d: return False
queue, visited = collections.deque([source]), set([source])
while queue:
node = queue.popleft()
if node == target: return True
for each in d[node]:
if each not in visited:
queue.append(each)
visited.add(each)
return False d = collections.defaultdict(set)
for c1, c2 in prerequisites:
if bfs(d,c1, c2): return False
d[c2].add(c1)
return True

4. Test cases:

1) [(0,1),(2,0),(1,2)],  =>   False

[LeetCode] 207 Course Schedule_Medium tag: BFS, DFS的更多相关文章

  1. [LeetCode] 490. The Maze_Medium tag: BFS/DFS

    There is a ball in a maze with empty spaces and walls. The ball can go through empty spaces by rolli ...

  2. [LeetCode] 133. Clone Graph_ Medium tag: BFS, DFS

    Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors. OJ's ...

  3. [LeetCode] 529. Minesweeper_ Medium_ tag: BFS

    Let's play the minesweeper game (Wikipedia, online game)! You are given a 2D char matrix representin ...

  4. [LeetCode] 690. Employee Importance_Easy tag: BFS

    You are given a data structure of employee information, which includes the employee's unique id, his ...

  5. [LeetCode] 733. Flood Fill_Easy tag: BFS

    An image is represented by a 2-D array of integers, each integer representing the pixel value of the ...

  6. [LeetCode] 130. Surrounded Regions_Medium tag: DFS/BFS

    Given a 2D board containing 'X' and 'O' (the letter O), capture all regions surrounded by 'X'. A reg ...

  7. [LeetCode] 849. Maximize Distance to Closest Person_Easy tag: BFS

    In a row of seats, 1 represents a person sitting in that seat, and 0 represents that the seat is emp ...

  8. [LeetCode] 513. Find Bottom Left Tree Value_ Medium tag: BFS

    Given a binary tree, find the leftmost value in the last row of the tree. Example 1: Input: 2 / \ 1 ...

  9. [LeetCode] 821. Shortest Distance to a Character_Easy tag: BFS

    Given a string S and a character C, return an array of integers representing the shortest distance f ...

随机推荐

  1. Node.js- sublime搭建node的编译环境

    自动配置: 1.安装package control(见 http://www.cnblogs.com/padding1015/p/7763014.html) 2.sublime编辑器中,按快捷键:ct ...

  2. C#串口介绍以及简单串口通信程序设计实现

    C#串口介绍以及简单串口通信程序设计实现 周末,没事干,写个简单的串口通信工具,也算是本周末曾来过,废话不多,直接到主题 串口介绍 串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口) ...

  3. Python pyQt4/pyQt5 学习笔记1(空白窗口,按钮,控件事件,控件提示,窗体显示到屏幕中间,messagebox)

    PyQt4是用来编写有图形界面程序(GUI applications)的一个工具包.PyQt4作为一个Python模块来使用,它有440个类和超过6000种函数和方法.同时它也是一个可以在几乎所有主流 ...

  4. Android studio 插件安装

    安装插件步骤 一 CodeGlance 最大的用途:可用于快速定位代码.显示在右侧 二 Android Studio Prettify 可以将代码中的字符串写在string.xml文件中 选中字符串鼠 ...

  5. sencha touch Button Select(点击按钮进行选择)扩展

    此扩展基于官方selectfield控件修改而来,变动并不大,使用方法类似. 代码如下: Ext.define('ux.SelectBtn', { extend: 'Ext.Button', xtyp ...

  6. vue 项目要使用的库

    1.Stylus是一个CSS预处理器. npm install stylus --save-dev npm install stylus-loader --save-dev 使用 <style ...

  7. Unity3D protobuf-net使用方式

    1.下载protobuf-net 2.创建Unity工程,创建一个Plugins文件夹,将protobuf-net解压把里面得protobuf-net放到Plugins 3.创建一个名为mcs的文本文 ...

  8. 解决使用Foxmail客户端软件不能收取腾讯企业邮箱的全部邮件

    一般说来,使用Foxmail客户端软件收取邮箱时,需要作如下几步: 1.进入邮箱web界面授权开启POP3/SMTP服务.IMAP/SMTP等服务 2.在邮箱web界面配置收取选项,可选择收取全部邮件 ...

  9. php---截取描述方法

    参考: https://www.cnblogs.com/xsphehe/p/5682004.html 示例: /** * 参数说明 * $string 欲截取的字符串 * $sublen 截取的长度 ...

  10. 8.21 js

    2018-8-21 20:05:43 2018-8-21 20:56:30 明天再看!!!! 今天空闲多看了书 <百年孤独> <苏东坡传> 打印结果  shanghai js的 ...