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. 【SpringCloud微服务实战学习系列】配置详解

    前言 Spring Boot针对常用的开发场景提供了一系列自动化配置来减少原本复杂而又几乎很少改动的模板化配置内容. 一.配置文件 Spring Boot的默认配置文件位置为src/main.reso ...

  2. 【大数据系列】hive修改默认的derby数据库

    <?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml- ...

  3. 关于SQL优化(转载,格式有调整)

    一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用 系统提交实际应用后,随着数据库中数据的增加,系 ...

  4. mac下升级terminal/终端的subversion版本方法

    雖然現在程式碼管理已經以 Git 為主了,不過偶爾需要維護一些舊案子還是會用 SVN,懶得轉了. Mac OS 本身有內建 SVN,不過卻是 1.6 版,最近修改一個舊案子就有碰到 project 已 ...

  5. 常用的数据整理的JavaScript库

    Lodash.js https://lodash.com/ Underscore.js https://www.html.cn/doc/underscore/

  6. git上传GitHub并预览

  7. Apache服务器301重定向去掉.html和.php

    在做优化网站的时候,会考虑到网站整站的集权: 考虑到网站可以生成静态,首先,让网站优先访问 index.html 之后考虑:去掉 .html 和 .php. 利用 .htaccess <IfMo ...

  8. Des加密(js+java结果一致)【原创】

    des加密算法,javascript版本和java版本 目录: 1.资源文件下载 2.JavaScript文件(des.js) 3.html文件(des.html) 4.java文件(des.java ...

  9. os.path 模块

    os.path.abspath(path) #返回绝对路径 os.path.basename(path) #返回文件名 os.path.commonprefix(list) #返回list(多个路径) ...

  10. 【源码】rm zip 删除文件夹中大量的小文件 百万 扫描文件时间

    rm  删除文件夹中大量的小文件 百万 迟迟未删除 在扫描文件? rm删除命令源码分析 - ty_laurel的博客 - CSDN博客 https://blog.csdn.net/ty_laurel/ ...