题目地址:https://leetcode-cn.com/problems/course-schedule-iv/

题目描述

你总共需要上 n 门课,课程编号依次为 0n-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]

提示:

  1. 2 <= n <= 100
  2. 0 <= prerequisite.length <= (n * (n - 1) / 2)
  3. 0 <= prerequisite[i][0], prerequisite[i][3] < n
  4. prerequisite[i][0] != prerequisite[i][4]
  5. 先修课程图中没有环。
  6. 先修课程图中没有重复的边。
  7. 1 <= queries.length <= 10^4
  8. queries[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)的更多相关文章

  1. [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 ...

  2. 01Mybatis_课程安排

    课程安排: mybatis和springmvc通过订单商品 案例驱动 第一天:基础知识(重点,内容量多) 对原生态jdbc程序(单独使用jdbc开发)问题总结 mybatis框架原理   (掌握) m ...

  3. 中科院 2014年GCT考前辅导课程安排

    : 2014年GCT考前辅导课程安排 发布时间: 2014-07-14 阅读次数:1225                       默认字体                   9pt       ...

  4. SpringMVC由浅入深day02_1课程安排_2包装类型pojo参数绑定_3集合类型绑定

    springmvc第二天 高级知识 复习: springmvc框架: DispatcherServlet前端控制器:接收request,进行response HandlerMapping处理器映射器: ...

  5. 01_Python 基础课程安排

    Python 基础课程安排 目标 明确基础班课程内容 课程清单 序号 内容 目标 01 Linux 基础 让大家对 Ubuntu 的使用从很 陌生 达到 灵活操作 02 Python 基础 涵盖 Py ...

  6. mybatis由浅入深day01_1课程安排_2对原生态jdbc程序中问题总结

    mybatis 第一天 mybatis的基础知识 1 课程安排: mybatis和springmvc通过订单商品 案例驱动 第一天:基础知识(重点,内容量多) 对原生态jdbc程序(单独使用jdbc开 ...

  7. Linux:课程安排、Linux简介、虚拟机安装、课前准备(常用设置和操作)

    一.课程安排 1)Linux 的作用 商业服务器基本上都是 Linux: 开源软件都先支持 Linux: 大数据分析.机器学习首先选 Linux: 整个互联网地基靠Linux撑起来: Linux 系统 ...

  8. cogs——644. 课程安排问题

    644. 课程安排问题 ★   输入文件:curriculum.in   输出文件:curriculum.out   简单对比时间限制:1 s   内存限制:128 MB 问题描述 一个软件专业的学生 ...

  9. 【LeetCode】870. Advantage Shuffle 解题报告(Python)

    [LeetCode]870. Advantage Shuffle 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn ...

随机推荐

  1. Vue.js知识点总结

    1. Vue.js简介 1.1 Vue.js简介 1.2 创建一个vue实例 2. Vue.js基础 2.1 模板语法 2.2 环境搭建 2.3 生命周期钩子

  2. Oracle-一张表中增加计算某列值重复的次数列,并且把表中其他列也显示出来,或者在显示过程中做一些过滤

    总结: 1.计算某列值(数值or字符串)重复的次数 select 列1,count( 列1 or *) count1  from table1 group by 列1 输出的表为:第一列是保留唯一值的 ...

  3. 使用SpringBoot实现登录注册的几个问题

    一.用户名密码都正确的情况下被登录拦截器拦截 控制台报错:org.apache.ibatis.executor.ExecutorException: A query was run and no Re ...

  4. 理解ASP.NET Core - 模型绑定&验证(Model Binding and Validation)

    注:本文隶属于<理解ASP.NET Core>系列文章,请查看置顶博客或点击此处查看全文目录 模型绑定 什么是模型绑定?简单说就是将HTTP请求参数绑定到程序方法入参上,该变量可以是简单类 ...

  5. React 16.13.1触发两次render

    一段很普通的代码,出发了两次render import React, { useState, useEffect } from 'react' const MouseTracker: React.FC ...

  6. Scala(六)【模式匹配】

    目录 一.基本语法 二.匹配固定值 三.守卫 四.匹配类型 五.匹配集合 1.Array 2.List 3.元祖 4.对象和样例类 六.偏函数 七.赋值匹配 八.for循环匹配 一.基本语法 在匹配某 ...

  7. react动态添加样式:style和className

    react开发过程中,经常会需要动态向元素内添加样式style或className,那么应该如何动态添加呢??? 一.react向元素内,动态添加style 例如:有一个DIV元素, 需要动态添加一个 ...

  8. windows下 apache 二级域名相关配置 【转】

    转至: http://www.th7.cn/Program/php/201306/141305.shtml 今天给大家总结下 windows 下 apache的二级域名的相关配置 下面就利用本地127 ...

  9. 2019广东工业大学新生杯决赛 I-迷途的怪物

    题目:I-I-迷途的怪物_2019年广东工业大学腾讯杯新生程序设计竞赛(同步赛) (nowcoder.com) 将(p-1)^n 按照多项式定理拆开,会发现只有一项没有p,其余项都有p,可直接约掉. ...

  10. linux安装redis报错

    问题:You need tcl 8.5 or newer in order to run the Redis test 解决办法: wget http://downloads.sourceforge. ...