Leetcode(210)——课程表 II

拓扑排序解决先行课问题   问题:某学院有n 门课程,(i,j)表示课程i是课程j的先行课,即课程i必须在课程j之前的学期开设。对任意给出的先行课集合S={(1,3),(2,4),(3,5),(4,6),(3,7).},至少需要安排多少个学期? 给出每个学期所开的课程清单。   分析:先行课问题最普遍的一类解法就是拓扑排序,拓扑排序简单理解就是不断地在图中找到入度为零的节点,将每一批入度为零的节点都作为同一个学期的课进行... 阅读详情

Leetcode(210)——课程表 II

题目

现在你总共有 numCourses 门课需要选,记为 0 到 numCourses - 1。给你一个数组 prerequisites ,其中 prerequisites[i]=[ai,bi]prerequisites[i] = [a_i, b_i]prerequisites[i]=[ai​,bi​] ,表示在选修课程 aia_iai​ 前 必须 先选修 bib_ibi​。

例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示:[0,1] 。
返回你为了学完所有课程所安排的学习顺序。可能会有多个正确的顺序,你只要返回 任意一种 就可以了。如果不可能完成所有课程,返回 一个空数组 。

示例 1:

输入:numCourses = 2, prerequisites = [[1,0]]
输出:[0,1]
解释:总共有 2 门课程。要学习课程 1,你需要先完成课程 0。因此,正确的课程顺序为 [0,1] 。

示例 2:

输入:numCourses = 4, prerequisites = [[1,0],[2,0],[3,1],[3,2]]
输出:[0,2,1,3]
解释:总共有 4 门课程。要学习课程 3,你应该先完成课程 1 和课程 2。并且课程 1 和课程 2 都应该排在课程 0 之后。
因此,一个正确的课程顺序是 [0,1,2,3] 。另一个正确的排序是 [0,2,1,3] 。

示例 3:

输入:numCourses = 1, prerequisites = []
输出:[0]

提示:

  • 1 <= numCourses <= 2000
  • 0 <= prerequisites.length <= numCourses * (numCourses - 1)
  • prerequisites[i].length == 2
  • 0 <= aia_iai​, bib_ibi​ < numCourses
  • aia_iai​ != bib_ibi​
  • 所有 [ai,bi][a_i, b_i][ai​,bi​] 互不相同

题解

关键点:对有向图进行「拓扑排序」的一个附加效果是:能够顺带检测有向图中是否存在环

在这里插入图片描述

方法一:DFS

思路

​​  我们可以将深度优先搜索的流程与拓扑排序的求解联系起来,用一个栈来存储所有已经搜索完成的节点。

对于一个节点 uu,如果它的所有相邻节点都已经搜索完成,那么在搜索回溯到 uu 的时候,uu 本身也会变成一个已经搜索完成的节点。这里的「相邻节点」指的是从 uu 出发通过一条有向边可以到达的所有节点。

​​  假设我们当前搜索到了节点 uuu,如果它的所有相邻节点都已经搜索完成,那么这些节点都已经在栈中了,此时我们就可以把 uuu 入栈。可以发现,如果我们从栈顶往栈底的顺序看,由于 uuu 处于栈顶的位置,那么 uuu 出现在所有 uuu 的相邻节点的前面。因此对于 uuu 这个节点而言,它是满足拓扑排序的要求的。
​​  这样以来,我们对图进行一遍深度优先搜索。当每个节点进行回溯的时候,我们把该节点放入栈中。最终从栈顶到栈底的序列就是一种拓扑排序。

​​对于图中的任意一个节点,它在搜索的过程中有三种状态,即:

  • 「未搜索」:我们还没有搜索到这个节点;
  • 「搜索中」:我们搜索过这个节点,但还没有回溯到该节点,即该节点还没有入栈,还有相邻的节点没有搜索完成);
  • 「已完成」:我们搜索过并且回溯过这个节点,即该节点已经入栈,并且所有该节点的相邻节点都出现在栈的更底部的位置,满足拓扑排序的要求。

​​  通过上述的三种状态,我们就可以给出使用深度优先搜索得到拓扑排序的算法流程,在每一轮的搜索搜索开始时,我们任取一个「未搜索」的节点开始进行深度优先搜索。

  • 我们将当前搜索的节点 uuu 标记为「搜索中」,遍历该节点的每一个相邻节点 vvv:
    • 如果 vvv 为「未搜索」,那么我们开始搜索 vvv,待搜索完成回溯到 uuu;
    • 如果 vvv 为「搜索中」,那么我们就找到了图中的一个环,因此是不存在拓扑排序的;
    • 如果 vvv 为「已完成」,那么说明 vvv 已经在栈中了,而 uuu 还不在栈中,因此 uuu 无论何时入栈都不会影响到 (u,v)(u, v)(u,v) 之前的拓扑关系,以及不用进行任何操作。
  • 当 uuu 的所有相邻节点都为「已完成」时,我们将 uuu 放入栈中,并将其标记为「已完成」。

​​  在整个深度优先搜索的过程结束后,如果我们没有找到图中的环,那么栈中存储这所有的 nnn 个节点,从栈顶到栈底的顺序即为一种拓扑排序。
​​  下面的 GIF 给出了深度优先搜索的可视化流程。图中的「白色」「黄色」「绿色」节点分别表示「未搜索」「搜索中」「已完成」的状态。

在这里插入图片描述

代码实现

Leetcode 官方题解:

class Solution {
private:
    // 存储有向图
    vector<vector<int>> edges;
    // 标记每个节点的状态:0=未搜索,1=搜索中,2=已完成
    vector<int> visited;
    // 用数组来模拟栈,下标 0 为栈底,n-1 为栈顶
    vector<int> result;
    // 判断有向图中是否有环
    bool valid = true;

public:
    void dfs(int u) {
        // 将节点标记为「搜索中」
        visited[u] = 1;
        // 搜索其相邻节点
        // 只要发现有环,立刻停止搜索
        for (int v: edges[u]) {
            // 如果「未搜索」那么搜索相邻节点
            if (visited[v] == 0) {
                dfs(v);
                if (!valid) {
                    return;
                }
            }
            // 如果「搜索中」说明找到了环
            else if (visited[v] == 1) {
                valid = false;
                return;
            }
        }
        // 将节点标记为「已完成」
        visited[u] = 2;
        // 将节点入栈
        result.push_back(u);
    }

    vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
        edges.resize(numCourses);
        visited.resize(numCourses);
        for (const auto& info: prerequisites) {
            edges[info[1]].push_back(info[0]);
        }
        // 每次挑选一个「未搜索」的节点,开始进行深度优先搜索
        for (int i = 0; i < numCourses && valid; ++i) {
            if (!visited[i]) {
                dfs(i);
            }
        }
        if (!valid) {
            return {};
        }
        // 如果没有环,那么就有拓扑排序
        // 注意下标 0 为栈底,因此需要将数组反序输出
        reverse(result.begin(), result.end());
        return result;
    }
};
复杂度分析

时间复杂度:O(n+m)O(n+m)O(n+m),其中 nnn 为课程数,mmm 为先修课程的要求数。这其实就是对图进行深度优先搜索的时间复杂度。
空间复杂度:O(n+mO(n+mO(n+m)。题目中是以列表形式给出的先修课程关系,为了对图进行深度优先搜索,我们需要存储成邻接表的形式,空间复杂度为 O(n+m)O(n+m)O(n+m)。在深度优先搜索的过程中,我们需要最多 O(n)O(n)O(n) 的栈空间(递归)进行深度优先搜索,并且还需要若干个 O(n)O(n)O(n) 的空间存储节点状态、最终答案等。

方法二:BFS+贪心算法

思路

​​  因为方法一的深度优先搜索是一种「逆向思维」:最先被放入栈中的节点是在拓扑排序中最后面的节点。我们也可以使用正向思维,顺序地生成拓扑排序,这种方法也更加直观。采用 BFS 实现的拓扑排序实际上应用的是贪心算法,贪心在每一步都选择入度为0的点输出。

​​  我们考虑拓扑排序中最前面的节点,该节点一定不会有任何入边,也就是它没有任何的先修课程要求。当我们将一个节点加入答案中后,我们就可以移除它的所有出边,代表着它的相邻节点少了一门先修课程的要求。如果某个相邻节点变成了「没有任何入边的节点」,那么就代表着这门课可以开始学习了。按照这样的流程,我们不断地将没有入边的节点加入答案,直到答案中包含所有的节点(得到了一种拓扑排序)或者不存在没有入边的节点(图中包含环)。

​​  上面的想法类似于广度优先搜索,因此我们可以将广度优先搜索的流程与拓扑排序的求解联系起来。

​​  我们使用一个队列来进行广度优先搜索。开始时,所有入度为 000 的节点都被放入队列中,它们就是可以作为拓扑排序最前面的节点,并且它们之间的相对顺序是无关紧要的。

​​在广度优先搜索的每一步中,我们取出队首的节点 uuu:

  • 我们将 uuu 放入答案中;
  • 我们移除 uuu 的所有出边,也就是将 uuu 的所有相邻节点的入度减少 111。如果某个相邻节点 vvv 的入度变为 000,那么我们就将 vvv 放入队列中。

​​  在广度优先搜索的过程结束后。如果答案中包含了这 nnn 个节点,那么我们就找到了一种拓扑排序,否则说明图中存在环,也就不存在拓扑排序了。

下面的 GIF 给出了广度优先搜索的可视化流程。

在这里插入图片描述

代码实现

Leetcode 官方题解:

class Solution {
private:
    // 存储有向图
    vector<vector<int>> edges;
    // 存储每个节点的入度
    vector<int> indeg;
    // 存储答案
    vector<int> result;

public:
    vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
        edges.resize(numCourses);
        indeg.resize(numCourses);
        for (const auto& info: prerequisites) {
            edges[info[1]].push_back(info[0]);
            ++indeg[info[0]];
        }

        queue<int> q;
        // 将所有入度为 0 的节点放入队列中
        for (int i = 0; i < numCourses; ++i) {
            if (indeg[i] == 0) {
                q.push(i);
            }
        }

        while (!q.empty()) {
            // 从队首取出一个节点
            int u = q.front();
            q.pop();
            // 放入答案中
            result.push_back(u);
            for (int v: edges[u]) {
                --indeg[v];
                // 如果相邻节点 v 的入度为 0,就可以选 v 对应的课程了
                if (indeg[v] == 0) {
                    q.push(v);
                }
            }
        }

        if (result.size() != numCourses) {
            return {};
        }
        return result;
    }
};

我的:

class Solution {
    // 邻接表——结点结构
    typedef struct NC{
        struct NC *nextl; // 表示下一个具有相同前提课程的课程
        int EP; // 课程下标
        NC(struct NC *a, int b): nextl(a), EP(b){}
    }NumCNode;
    typedef struct NCH{
        int RD; // 入度
        NumCNode *first;
        NCH(): RD(0), first(nullptr){}
    }NumCodeHead;
public:
    vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
        if(numCourses == 0) return {};
        vector<NumCodeHead*> NH;
        NumCNode* tmp;
        // 初始化邻接表头
        for(int n = 0; n < numCourses; n++) NH.push_back(new NumCodeHead);
        // 构造邻接表
        for(auto &it: prerequisites){
            // it[0] 指当前课程 it[1] 指前提课程
            tmp = NH[it[1]]->first;
            NH[it[1]]->first = new NC(tmp, it[0]);
            NH[it[0]]->RD += 1;
        }

        vector<int> ans;
        stack<NumCodeHead*> tools;  // 辅助栈——以避免重复查找入度为0的点
        NumCodeHead* tmpH;
        for(int n = 0; n < numCourses; n++){
            if(NH[n]->RD != 0) continue;
            tools.push(NH[n]);  // 将入度为0的点入栈
            ans.push_back(n);
        }
        
        while(!tools.empty()){
            tmpH = tools.top();
            tools.pop();
            while(tmpH->first != nullptr){
                NH[tmpH->first->EP]->RD -= 1;
                if(NH[tmpH->first->EP]->RD == 0){
                    tools.push(NH[tmpH->first->EP]);
                    ans.push_back(tmpH->first->EP);
                }
                tmpH->first = tmpH->first->nextl;
            }
        }
        if(ans.size() == numCourses) return ans;
        else return {};
    }
};
复杂度分析

时间复杂度:O(n+m)O(n+m)O(n+m),其中 nnn 为课程数,mmm 为先修课程的要求数。这其实就是对图进行广度优先搜索的时间复杂度。
空间复杂度:O(n+m)O(n+m)O(n+m)。题目中是以列表形式给出的先修课程关系,为了对图进行广度优先搜索,我们需要存储成邻接表的形式,空间复杂度为 O(n+m)O(n+m)O(n+m)。在广度优先搜索的过程中,我们需要最多 O(n)O(n)O(n) 的队列空间(迭代)进行广度优先搜索,并且还需要若干个 O(n)O(n)O(n) 的空间存储节点入度、最终答案等。

Java实现 LeetCode 210 课程表 II(二) 210. 课程表 II 现在你总共有 n 门课需要选,记为 0 到 n-1。 在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1] 给定课程总量以及它们的先决条件,返回你为了学完所有课程所安排的学习顺序。 可能会有多个正确的顺序,你只要返回一种就可以了。如果不可能完成所有课程,返回一个空数组。 示例 1: 输入: 2, [[... 阅读详情

相关推荐

LeetCode210——课程表II

我的LeetCode代码仓:https://github.com/617076674/LeetCode 原题链接:https://leetcode-cn.com/problems/course-schedule-ii/description/ 题目描述: 知识点:拓扑排序 思路:拓扑排序 本题的实现和LeetCode207——课程表一模一样,只不过在拓扑排序的时候多用了一个数组来记录...

清风阁 1333

拓扑排序—课程表(leetcode 207)

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

guoxinian的专栏 562

【Leetcode】210.课程表II

拓扑排序,并返回拓扑序

明朗晨光的专栏 669

每日一题(2020-05-17) 210. 课程表 II

[210. 课程表 II] 难度 中等 现在你总共有 n 门课需要选,记为 0 到 n-1。 在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1] 给定课程总量以及它们的先决条件,返回你为了学完所有课程所安排的学习顺序。 可能会有多个正确的顺序,你只要返回一种就可以了。如果不可能完成所有课程,返回一个空数组。 示例 1: 输入: 2, [[1,0]] 输出: [0,1] 解释: 总共有 2 门课程。要学习课程 1,你需要先完成课程

答案在路上,自由在风里 693

联想拯救者恢复出厂设置全攻略

通过本文介绍的几种方法,你可以轻松地将联想拯救者恢复到出厂系统状态。无论是通过Windows恢复选项、高级启动选项还是一键恢复功能,都能帮助你解决系统问题、清除个人信息或重置软件环境。在重置前,请务必备份重要数据,并确保了解重置的影响。重置完成后,进行适当的系统设置和软件安装,让你的联想拯救者焕然一新,继续为你提供高效、稳定的计算体验。

mmoo_python的博客 3252

在Jetson orin NX上安装部署Yolov8

1、环境准备与依赖安装2、安装PyTorch和Torchvision:从NVIDIA官方论坛或开发者下载中心获取与你的JetPack版本兼容的PyTorch wheel文件。例如,对于JetPack 5.1.2,可以安装PyTorch v2.1.0 8。:需要编译安装与PyTorch版本匹配的Torchvision。这里自己编译没有成功,下载了一个现成的可以用torchvision-0.16.2+c6f3977-cp38-cp38-linux_aarch64.whl。

xxxcccvvvbbb的博客 774

LeetCode_210: 课程表

链接 LeetCode_210:课程表 问题 现在你总共有 n 门课需要选,记为0到n-1。 在选修某些课程之前需要一些先修课程。例如,想要学习课程 0 ,你需要先完成课程1 ,我们用一个匹配来表示他们: [0,1] 给定课程总量以及它们的先决条件,返回你为了学完所有课程所安排的学习顺序。 可能会有多个正确的顺序,你只要返回一种就可以了。如果不可能完成所有课程,返回一个空数组。 示例 示例1: 输入: 2, [[1,0]] 输出: [0,1] 解释:总共有 2 门课程。...

AN_ERA的博客 935

永磁同步电机高效标定技术:从理论到实践的全面解析

本文全面解析永磁同步电机高效标定技术,从MTPA标定、弱磁区优化到初始角校准,详细介绍了理论原理和实战技巧。针对新能源汽车应用场景,提供标定系统集成要点和AI辅助优化方案,帮助工程师提升电机性能标定效率与精度。

weixin_28452161的博客 500

课程表 拓扑排序与实现

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

TranSad的博客 884

OpenClaw记忆插件升级实战:从memory-lancedb-pro安装到AgentSkill封装

向量数据库作为现代AI应用的核心基础设施,通过将非结构化数据转换为高维向量并利用相似度检索实现语义理解。其原理基于嵌入模型生成向量表示,结合近似最近邻搜索算法实现高效查询。这项技术为智能体系统提供了长期记忆和上下文感知能力,显著提升了对话连贯性与任务执行效率。在AI智能体开发领域,向量数据库常用于知识库构建、对话历史管理和个性化推荐等场景。本文聚焦OpenClaw框架中memory-lancedb-pro插件的部署实践,针对**插件加载顺序**和**Apache Arrow依赖**两大常见痛点,通过封装成可

weixin_42525482的博客 636

从零到一:在Ubuntu 20.04上搭建ROS1与PX4无人机开发环境

本文详细指导如何在Ubuntu 20.04系统上搭建完整的ROS1与PX4无人机开发环境。内容涵盖ROS Noetic安装、PX4固件源码编译、MAVROS通信桥接以及QGroundControl地面站的配置,并通过Gazebo仿真完成全链路联调测试,为无人机算法开发与验证提供稳定可靠的基础平台。

weixin_29292431的博客 165

210. 课程表 II【 力扣(LeetCode) 】

现在你总共有 numCourses 门课需要选,记为 0 到 numCourses - 1。给你一个数组 prerequisites ,其中 prerequisites[i] = [ai, bi] ,表示在选修课程 ai 前 必须 先选修 bi。可能会有多个正确的顺序,你只要返回 任意一种 就可以了。如果不可能完成所有课程,返回 一个空数组。例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示:[0,1]。每条边只遍历2次,存放入边关系一次,删除一次】

yyh520025的博客 1378

ControlCAN.dll开发适配USBCAN_E/2E_U设备

摘要:本文提供了USBCAN_E/2E_U设备的配置指南:1)安装专用驱动;2)获取最新的ControlCAN.dll文件;3)修改VCI调用顺序,新增VCI_SetReference函数设置波特率;4)使用工具计算波特率配置值,并给出了常见波特率对应的代码参考值(如500K对应0x060007)。配置过程强调使用特定工具计算精确的波特率参数,并提供了相关软件下载链接。

weixin_43969033的博客 387

力扣题解-210. 课程表 II(有向图的拓扑排序)

力扣题解,210. 课程表 II,利用有向图的拓扑排序解决课程表的课程依赖问题。

lpp 5791

什么是plm系统?-数字化转型网

当今世界,产品研发能力是企业在激烈的市场竞争中保持战略优势的核心竞争力之一。如何有效地缩短产品研发周期、改善产品服务的设计迭代流程、有效降低产品的研发成本,也是企业面临的主要问题之一。PLM(Product Lifecycle Management,产品生命周期管理)在优化产品研发的全管理流程、增强企业产品的市场竞争力方面具有关键的作用。

cxo17757154043的博客 881

在lio_sam中融入GPS

在LIO(激光惯性里程计)系统中,将GPS信息融合到里程计中,借助GTSAM(Georgia Tech Smoothing and Mapping)库进行因子图优化,可以有效提升全局定位精度。当进入到GPS信号不好或缺失的环境中,需要借助融合后的里程计反算经纬度,来获取高精度的定位信息。利用GeographicLib第三方库将经纬度投影到局部笛卡尔坐标系中。

如果想成为中心,那么就到中心去吧。 1210

力扣第210题“课程表 II”

本文详细解读了力扣第210题“课程表 II”,通过使用拓扑排序的方法高效地解决了这一问题,并提供了详细的解释和模拟面试问答。希望读者通过本文的学习,能够在力扣刷题的过程中更加得心应手。

10年数据\经营分析经验,现任大厂数据分析负责人 1079

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Leetcode210-课程表II

Leetcode210-课程表II 描述 现在你总共有 n 门课需要选,记为 0 到 n-1。 在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1] 给定课程总量以及它们的先决条件,返回你为了学完所有课程所安排的学习顺序。 可能会有多个正确的顺序,你只要返回一种就可以了。如果不可能完成所有课程,返回一个空数组。 示例1 输入: 2, [[1,0]] 输出: [0,1] 解释: 总共有 2 门课程。要学习课程 1,你需要先完成课程 0

PowerMaxNnn的博客 477

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

210.力扣LeetCode_课程表 II

本文比较了广度优先(BFS)和深度优先(DFS)两种算法解决课程表问题的实现方法。BFS采用拓扑排序思想,通过队列处理入度为0的课程,逐步更新依赖关系,最终判断是否存在循环依赖。DFS则通过递归遍历后续课程,利用访问状态数组检测循环依赖,并逆序存储拓扑结果。两种方法的主要区别在于:BFS通过队列迭代实现,直接正序存储结果;DFS借助递归栈,需要逆序调整结果。空间复杂度上,BFS更稳定,而DFS可能面临栈溢出风险。两种算法都能有效解决课程依赖问题,选择取决于具体场景需求。

2401_82472941的博客 503

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

LeetCode-210、课程表 II-中等

LeetCode-210、课程表 II-中等 现在你总共有 n 门课需要选,记为0到n-1。在选修某些课程之前需要一些先修课程。例如,想要学习课程 0 ,你需要先完成课程1 ,我们用一个匹配来表示他们: [0,1]。给定课程总量以及它们的先决条件,返回你为了学完所有课程所安排的学习顺序。可能会有多个正确的顺序,你只要返回一种就可以了。如果不可能完成所有课程,返回一个空数组。 示例1: 输入: 2, [[1,0]] 输出: [0,1] 解释:总共有 2 门课程。要学习课程 1,你需要先...

clover_my的博客 391

LeetCode210-课程表II

LeetCode210-课程表II 题目 现在你总共有 n 门课需要选,记为 0 到 n-1。 在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1] 给定课程总量以及它们的先决条件,返回你为了学完所有课程所安排的学习顺序。 可能会有多个正确的顺序,你只要返回一种就可以了。如果不可能完成所有课程,返回一个空数组。 输入: 2, [[1,0]] 输出: [0,1] 解释: 总共有 2 门课程。要学习课程 1,你需要先完成课程 0。因此,

viva_la__vida的博客 146

leetcode 210. 课程表 II

210. 课程表 II 现在你总共有 n 门课需要选,记为 0 到 n-1。 在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1] 给定课程总量以及它们的先决条件,返回你为了学完所有课程所安排的学习顺序。 可能会有多个正确的顺序,你只要返回一种就可以了。如果不可能完成所有课程,返回一个空数组。 示例 1: 输入: 2, [[1,0]] 输出: [0,1] 解释: 总共有 2 门课程。要学习课程 1,你需要先完成课程 0。因此,正确的课

Qin_酱的博客 265

LeetCode第210题_课程表II

现在你总共有numCourses门课需要选,记为0到。给你一个数组,其中,表示在选修课程ai前必须先选修bi。例如,想要学习课程0,你需要先完成课程1[0,1]。返回你为了学完所有课程所安排的学习顺序。可能会有多个正确的顺序,你只要返回即可。如果不可能完成所有课程,返回。

qq_40263592的博客 1057

Leetcode 210. 课程表 II C++

Leetcode 210. 课程表 II 题目 现在你总共有 n 门课需要选,记为 0 到 n-1。 在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1] 给定课程总量以及它们的先决条件,返回你为了学完所有课程所安排的学习顺序。 可能会有多个正确的顺序,你只要返回一种就可以了。如果不可能完成所有课程,返回一个空数组。 测试样例 示例 1: 输入: 2, [[1,0]] 输出: [0,1] 解释: 总共有 2 门课程。要学习课程 1,

weixin_43750513的博客 322

LeetCode 210. 课程表 II

LeetCode 210. 课程表 II 思路 topsort,需要先完成的指向后完成的,入读为0,则无前继课程或前继课程已被防止在list中 代码 class Solution { static int V; static int[] degree; static int[] head; static edge[] edges; static int count; static class edge { int to; int next; public edge(int

qq_42499133的博客 202

LeetCode210.课程表II

拓扑排序是一种对有向无环图(DAG)进行线性排序的算法,确保所有边的方向在序列中保持一致。本文以课程安排为例,详细介绍了Kahn算法实现拓扑排序的过程:首先构建邻接表和入度数组,然后通过BFS遍历入度为0的节点,依次处理并更新邻接节点的入度,最终检测是否存在环。文章提供了完整的Python代码实现,并通过示例演示了算法执行流程,分析了其O(V+E)的时间复杂度。该算法能有效解决课程表II这类依赖关系问题。

lcreek的博客 390
上一篇: Leetcode(785)——判断二分图
下一篇: Leetcode(146)——LRU 缓存
486L
博客等级 码龄7年 20粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值