Leetcode210-Course Schedule II

ETAS工具导入DBC生成Com协议栈 ETAS工具导入DBC主要也是生成arxml用的,ETAS推荐使用Cobra导入,本文介绍导入过程及注意事项不管是导入DBC还是arxml,本质上都是为了生成对应的com协议栈,目的是为了减少重复的工作量,所以,前期定义好收发的矩阵很重要,一般导入一次之后,后面就可以按变更点手动更改了。 阅读详情

我的新博客地址:Hu Haoyu’s Blog,欢迎参观!

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, return the ordering of courses you should take to finish all courses.

There may be multiple correct orders, you just need to return one of them. If it is impossible to finish all courses, return an empty array.

For example:

2, [[1,0]]

There are a total of 2 courses to take. To take course 1 you should have finished course 0. So the correct course order is [0,1]

4, [[1,0],[2,0],[3,1],[3,2]]

There are a total of 4 courses to take. To take course 3 you should have finished both courses 1 and 2. Both courses 1 and 2 should be taken after you finished course 0. So one correct course order is [0,1,2,3]. Another correct ordering is[0,2,1,3].

Note:
The input prerequisites is a graph represented by a list of edges, not adjacency matrices. Read more about how a graph is represented.

题意

共有n节课程,课程编号从0至n-1。一些课程可能有先修要求,比如修0号课程前需要先修1号课程,表示为[0,1]。题目给出课程数和先后修课程对,要求返回完成所有课程的顺序。可能有很多正确的上课顺序,你只需返回其中一种。如果不可能完成,则返回空数组。

比如:

2, [[1,0]]

共有2节课程。选修1号课程前需要先修0号课程,故上课顺序为[0,1]。

4, [[1,0],[2,0],[3,1],[3,2]]

共有4节课程。正确的上课顺序为[0,2,1,3]。

提示:

输入的prerequisites是由边表示的图,而非邻接矩阵。

分析

此题是Leetcode207-Course Schedule的进阶版,前者只需得出能否完成所有课程即可,本题还需要给出上课顺序。实际上这是一个求拓扑排序的题(至于是拓扑全序还是拓扑偏序,是不一定的)。可以有2种求解方法。

  • 第一种:采用bfs。前处理时得到每个节点的入度。每次将入度为0的节点入队。出队时将出队节点的邻接节点的入度减1,并将出队节点编号计入answer数组中。循环该过程直到队列为空。如仍有节点未被访问,则说明课程关系图中出现了环,不可能完成所有课程。否则,answer中的编号顺序就是上课顺序。

  • 第二种:采用dfs。需要一个onStack数组纪录dfs的路径上的节点,用于判断环的存在。而isVisited数组责纪录dfs中访问过的节点。而其reversePostOrder就是上课顺序。具体可以google搜索reversePostOrder。这种方法比较难理解,但很有意思。最终给出的AC代码也是第二种方法。

注意

  • 值得注意的是,特殊情况输入numCourses = 1,prereqisities为空数组时,答案为[0],只有1个节点,并没有边的存在。

  • 第二种方法中onStack在每次结束本次递归时,需要变为false,表示这条路径上后面的节点在后面的判断环中,不会被认为是同一路径上的节点。(感觉好绕)

AC代码

class Solution {
public:
    vector<int> findOrder(int numCourses, vector<pair<int, int>>& prerequisites) {
        vector<int> answer;
        if (numCourses == 1) {
            answer.push_back(0); return answer;
        }
        vector<vector<int>> map(numCourses, vector<int>());
        stack<int> reversePostOrder;
        for (int i = 0; i < prerequisites.size(); ++i) {
            map[prerequisites[i].second].push_back(prerequisites[i].first);
        }
        vector<bool> isVisited(numCourses, false);
        for (int i = 0; i < numCourses; ++i) {
            if (!isVisited[i]) {
                vector<bool> onStack(numCourses, false);
                if (hasCycle(map, i, isVisited, onStack, reversePostOrder))
                    return answer;
            }
        }
        while (!reversePostOrder.empty()) {
            int index = reversePostOrder.top(); reversePostOrder.pop();
            answer.push_back(index);
        }
        return answer;
    }
    bool hasCycle(vector<vector<int>> &map, int i, vector<bool> &isVisited, vector<bool> &onStack, stack<int> &reversePostOrder) {
        isVisited[i] = true;
        onStack[i] = true;
        for (int k : map[i]) {
            if (onStack[k])
                return true;
            else if (!isVisited[k])
                if (hasCycle(map, k, isVisited, onStack, reversePostOrder))
                    return true;
        }
        onStack[i] = false;
        reversePostOrder.push(i);
        return false;
    }
};

如果代码或分析有误,请批评指正,谢谢。

http协议 HTTP 协议由起始行、头部、空行、消息体组成。 阅读详情

相关推荐

FPGA_AD9361实战

1.参考网站。

Pual_Georg的博客 748

210. Course Schedule II(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 you have to first take course 1, which is expressed as

X2321002的博客 449

基于 Node.js + MongoDB 技术栈的小众开源短链接程序 —— Lynx

开源的短链接程序有很多,像 YOURLS、Shlink 等大多采用 PHP + MySQL 技术栈。但我之前的服务器配置一般,再加上自己写的小玩具使用的是 Node.js + MongoDB,这些环境已经装在服务器上了,因此更倾向于寻找一款同样基于这套技术栈的短链接程序。搜索了很久才找到这么一款基于的短链接程序——Lynx。这个开源项目非常小众,Star 数只有两百多。

zc_mk的博客 827

LeetCode 210. Course Schedule II(课程安排)

原题网址:https://leetcode.com/problems/course-schedule-ii/ 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 cour

James Pan 926

【SAP PO】SAP PO 接口配置完整教程之二REST服务对接

SAP PO 接口配置完整教程之二REST服务对接

XLevon的博客 1万+

给硬件工程师的UCIe软件配置入门:从寄存器表到实战调试,一篇讲透

本文为硬件工程师提供UCIe软件配置的全面指南,从寄存器表解析到实战调试技巧,涵盖链路训练、错误排查等关键环节。通过详细代码示例和分层诊断法,帮助工程师快速掌握UCIe寄存器访问机制,提升异构集成开发效率。

weixin_30268921的博客 313

LeetCode210 课程安排 II

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:...

fruit513的博客 354

ISCC练习题MISC

解题技巧:看最后括号应该是IceCTF,先用了一键解码啥也没有啊,不对不对!好像是字符频率统计,转换网站:http://quipqiup.com/有人给你发了一串信息,你能解开吗?

m0_62737381的博客 1119

Leetcode 210 Course Schedule II 课程表II

你需要上n个课程,标记为0~n-1。有些课程有前导课,比如你要上课程0必须先上课程1,我们用一个整数对[0,1]来表示。给出课程的总数和一系列的课程先导关系对,返回可以上完所有的课程的上课顺序。可能存在多种正确的顺序,你只需要返回其中一种即可。如果不可能上完所有课程,返回一个空数组。

(ง •̀_•́)ง 2317

程序设计二(面向对象)_实训10_复杂类的实现_ArrayList类的实现

第1关:构造函数与析构函数的实现

2401_83406306的博客 822

PyTorch深度学习实战(47)——使用PyTorch构建Transformer模型

相较于传统模型,如循环神经网络 (RNN),Transformer 的优势在于能够理解输入和输出序列中元素之间的关系,在大语言模型 (如 ChatGPT 和 DeepSeek) 的发展中起到了关键作用,为了从零开始构建 Transformer,首先探讨自注意力机制,包括查询 (query)、键 (key) 和值 (value) 向量,以及缩放点积注意力 (SDPA)。将层归一化和残差连接集成到多头注意力层中,并与前馈层结合,构建编码器层,堆叠编码器层构建编码器,还将实现 Transformer 中的解码器。

盼小辉丶的博客 3万+

LeetCode#210 Course Schedule II(C++版)

题干: 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 expr

zc2985716963的博客 454

【数据集】基于ubESTARFM法的100m 地温LST数据集(澳大利亚)

【数据集】基于ubESTARFM法的100m 地温LST数据集(澳大利亚)

WW、forever的博客 265

leetcode题集: 210. Course Schedule II

第13题:210.Course Schedule II 类似之前写的那篇,这里就不分析了。 题目具体分析请见leetcode题集: 207. Course Schedule和 拓扑排序 两篇文章。就是拓扑排序,加个打印输出拓扑序列。这里直接贴代码了: class Solution { public: vector<int> findOrder(int numC...

wx_14678的博客 206

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

LeetCode 210. Course Schedule II 题解

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

cannonjinx的博客 4256

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

leetcode题解:第210题Course Schedule II

题目 Course Schedule II 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 ...

chenf1999的博客 268

LeetCode 210 Course Schedule II

题目描述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 p

Yano_nankai的博客 1631

LeetCode: 210. Course Schedule II

LeetCode: 210. Course Schedule II 题目描述 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 ...

杨领well的专栏 186

【Leetcode】210. Course Schedule II

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

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

leetcode 210: Course Schedule II

leetcode 210: Course Schedule II Course Schedule 2 java c++ python

西施豆腐渣 4641

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刷题笔记】210. Course Schedule II 有向图能否完全遍历?无环?

class Solution { public: /* 思路:在有向图中能否找到一个无环的路径,遍历所有的节点。 如果有环,则证明无法找到。 贪心思想:首先找到节点中入度为0的节点来进行初始遍历,为什么要入度为0呢? 因为入度为0的情况下,没有其他节点能达到这个节点; 那么如果我们需要遍历所有节点的话,那么我们必须首先从这个节点开始。 ...

知吾朱期应庆的博客 357

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

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

温迪今天刷题了吗 981

LeetCode 210. Course Schedule II【Java】

210. 课程表 II AC代码 本题和207.课程表类似,不过要求让我们输出排课的顺序,也就是拓扑序列了。 在这里返回结果的时候注意,如果这是个有环的图,那么答案数组返回的应该是空数组,之前我没注意,当样例如下时: 2 [[0,1],[1,0]] 返回的结果是[0,0],实际上应该是空数组。为了解决这个问题我们可以和207题一样,通过cnt来计数,最终和课程数相同的话,就返回答案数组否则返回空...

NayelyA的博客 281

【LeetCode 210】Course Schedule II

题意: 在判断能否修完全部课程的基础上,如果能,输出任意一个课程顺序。 思路: 递归。在判断是否有环的基础上,记录访问顺序。 代码: class Solution { public: vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) { ...

iCode_girl的博客 142

leetcode 210. Course Schedule II | 210. 课程表 II(Java)

题目 https://leetcode.com/problems/course-schedule-ii/ 题解 本题与 leetcode 207. Course Schedule 基本相同,代码只需要稍作修改,将图的遍历顺序记录在一个 list 中。 import java.util.ArrayList; import java.util.Collections; class Node { int inDegree; ArrayList<Integer> children;

寒泉 5万+

LeetCode 210. Course Schedule II【图,DFS,BFS,拓扑排序】中等

There are a total of n courses you have to take labelled from 0 to n - 1. Some courses may have prerequisites, for example, if prerequisites[i] = [ai, bi] this means you must take the course bi before the course ai. Given the total number of cour

memcpy0的博客 697
上一篇: Leetcode209-Minimum Size Subarray Sum
下一篇: Pseudo-random algorithm: prd and rsa based
coderhuhy
博客等级 码龄12年 24粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值