力扣207题“课程表”

在本篇文章中,我们将详细解读力扣第207题“课程表”。通过学习本篇文章,读者将掌握如何使用拓扑排序和深度优先搜索(DFS)来解决这一问题,并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释,以便于理解。

问题描述

力扣第207题“课程表”描述如下:

你这个学期必须选修 numCourses 门课程,记为 0numCourses-1。在选修某些课程之前需要一些先修课程。先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [a, b] ,表示如果要学习课程 a 则必须先学习课程 b

例如,先修课程对 [0, 1] 表示要学习课程 0 你需要先完成课程 1

请你判断是否可能完成所有课程的学习?如果可以,返回 true;否则,返回 false。

示例:

输入: numCourses = 2, prerequisites = [[1, 0]]
输出: true
解释: 总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。所以这是可能的。

示例:

输入: numCourses = 2, prerequisites = [[1, 0], [0, 1]]
输出: false
解释: 总共有 2 门课程。学习课程 1 之前,你需要完成课程 0,同时学习课程 0 之前,你还应完成课程 1。这是不可能的。

解题思路

方法一:拓扑排序(BFS)
  1. 初步分析

    • 使用拓扑排序来检测是否存在环,如果存在环则无法完成所有课程的学习。
  2. 步骤

    • 创建一个入度表 in_degree 和邻接表 adj_list
    • 遍历 prerequisites,填充 in_degreeadj_list
    • 使用队列保存所有入度为0的课程。
    • 依次从队列中取出课程,减少其相邻课程的入度,如果相邻课程的入度变为0,将其加入队列。
    • 如果遍历完成后,所有课程都能入队,则说明没有环,可以完成所有课程的学习。
代码实现
from collections import dequedef canFinish(numCourses, prerequisites):in_degree = [0] * numCoursesadj_list = [[] for _ in range(numCourses)]for dest, src in prerequisites:in_degree[dest] += 1adj_list[src].append(dest)queue = deque([i for i in range(numCourses) if in_degree[i] == 0])count = 0while queue:current = queue.popleft()count += 1for neighbor in adj_list[current]:in_degree[neighbor] -= 1if in_degree[neighbor] == 0:queue.append(neighbor)return count == numCourses# 测试案例
print(canFinish(2, [[1, 0]]))  # 输出: True
print(canFinish(2, [[1, 0], [0, 1]]))  # 输出: False
方法二:深度优先搜索(DFS)
  1. 初步分析

    • 使用深度优先搜索检测是否存在环,如果存在环则无法完成所有课程的学习。
  2. 步骤

    • 创建一个标记数组 visited,用来标记每个节点的状态:0-未访问,1-访问中,2-已访问。
    • 遍历每个节点,对每个未访问的节点进行DFS。
    • 如果在DFS过程中遇到访问中的节点,则说明存在环。
    • 如果DFS结束后没有遇到访问中的节点,则可以完成所有课程的学习。
代码实现
def canFinish(numCourses, prerequisites):adj_list = [[] for _ in range(numCourses)]for dest, src in prerequisites:adj_list[src].append(dest)visited = [0] * numCoursesdef dfs(node):if visited[node] == 1:return Falseif visited[node] == 2:return Truevisited[node] = 1for neighbor in adj_list[node]:if not dfs(neighbor):return Falsevisited[node] = 2return Truefor i in range(numCourses):if not dfs(i):return Falsereturn True# 测试案例
print(canFinish(2, [[1, 0]]))  # 输出: True
print(canFinish(2, [[1, 0], [0, 1]]))  # 输出: False

复杂度分析

  • 时间复杂度
    • 拓扑排序(BFS):O(V + E),其中 V 是课程数,E 是先修课程数。需要遍历所有节点和边。
    • 深度优先搜索(DFS):O(V + E),同样需要遍历所有节点和边。
  • 空间复杂度
    • 拓扑排序(BFS):O(V + E),用于存储入度表、邻接表和队列。
    • 深度优先搜索(DFS):O(V + E),用于存储邻接表和递归调用栈。

模拟面试问答

问题 1:你能描述一下如何解决这个问题的思路吗?

回答:我们可以使用拓扑排序和深度优先搜索来解决这个问题。使用拓扑排序来检测是否存在环,如果存在环则无法完成所有课程的学习。使用深度优先搜索遍历图,检测是否存在环,如果存在环则无法完成所有课程的学习。

问题 2:为什么选择使用拓扑排序和深度优先搜索来解决这个问题?

回答:拓扑排序和深度优先搜索是检测图中环的常用方法。拓扑排序通过入度表和队列来实现,深度优先搜索通过递归遍历节点来实现。两种方法都可以高效地检测图中是否存在环,适用于处理课程表问题。

问题 3:你的算法的时间复杂度和空间复杂度是多少?

回答:两种方法的时间复杂度都是 O(V + E),其中 V 是课程数,E 是先修课程数。需要遍历所有节点和边。空间复杂度为 O(V + E),用于存储入度表、邻接表和队列(拓扑排序)或递归调用栈(深度优先搜索)。

问题 4:在代码中如何处理边界情况?

回答:对于没有先修课程的情况,可以直接返回 true,因为可以完成所有课程的学习。对于只有一个课程的情况,同样可以直接返回 true。通过这种方式,可以处理边界情况。

问题 5:你能解释一下拓扑排序的工作原理吗?

回答:拓扑排序是一种用于有向无环图的排序算法,通过将节点按其依赖关系进行排序。我们使用入度表记录每个节点的入度,通过队列保存所有入度为0的节点,依次遍历队列中的节点,减少其相邻节点的入度,如果相邻节点的入度变为0,将其加入队列。最终,如果遍历结束后所有节点都能入队,则说明没有环,可以完成所有课程的学习。

问题 6:在代码中如何确保返回的结果是正确的?

回答:通过使用拓扑排序或深度优先搜索遍历图,检测是否存在环,确保返回的结果是正确的。如果存在环,则返回 false;如果没有环,则返回 true。

问题 7:你能举例说明在面试中如何回答优化问题吗?

回答:在面试中,如果面试官问到如何优化算法,我会首先分析当前算法的瓶颈,如时间复杂度和空间复杂度,然后提出优化方案。例如,可以通过减少不必要的操作和优化数据结构来提高性能。解释其原理和优势,最后提供优化后的代码实现。

问题 8:如何验证代码的正确性?

回答:通过运行代码并查看结果,验证是否可以完成所有课程的学习。可以使用多组测试数据,包括正常情况和边界情况,确保代码在各种情况下都能正确运行。例如,可以在测试数据中包含多个课程和先修课程,确保代码结果正确。

问题 9:你能解释一下解决课程表问题的重要性吗?

回答:解决课程表问题在图论和调度问题中具有重要意义。通过学习和应用拓扑排序和深度优先搜索,可以提高处理图结构和检测环的能力。在实际应用中,课程表问题广泛用于任务调度、项目管理和依赖关系分析等领域。

问题 10:在

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/29791.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

滚球游戏笔记

1、准备工作 (1) 创建地面:3D Object-Plane,命名为Ground (2) 创建小球:3D Object-sphere,命名为Player,PositionY 0.5。添加Rigidbody组件 (3) 创建文件夹:Create-Foder,分别命名为Material…

css3多列布局

css3多列布局 colmns属性 columns属性是一个简写属性 column-count属性:定义列的数量或者允许的最大列数 auto 为默认值,用于表示列的数量由其他css属性决定number 必须是正整数,用于定义列数量 column-width属性:定义列的宽度 …

Java入门第01篇

文章目录 前言 一、Java是什么? 二、Java开发工具 1.Java 2.开发工具 3.构建工具 三、Java开发过程 1.IDEA操作 2.Maven操作 2.1本地jar包的情况 3.docker操作 总结 前言 机缘巧合,接触到了Java开发,那就把了解学习到的一些东西…

【Arc gis】使用DEM提取流域范围

地址:arcgis DEM 提取流域范围(详细教程)(空间分析--Hydrology)_gis的gridcode是什么意思-CSDN博客

AUTOSAR学习

文章目录 前言1. 什么是autosar?1.1 AP(自适应平台autosar)1.2 CP(经典平台autosar)1.3 我的疑问 2. 为什么会有autosar3.autosar的架构3.1 CP的架构3.1.1 应用软件层3.1.2 运行时环境3.1.3 基础软件层 3.2 AP的架构 4. 参考资料 …

shell脚本中的变量

关于Linux操作系统中当前shell进程与子shell进程的详细解释 如上图所示,使用ps -f可以当前查看Linux操作系统中当前正在运行的进程。 然后敲bash后,相当于在当前的bash shell环境下又创建了一个子bash shell的进程, 如上图所示,…

Qt | QPalette 类(调色版)

01、简介 1、需要用到 QWidget类中的如下属性 palette:QPalette 访问函数:const QPalette &palette() const; void setPalette(const QPalette&);  该属性描述了部件的调色板。在渲染标准部件时,窗口部件的样式会使用调色板,而且不同的平台或不同的样式通常具…

win环境安装Node.js的多种方式

今天我们分享win环境安装Node.js的多种方式: 首先要明白Node.js是一个JavaScript运行环境,它基于Google的V8引擎进行封装,允许JavaScript运行在服务器端。Node.js让JavaScript成为一种与PHP、Python、Perl、Ruby等服务端语言平起平坐的脚本语…

图神经网络入门(1)-networkx

简介 NetworkX是一个Python语言的图论建模工具,用于创建、操作复杂网络结构(如图、有向图等)。它提供了许多用于分析网络、生成随机网络、以及可视化网络的函数和工具。用户可以利用NetworkX来研究复杂网络的拓扑结构、节点间的关系以及路径查…

【GIS案例】居住环境适宜性评价

目的: 拟购买住宅,需在现有条件下,基于地理空间分析方法和空间认知模型对居住环境进行综合评价。通过该实验掌握基于GIS的地理空间认知方法及土地适宜性评价基本原理与方法。 数据: (1)人口调查图(pop); (2)公园入口图(parkgate); (3)医院分布图(hospital…

【RK3588/算能/Nvidia智能盒子】挑战「无电无网」部署AI算法,守护大亚湾荃美石化码头工地安全

“万顷碧波之上,一座千米钢栈桥如蛟龙出水,向大海蜿蜒。钢栈桥上的项目建设者正在加紧作业,为助推惠州大亚湾加快建设成为世界级绿色石化基地全力奋战。”这是不久前北京日报对大亚湾惠州港荃湾港区荃美石化码头工地的描述。 △ 图片来源于北…

vue项目cnpm i 报错

报错内容: Install fail! TypeError: Cannot convert undefined or null to object npminstall version: 3.28.1 npminstall args: C:\Program Files\nodejs\node.exe C:\Users\user\AppData\Roaming\nvm\v12.4.0\node_modules\cnpm\node_modules\npminstall\bin\i…

序列化与反序列化漏洞实例

实验环境&#xff1a; 本次的序列化与反序列化漏洞为2021年强网杯上的一道比赛题目&#xff0c;我使用phpstudy集成环境将其测试环境搭建在了本地&#xff0c;如下。涉及的几个页面php为&#xff1a; index.php function.php myclass.php index.php : <?php // inde…

2024年阿里巴巴全球数学竞赛首次向人工智能(AI)开放

大家好&#xff0c;我是微学AI&#xff0c;最近大家突然开始关注阿里巴巴全球数学竞赛了&#xff0c;在这个人工智能爆发的时代&#xff0c;2024年阿里巴巴全球数学竞赛首次向人工智能&#xff08;AI&#xff09;开放&#xff0c;要求参赛的AI模型在比赛前提交源代码&#xff0…

数据上云--科技感满满

迁移上云&#xff1a;目的 1 为什么要上云 ① 公司发展规划&#xff0c;需要上云 如果我自己公司是自研的 ② 国家要求&#xff0c;第二&#xff1a;自研产品&#xff0c;但是公司不是纯靠销售来去盈利发展&#xff0c;而还会设计需要将我们的技术服务&#xff0c;提供给客户…

个人博客测试用例设计

个人博客测试用例设计 个人博客测试用例 分别从功能、性能、安全、兼容及界面分别展开 个人博客测试用例

【长春理工大学主办 | EI检索稳定 | SPIE出版 | 过往4届均检索 】第五届计算机视觉和数据挖掘国际学术会议(ICCVDM 2024)

第五届计算机视觉和数据挖掘国际学术会议&#xff08;ICCVDM 2024&#xff09; 2024 5th International Conference on Computer Vision and Data Mining 会议简介 第五届计算机视觉与数据挖掘国际学术会议&#xff08;ICCVDM 2024&#xff09;将于2024年7月19-21日在中国长春…

内部类介绍

内部类&#xff08;Inner Class&#xff09;是在另一个类的内部定义的类。它可以访问外部类的所有成员&#xff0c;包括私有成员。内部类有两种主要形式&#xff1a;局部内部类&#xff08;定义在方法内部&#xff09;和成员内部类&#xff08;定义在类的内部&#xff0c;但不在…

day02论文学习:能够使大语言模型产生带有引用的文章

1.主题&#xff1a;Enabling Large Language Models to Generate Text with Citations&#xff08;能够使大语言模型产生带有引用的文章&#xff09; 引用出处&#xff1a; Gao, T., Yen, H., Yu, J., & Chen, D. (2023). Enabling Large Language Models to Generate Tex…

PostgreSQL源码分析——CREATE SERVER

我们分析一下外部数据包装器中创建外部服务器的CREATE SERVER命令的实现源码。前面已经分析过很多DDL的语法实现。这里简单描述一下大致过程。 主流程如下所示&#xff1a; exec_simple_query(query_string); --> pg_parse_query(query_string);--> raw_parser(query_s…