207. Course Schedule(课程计划)

【LeetCode】207. Course Schedule 题目链接:课程表 题目描述: 你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程 bi 。 例如,先修课程对 [0, 1] 表示:想要学习课程 0 ,你需要先完成课程 1 。 请你判断是否可能完成所有课程的学习?如果可以,返回 true ;否则,返回 false 阅读详情

以前做的关于图的题比较少,因此这次做这题感觉到相当的难度。虽然之后是想到了要用DFS或者BFS来解题,但是一直想用堆栈、队列来做,苦于能力不行,最后只能上网查询拓扑算法的DFS、BFS做法,并且不再纠结于一定要使用堆栈或者队列,之后便能顺利解决了。总的来说这道题价值很大,第一次对图算法有了一点理解。


关于这道题,先说说BFS做法,个人觉得更为简单。首先利用vector做出一个二维数组的graph图以供搜索,同时利用一个indegree数组记录所有课程的入度然后将入度为0的课程加入到队列中。循环队列,移除当前入度为0的课程,并根据图把入度为0的课程所对应的后续课程的入度-1,若存在后续课程入度为0,加入队列,不断循环直至队列为空。若移除的课程数等于总课程数,则不存在环,否则存在。

class Solution {
public:
    bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
        vector<vector<int>> graph(numCourses, vector<int>(0));
        vector<int> indegree(numCourses, 0);
        queue<int> q;
        
        for (auto t : prerequisites) {
            graph[t.second].push_back(t.first);
            indegree[t.first]++;
        }
        int i;
        for (i = 0; i < indegree.size(); i++) {
            if (!indegree[i])
                q.push(i);
        }
        int count = 0;
        while (!q.empty()) {
            for (auto t : graph[q.front()]) {
                indegree[t]--;
                if (!indegree[t])
                    q.push(t);
            }
            q.pop();
            count++;
        }
        return count == numCourses;
    }
};

接下来说说DFS的做法。类似的要利用vector做出一个用于搜索的graph图,并且利用一个visit数组记录每一个课程的当前状态,0代表未访问,1代表已访问且正确,-1代表不可访问且错误。对每一个课程都进行一次DFS,同时对于某一个课程的所有后续课程都进行一次DFS,若所有后续课程都均可返回true,证明此课程不存在环,因此visit=1代表此课程已访问且正确,否则此课程就是不可访问且错误。

bool DFS(vector<vector<int>>& graph, vector<int>& visit, int i) {
	if (visit[i] == -1)
		return false;
	if (visit[i] == 1)
		return true;
	visit[i] = -1;//等于-1代表不可重复
	for (auto t : graph[i]) {
		if (!DFS(graph, visit, t))
			return false;
	}
	visit[i] = 1;//等于1代表已访问
	return true;
}

class Solution {
public:
    bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
        vector<int> visit(numCourses, 0);
        vector<vector<int>> graph(numCourses, vector<int>(0));

        for (auto t : prerequisites) {
            graph[t.first].push_back(t.second);
        }

        for (int i = 0; i < graph.size(); i++) {
            if (!DFS(graph, visit, i))
                return false;
        }
        return true;
    }
};


Leetcode 207. Course Schedule(Python实现) 思路:将边集合构成一个有向图,判断有向图中是否存在环,如果存在环,则一定不能完成该课程;如果不存在环,还需判断,能否遍历到每个结点,如果能遍历到,那么课程能全部完成,则不然。这里判断有向图中是否存在环,用拓扑排序来实现。 class Solution: def canFinish(self, numCourses: int, prerequisites: List[List[int]]... 阅读详情

相关推荐

计算机组成原理课程设计_微程序控制的简单模型机设计

微程序控制的简单模型机设计 要求 基本要求 完成一个简单主机的设计,模型机应具备如下能力:在自行设计的指令集基础上,运行自行编写的简单用户程序,实现特定运算功能。 弹性要求 在此基础上,完成必要的扩展,实现模型机的功能扩展设计,包括:实现多种运算功能(指令集的扩充)、支持更为丰富的寻址方式、有更为完善的微程序设计等。 实验软件和硬件环境 QuartusII, FPGA计算机组...

sailist的记录站 3万+

LeetCode 207.课程表

你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 。 在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:[0,1] 给定课程总量以及它们的先决条件,请你判断是否可能完成所有课程的学习? class Solution { public: vector<int> visit; bool dfs(int v,vector<vector<int>>& g)

qq_45008831的博客 228

将赛灵思 SDK 工程移植到 Vitis 的分步指南

注:本文转自赛灵思中文社区论坛,源文链接在此。本文原作者为XILINX工程师。 以下为个人译文,仅供参考,如有疏漏之处,还请不吝赐教。 您是赛灵思软件开发套件 (SDK) 用户吗? 您是否正在计划将自己的工程移植到 Vitis 软件平台? 那么本篇工程移植分步指南将能祝您一臂之力。 从 2019.2 版开始,赛灵思 SDK 开发环境已统一整合到全功能一体化的 Vitis™ 统一软件平台中。 尊敬的 SDK 用户,您只需轻点几下鼠标即可体验这一功能丰富的工具! 马上开始将工程从赛灵思 S

weixin_45825101的博客 1731

Leetcode 207.课程表(Course Schedule)

Leetcode 207.课程表 1 题目描述(Leetcode题目链接)   你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 。 在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:[0,1] 给定课程总量以及它们的先决条件,请你判断是否可能完成所有课程的学习? 输入: 2, [[1,0]] 输...

qq_39378221的博客 587

多传感器融合SLAM指南:如何结合视觉与激光雷达提升建图精度

本文深入探讨了多传感器融合SLAM技术,详细解析了如何将视觉传感器与激光雷达(特别是3D激光雷达)进行深度融合以提升建图精度与鲁棒性。文章从传感器特性分析、数据同步标定、前端融合策略(松耦合与紧耦合)到后端优化与地图构建,提供了完整的实战指南,并重点介绍了V-LOAM等经典融合框架的核心思想,旨在帮助开发者构建适应复杂动态环境的高精度SLAM系统。

weixin_29056145的博客 535

【11】科曼医疗——科曼医疗 嵌入式--面试,校招,面试问答记录

科曼医疗嵌入式校招面试记录:3位面试官分别考察应用层技术、底层技术和HR面。技术问题涵盖C++特性(多态、虚函数、指针与引用区别)、内存管理(malloc与new对比)、嵌入式基础(51最小系统、IIC/SPI协议)及项目经验(智能黑板擦专利项目)。同时考察了Linux使用经验、STM32开发及嵌入式操作系统认知。最后环节应聘者询问了开发环境及面试流程。面试内容全面覆盖嵌入式开发核心知识点。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1248

207. Course Schedule

输入:课程数量n,每个课程的编号是0到n-1。课程学习的先后顺序用数组输入,例如[0,1]。要学习课程0,需要先学习课程1。 输出:如果可以学习完所有的课程,返回true,否则返回false。 分析:因为有些课程学习需要其他课程学习完才可以,这是拓扑排序的描述。我们可以根据数组对,建立一个有向图。方向是从前提课程指向能够到达的课程。需要从没有先决条件的课程i开始,接着课程i能到达的课程j入度减1。...

约定的博客 274

10、GPU发展历程:从光线追踪到网格着色器的技术革新

本文回顾了GPU的发展历程,重点探讨了从光线追踪到网格着色器的技术革新。涵盖了DirectX 12时代(2015-2020)光线追踪与AI结合的突破,包括NVIDIA的Volta架构、DLSS技术原理及可变速率着色的应用。随后介绍了DirectX 12 Ultimate时代(2020)网格着色器的引入,分析了其计算模型、细粒度控制能力及跨平台优势。最后总结了着色器的演变及GPU在多个领域的广泛应用。

ol789012345的博客 181

【Leetcode】207. Course Schedule

题目地址: https://leetcode.com/problems/course-schedule/ 给定一个正整数代表需要修的课程数量,再给定修各个课程的先后次序关系(是一个二维数组,每个位置的(a,b)(a,b)(a,b)代表bbb是aaa的前置课程)。问是否存在一种上课顺序能上完所有的课。 用图论建模,可以把每个课程想象成图中的顶点,如果课程v1v_1v1​是v2v_2v2​的先修课程,......

数学、算法爱好者的博客 505

HarmonyOS 鸿蒙开发DevEco Studio OpenHarmony:安全测试

通过对HarmonyOS应用生命周期建模和应用攻击面建模,采用静态数据流分析技术,提高漏洞发现的准确率,同时覆盖20余种攻击面,65+漏洞测试项,帮助开发者提前发现和识别漏洞隐患。在检测报告中,会针对每一项漏洞风险项给出明确的修复建议,可以帮助开发者快速修复漏洞。

斌擎科技 1179

Python内置函数zip()——《Python内置函数手册》Python老吕编著

zip()函数是 Python 中的一个内置函数,用于将多个可迭代对象(如列表、元组、字符串等)中对应的元素打包成一个个元组,然后返回由这些元组组成的迭代器。zip()函数常用于将多个序列并行迭代,或者用于数据对齐。zip()它返回一个迭代器,这意味着你可以逐个获取打包后的元素,而不是一次性将所有元素加载到内存中。如果输入的可迭代对象长度不一致,zip()会以最短的可迭代对象为准,只打包到最短对象的末尾。它可以用来并行迭代多个序列,使得代码更加简洁和高效。在接下来的章节中,我们将详细介绍。

Python老吕的博客 680

LeetCode -- 207. Course Schedule(课程计划)

文章目录一、原文二、翻译三、分析3.1 利用拓扑排序3.2 DFS四、AC代码4.1 利用拓扑排序4.2 DFS 一、原文 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...

adonis-stan的博客 208

在 TASKPROCESSING 上为 ABAP OData 服务添加多个系统别名:从原理到落地的完整实践

本文面向SAP Gateway与ABAP开发者,详细讲解如何在TASKPROCESSING OData服务上添加系统别名。首先介绍了系统别名的概念与设计初衷,阐述了添加别名的业务场景需求,包括多系统接入、用户分流和灰度发布等。随后提供了标准配置步骤,从SPRO路径到具体操作说明,并分享了三个实际案例说明如何实现跨区域统一待办、按用户角色分流和灰度发布。最后给出了验证方法和常见问题解决方案,帮助开发者掌握这项基础但关键的配置技能,实现服务路由的可控管理。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 135

leetcode 207. Course Schedule 课程计划 ---------- java

There are a total ofncourses you have to take, labeled from0ton - 1. Some courses may have prerequisites, for example to take course 0 you have to first take course 1, which is expressed as a pa...

weixin_30596165的博客 115

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

java学期教师教学计划_leetcode 207. Course Schedule 课程计划 ---------- java

There are a total ofncourses you have to take, labeled from0ton - 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...

weixin_39877050的博客 123

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

LeetCode 207. Course Schedule 题解

本题是拓扑排序的经典问题,主要考察对拓扑排序算法的理解和应用。通过构建邻接表和入度数组,然后使用队列进行拓扑排序,我们可以判断是否存在环,从而确定是否可以完成所有课程的学习。拓扑排序的核心思想是:按照依赖关系的顺序,依次处理入度为 0 的节点。如果最终所有节点都被处理,说明不存在环;否则,说明存在环。这种方法不仅适用于课程表问题,还可以应用于许多其他需要处理依赖关系的场景,例如任务调度、编译顺序等。掌握拓扑排序的思想,对于解决这类问题非常重要。

cannonjinx的博客 4264

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

[leetcode] 207. Course Schedule 解题报告

题目链接:https://leetcode.com/problems/course-schedule/ 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

小榕流光的专栏 1939

[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 prerequisites, for example to take course 0 you have to first take course 1, which is expressed as

coder 进阶的专栏 1938

LeetCode 207. Course Schedule

图和dfs

Llunnn的博客 339

leetcode题集: 207. Course Schedule

上次写了关于拓扑排序的写法,今天这个题就是关于拓扑排序的应用与改进。 第12题:207.Course Schedule 文章大意:课程安排,课程之间有依赖性。给定课程数,和课程之间的依赖,判断课程能否顺利完成。 题目分析:这不就是之前写的拓扑排序能干嘛吗?所以这是一个拓扑排序的问题,所以啊直接开始干。要注意的是,后面给数组中,后面一个表示前驱节点。即[1,0]表示的是0->1. ...

wx_14678的博客 298

Leetcode 207. Course Schedule 210. Course Schedule II

Leetcode 207. Course Schedule  import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; public class Solution { public boolean canFinish(int numCour

独钓寒江雪 318

LeetCode 207. Course Schedule && LeetCode 210. Course Schedule II

LeetCode 207. Course Schedule && LeetCode 210. Course Schedule II (Medium) 主要知识点:拓扑排序、BFS、DFS;优先级:5

温迪今天刷题了吗 981

leetcode 207: Course Schedule

leetcode 207 : Course Schedule

西施豆腐渣 5423

[leetcode] 207. Course Schedule

Description 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 expresse...

Learning from the mistakes 240

LeetCode 207 Course Schedule

LeetCode 207 Course Schedule 题意 有0~n-1共n门课你需要进修,其中一些课程需要在修完其他课程后才能进修,例如(0,1)表示要进修课程0你必须先修完课程1。给出课程的总数以及一个列表表示所有的先决条件,问是否可能修完所有课程。 注: 课程先决条件可以看作是由一个图的边(edge)组成 不会出现重复的边 思路 假如将每个先决条件(a,b)看作是b到a的有向边,整个...

EricJeffrey的博客 164
上一篇: 240. Search a 2D Matrix II(搜索二维矩阵之二)
下一篇: 210. Course Schedule II(课程清单之二)
BetweenRain
博客等级 码龄9年 0粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值