【LeetCode】1462. 课程安排 IV Course Schedule IV (Python)
- 作者: 负雪明烛
- id: fuxuemingzhu
- 个人博客:http://fuxuemingzhu.cn/
题目地址:https://leetcode-cn.com/problems/course-schedule-iv/
题目描述
你总共需要上 n 门课,课程编号依次为 0 到 n-1 。
有的课会有直接的先修课程,比如如果想上课程 0 ,你必须先上课程 1 ,那么会以 [1,0] 数对的形式给出先修课程数对。
给你课程总数 n 和一个直接先修课程数对列表 prerequisite 和一个查询对列表 queries 。
对于每个查询对 queries[i] ,请判断 queries[i][0] 是否是 queries[i][1] 的先修课程。
请返回一个布尔值列表,列表中每个元素依次分别对应 queries 每个查询对的判断结果。
注意:如果课程 a 是课程 b 的先修课程且课程 b 是课程 c 的先修课程,那么课程 a 也是课程 c 的先修课程。
示例 1:

输入:n = 2, prerequisites = [[1,0]], queries = [[0,1],[1,0]]
输出:[false,true]
解释:课程 0 不是课程 1 的先修课程,但课程 1 是课程 0 的先修课程。
示例 2:
输入:n = 2, prerequisites = [], queries = [[1,0],[0,1]]
输出:[false,false]
解释:没有先修课程对,所以每门课程之间是独立的。
示例 3:

输入:n = 3, prerequisites = [[1,2],[1,0],[2,0]], queries = [[1,0],[1,2]]
输出:[true,true]
示例 4:
输入:n = 3, prerequisites = [[1,0],[2,0]], queries = [[0,1],[2,0]]
输出:[false,true]
示例 5:
输入:n = 5, prerequisites = [[0,1],[1,2],[2,3],[3,4]], queries = [[0,4],[4,0],[1,3],[3,0]]
输出:[true,false,true,false]
提示:
2 <= n <= 1000 <= prerequisite.length <= (n * (n - 1) / 2)0 <= prerequisite[i][0], prerequisite[i][3] < nprerequisite[i][0] != prerequisite[i][4]- 先修课程图中没有环。
- 先修课程图中没有重复的边。
1 <= queries.length <= 10^4queries[i][0] != queries[i][5]
题目大意
题目给出了一个图。判断是否可以从queries[i][0]走向queries[i][1]。
解题方法
DFS
检查有向图中从queries[i][0]出发是否可以到达queries[i][1],最简单的思路就是 DFS 看到能否搜索到。但是看了题目给出的数量级,估算如果每次query都在全图 DFS 搜索,时间复杂度为 O(queries.length * prerequisite.length) 约为 10^8 量级,则会超时。
那么 DFS 就不行了吗?并不见得。我们可以看出 DFS 会存在同一路径重复查找的现象,可以进行优化。
举例说明,假如题目给出的先修课程的图是这样的:
1 -> 2 -> 3 -> 4
假如第一个 query 判断了 1 -> 4 是可以的;
假如第二个 query 要判断 2 -> 4,是否需要重新搜索一遍呢?我们在第一个query中已经走过了这条路了呀,就没有必要重新搜索了。
即,我们的思路就是记录已经判断过的所有的路径,防止重复计算。比如在上面的例子中,我们在搜索 1 -> 4 的过程中,保存记录 1,2,3 都可以走到 4;如果下次再判断 2 是否能到 4 的时候,就可以在O(1)的时间内直接出结果了。
代码的实现时,先写出普通的 DFS 搜索是否可从 start 到达 end 的代码,然后可以用 Python3 提供的@functools.lru_cache,该函数能自动保存函数的参数和返回,相当于函数调用的记忆化。如果不用该函数,也可以自己定义memo数组来记录参数和返回。
- 时间复杂度:最好情况下只需要第一次搜索的时候把路径保存下来,之后查表就行,因此时间复杂度是 O(n);最坏情况下,查询的时候从来没有走过重复的路径(比如星型的图),时间复杂度是O(N * queries.length)。
- 空间复杂度:最省空间的时候是没有保存过重复的路径,空间复杂度是O(1);最费空间是把所有的节点两两路径保存,空间复杂度是O(N^2)。
Python 代码如下:
class Solution(object):
def checkIfPrerequisite(self, n, prerequisites, queries):
"""
:type n: int
:type prerequisites: List[List[int]]
:type queries: List[List[int]]
:rtype: List[bool]
"""
self.graph = collections.defaultdict(list)
for pre in prerequisites:
self.graph[pre[0]].append(pre[1])
return [self.dfs(query[0], query[1]) for query in queries]
# start -> end ?
@functools.lru_cache
def dfs(self, start, end):
if start == end:
return True
return any(self.dfs(nxt, end) for nxt in self.graph[start])
欢迎关注负雪明烛的刷题博客,leetcode刷题800多,每道都讲解了详细写法!
日期
2020 年 6 月 1 日 —— 6月的开始,儿童节快乐!
【LeetCode】1462. 课程安排 IV Course Schedule IV (Python)的更多相关文章
- [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 ...
- 01Mybatis_课程安排
课程安排: mybatis和springmvc通过订单商品 案例驱动 第一天:基础知识(重点,内容量多) 对原生态jdbc程序(单独使用jdbc开发)问题总结 mybatis框架原理 (掌握) m ...
- 中科院 2014年GCT考前辅导课程安排
: 2014年GCT考前辅导课程安排 发布时间: 2014-07-14 阅读次数:1225 默认字体 9pt ...
- SpringMVC由浅入深day02_1课程安排_2包装类型pojo参数绑定_3集合类型绑定
springmvc第二天 高级知识 复习: springmvc框架: DispatcherServlet前端控制器:接收request,进行response HandlerMapping处理器映射器: ...
- 01_Python 基础课程安排
Python 基础课程安排 目标 明确基础班课程内容 课程清单 序号 内容 目标 01 Linux 基础 让大家对 Ubuntu 的使用从很 陌生 达到 灵活操作 02 Python 基础 涵盖 Py ...
- mybatis由浅入深day01_1课程安排_2对原生态jdbc程序中问题总结
mybatis 第一天 mybatis的基础知识 1 课程安排: mybatis和springmvc通过订单商品 案例驱动 第一天:基础知识(重点,内容量多) 对原生态jdbc程序(单独使用jdbc开 ...
- Linux:课程安排、Linux简介、虚拟机安装、课前准备(常用设置和操作)
一.课程安排 1)Linux 的作用 商业服务器基本上都是 Linux: 开源软件都先支持 Linux: 大数据分析.机器学习首先选 Linux: 整个互联网地基靠Linux撑起来: Linux 系统 ...
- cogs——644. 课程安排问题
644. 课程安排问题 ★ 输入文件:curriculum.in 输出文件:curriculum.out 简单对比时间限制:1 s 内存限制:128 MB 问题描述 一个软件专业的学生 ...
- 【LeetCode】870. Advantage Shuffle 解题报告(Python)
[LeetCode]870. Advantage Shuffle 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn ...
随机推荐
- 【GWAS】如何计算显著关联位点的表型解释率PVE(phenotypic variation explained)?
我已经通过Gemma得到了关联分析的结果,如下. prefix.log.txt 中包含了一个总的PVE,这不是我们想要的. 那么,如何计算这些位点的表型解释率? 据了解,有些关联分析软件是可以同时得到 ...
- 【R绘图】R 基础(base )低级函数legend绘图?
ggplot虽然好用,但base才是真正的瑞士军刀,什么都能用,各种自定义图形自由组合,出版级图片用base才是王道.但要达到随心所欲,需要熟练掌握. legend是比较重要的低级函数,有很多细节处理 ...
- python-django111111111111
111 内置电池的意思就是,内置了很多功能,插件等等帮助文档:https://docs.djangoproject.com/en/3.0/ model,很多集成的东西,连接数据库等 vierm: Te ...
- R语言与医学统计图形-【26】ggplot2主题函数
ggplot2绘图系统--主题函数 1. theme函数 theme_*系列函数提供了9种不同的风格. theme_grey/gray/bw/linedraw/light/minimal/classi ...
- nohup使用
nohup:不挂断运行 在忽略挂起信号的情况下运行给定的命令,以便在注销后命令可以在后台继续运行. 可以这么理解:不挂断的运行,注意并没有后台运行的功能,就是指,用nohup 运行命令可以是命令永远运 ...
- Rust 指定安装目录
集群home目录被管理员限制了存储空间,rust安装要100多M,默认安装home目录下,查了一圈,没找到rust指定安装目录的办法. 这里记录下解决办法: 在想要安装的目录执行 mkdir -p c ...
- lua5.4 beta中的to-be-closed变量的用法
对应目前最新lua5.4 beta版本:2019-10-09发布 这个功能之前修改过两次语法,当前的语法不出意外将会是最终决定了,目前还没有最新的中文资料,所以我来这里发一下. 先介绍下这个功能: 被 ...
- vivo 敏感词匹配系统的设计与实践
一.前言 谛听系统是vivo的内容审核平台,保障了vivo各互联网产品持续健康的发展.谛听支持审核多种内容类型,但日常主要审核的内容是文本,下图是一个完整的文本审核流程,包括名单匹配.敏感词匹配.AI ...
- 运算符重载+日期类Date
Hello,一只爱学习的鱼 大学学习C++运算符重载的时候,老师出了一道"运算符重载+类"的综合练习题,让我们来一起看看吧! 题目: 设计一个日期类Date,包括年.月.日等私有成 ...
- 大数据学习day20-----spark03-----RDD编程实战案例(1 计算订单分类成交金额,2 将订单信息关联分类信息,并将这些数据存入Hbase中,3 使用Spark读取日志文件,根据Ip地址,查询地址对应的位置信息
1 RDD编程实战案例一 数据样例 字段说明: 其中cid中1代表手机,2代表家具,3代表服装 1.1 计算订单分类成交金额 需求:在给定的订单数据,根据订单的分类ID进行聚合,然后管理订单分类名称, ...