LeetCode hot 100—课程表

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

题目

你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。

在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程  bi 。

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

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

示例

示例 1:

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

示例 2:

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

分析

这是一个典型的拓扑排序问题,判断有向图中是否存在环。如果存在环,那么就无法完成所有课程的学习,因为会有课程永远无法满足先修条件。可以使用深度优先搜索(DFS)结合状态标记来解决这个问题。

DFS

代码解释

状态定义:使用枚举类型 State 定义了三种状态:UNVISITED(未访问)、VISITING(正在访问)、VISITED(已访问)。

深度优先搜索函数 dfs:course 表示当前正在访问的课程,adjList 是邻接表,存储了每门课程的后继课程,states 记录了每门课程的状态。如果当前课程正在访问,说明存在环,返回 false;如果当前课程已访问,直接返回 true。标记当前课程为正在访问,然后遍历当前课程的所有后继课程,对每个后继课程递归调用 dfs,如果有任何一个后继课程无法完成,返回 false。否则标记当前课程为已访问,返回 true。

主函数 canFinish:构建邻接表,将先修课程关系转化为邻接表的形式,初始化每门课程的状态为 UNVISITED。对每门课程进行深度优先搜索,如果有任何一门课程无法完成,返回 false。如果所有课程都能完成,返回 true。

时间复杂度:O(V+E), V 是课程数,E 为先修课程数

空间复杂度:O(V+E)

class Solution {
private:
    // 定义状态:0 表示未访问,1 表示正在访问,2 表示已访问
    enum class State {
        UNVISITED,
        VISITING,
        VISITED
    };
    // 深度优先搜索函数
    bool dfs(int course, const vector<vector<int>>& adjList, vector<State>& states) {
        // 如果当前课程正在访问,说明存在环
        if (states[course] == State::VISITING) {
            return false;
        }
        // 如果当前课程已访问,直接返回 true
        if (states[course] == State::VISITED) {
            return true;
        }
        // 标记当前课程为正在访问
        states[course] = State::VISITING;
        // 遍历当前课程的所有后继课程
        for (int nextCourse : adjList[course]) {
            // 如果后继课程无法完成,说明存在环
            if (!dfs(nextCourse, adjList, states)) {
                return false;
            }
        }
        // 标记当前课程为已访问
        states[course] = State::VISITED;
        return true;
    }

public:
    bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
        // 构建邻接表
        vector<vector<int>> adjList(numCourses);
        for (const auto& prerequisite : prerequisites) {
            adjList[prerequisite[1]].push_back(prerequisite[0]);
        }
        // 记录每个课程的状态
        vector<State> states(numCourses, State::UNVISITED);
        // 对每门课程进行深度优先搜索
        for (int i = 0; i < numCourses; ++i) {
            if (!dfs(i, adjList, states)) {
                return false;
            }
        }
        return true;
    }
};

知识充电

enum class

在C++中,enum class(强类型枚举)通过enum class关键字定义,相比传统枚举(enum)提供了更严格的作用域控制和类型安全性。

语法

enum class EnumName {
    Value1,
    Value2,
    Value3
    // 可以定义更多枚举值
};

作用域限定​​:枚举成员必须通过 EnumName::Value1 形式访问,避免全局命名冲突

显式底层类型​​:通过 :类型 指定底层存储类型(如int、char),默认是int

enum class SmallEnum : char {
    A,
    B,
    C
};

类型安全:不同的 enum class 类型之间不能隐式转换,也不能与整数类型进行隐式转换

#include <iostream>
enum class Status { SUCCESS, FAILURE };
enum class Result { PASS, FAIL };
int main() {
    Status s = Status::SUCCESS;
    // 下面代码会编译错误,不能将 Status 类型赋值给 Result 类型
    // Result r = s; 
    // 下面代码会编译错误,不能将整数隐式转换为 Status 类型
    // Status wrong = 1; 
    return 0;
}
LeetCode Hot100 刷题笔记(4)—— 二叉树、图论 一、二叉树:二叉树的中序遍历,二叉树的最大深度,翻转二叉树,对称二叉树,二叉树的直径,二叉树的层序遍历,将有序数组转换为二叉搜索树,验证二叉搜索树,二叉搜索树中第 K 小的元素,二叉树的右视图,二叉树展开为链表,从前序与中序遍历序列构造二叉树,路径总和 III,二叉树的最近公共祖先,二叉树中的最大路径和。 二、图论:岛屿数量,腐烂的橘子,课程表,实现 Trie (前缀树)。 阅读详情

相关推荐

【位运算进阶之----右移(>>)】

😄嘻嘻,朋友们,大家好!昨天我们学习了左移,今天我们来谈谈右移>>。⭐️简单来说,,也就是去掉一个数的二进制表达的末位,右移一位就去掉一位,右移两位就去掉两位。下面就让我们来详细看看吧!

weixin_73453526的博客 8931

leetcode-Hot100-207. 课程表 Go语言

记录自己一刷hot100。图论系列-207.课程表。

weixin_60588950的博客 220

ESP32 BLE Mesh Provisioner实战:手把手教你用ESP-IDF配网智能灯泡(附常见错误排查)

本文提供了一份基于ESP-IDF的ESP32 BLE Mesh Provisioner实战指南,详细解析了配网器的核心角色与工作流程。文章手把手教你从工程搭建、代码初始化到核心回调解析,并重点针对常见的‘Model not bound to AppKey’等错误提供了深度排查思路与解决方案,帮助你构建一个稳定可靠的智能照明网关。

desk3的博客 515

(LeetCode-Hot100)207. 课程表

题目描述:给定一个由'1'(陆地)和'0'(水)组成的二维网格,计算岛屿数量。岛屿由水平或垂直相邻的陆地连接形成。 解题思路: 使用DFS/BFS遍历网格,遇到'1'时岛屿数+1,并标记所有相连的'1'为'0' DFS通过递归实现,BFS通过队列实现 也可用并查集,但实现较复杂 代码实现: Java/Go版本均采用DFS 遍历网格,发现'1'时启动DFS淹没整个岛屿 复杂度分析: 时间:O(M×N),需遍历整个网格 空间:DFS最坏O(M×N),BFS为O(min(M,N)) 关键点: 每次发现新岛屿后要标

小飞的博客 687

PCB工艺-SI9000-模型选择

本文介绍了PCB设计中常用的阻抗计算模型,主要包括外层、内层和嵌入式三类共12种计算模型,涵盖单端/差分、共面等不同场景。针对阻抗计算中的关键参数,文章提供了经验值参考:表层走线厚度0.035mm(1.4mil),内层0.0152mm(0.6mil);并列出常见PP材料的介电常数(3.8-4.5)和成品厚度(3-7.5mil)。作者建议90%的设计问题可通过上述模型解决,层叠参数建议咨询PCB厂家获取。

weixin_50120208的博客 1385

kettle9.0+ 连接Hadoop报错

kettle bug

x²+(y-√³x²)²=1的博客 1562

Leetcode Hot 100 207.课程表

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

Kimsanmyeong的博客 886

【大模型应用开发-FastAPI框架】(八)Sqlalchemy+postgresql简单增删改查

语言,为高效和高性能的数据库访问设计,实现了完整的企业级持久模型”。SQLAlchemy的理念是,的量级和性能重要于对象集合;而对象集合的抽象又重要于表和行。因此,SQLAlchemy采用了类似于。社区中成为广泛使用的ORM工具之一,不亚于Django的ORM框架。和declarative等可选插件可以让用户使用声明语法。SQLAlchemy首次发行于2006年2月,并迅速地在。SQLAlchemy“采用简单的。二、安装postgresql。一、SQLAlchemy简介。的数据映射模型,而不是其他。

2098

力扣HOT100——207.课程表

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

hxd030228的博客 569

【专栏必读】王道考研408数据结构+算法设计与分析万字笔记使用说明及章节导航

各位老铁思维导图在我整理完笔记后会放上去的,我需要根据王道的思维导图重新再做一遍 文章目录一:有关注意事项二:关于专栏三:学习建议四:各专栏导航(各位老铁别催,质量优先)(1)第一章:绪论(2)第二章:线性表(3)第三章:栈和队列第四章:串第五章:二叉树第六章:图 首先感谢王道大大(手动比心),很用心在做了,大家可以看其中两节是否符合胃口 (王道408考研数据结构)第五章树-第三节1:二叉树遍历(先序、中序和后序) (王道408考研数据结构)第五章树-第四节2:平衡二叉树(AVL)及其旋转 一:有.

快乐江湖的博客 5万+

【OpenClaw从入门到精通】第73篇:30天OpenClaw实战挑战——从零搭建个人数字助理(Day15-21)万字超详细高阶实战版

经过前两周的基础部署与功能搭建,你已拥有可自动化干活的AI助理与数字员工团队,但距离“高阶精通”仍有差距。本文聚焦第三周(Day15-21)核心实战,围绕安全审计、语音能力接入、Token成本控制、Agent Loop优化、One-Liner指令五大核心模块,结合真实落地案例与踩坑经验,提供超详细实操指南。通过本文,你将掌握生产级安全加固方案、语音交互全流程配置、低成本高性价比使用策略、Agent自主闭环优化技巧,以及一句话搞定复杂任务的高效指令用法,同时完成中期复盘与最后九天冲刺规划

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 362

【力扣hot100题】课程表(48)

总共有 2 门课程。学习课程 1 之前,你需要先完成​课程 0;并且学习课程 0 之前,你还应先完成课程 1。总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。在选修某些课程之前需要一些先修课程。请你判断是否可能完成所有课程的学习?,表示如果要学习课程。

2303_80799640的博客 182

高通SDX35平台 modem启动异常分析

SDX35 MIFI项目在生产时出现modem反复重启问题。经排查发现是modem在初始化GNSS模块时访问了不存在的硬件地址导致崩溃,原因是产线使用的SDX35 000-AB型号芯片阉割了GNSS功能,而本地测试使用的AA型号支持该功能。解决方案是通过修改modem编译选项,采用高通新提供的genlmm2选项(保留IMS和SMS功能但去除GNSS支持),最终解决了启动异常问题并满足VZW认证需求。

四儿家的小祖宗的博客 275

力扣hot100 | 图论 | 200. 岛屿数量、994. 腐烂的橘子、207. 课程表、208. 实现 Trie (前缀树)

给你一个由'1'(陆地)和'0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。示例 1:输入:grid = [输出:1示例 2:输入:grid = [输出:3。

m0_56231308的博客 993

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

IEM模型,地表粗糙度模拟

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

【Hot100】LeetCode—207. 课程表

【代码】【Hot100】LeetCode—207. 课程表。

weixin_44382896的博客 577

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【LeetCode】hot100— 207. 课程表_BFS

在选修某些课程之前需要一些先修课程。先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai 则。你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1。请你判断是否可能完成所有课程的学习?输入:numCourses = 2, prerequisites = [[1,0]]解释:总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。先学习课程 bi。

weixin_44382896的博客 913

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

力扣hot100 课程表 拓扑序列

java

人言束负兑生|完美是完蛋的开始 527

Leetcode C++《热题 Hot 100-65》207. 课程表

Leetcode C++《热题 Hot 100-65》207. 课程表 题目 思路 代码 class Solution { public: bool canFinish(int numCourses, vector<vector<int>>& prerequisites) { //拓扑排序,用出入度方法容易理解hh,熟悉的配方 ...

快乐划水程序猿的专栏 335

【力扣hot100】207 课程表(c++、python)解析

相关题目: 210 课程表2 这是一题经典的「拓扑排序」问题给定一个包含 n 个节点的有向图 G,我们给出它的节点编号的一种排列,如果满足:对于图 G 中的任意一条有向边 (u,v),u 在排列中都出现在 v 的前面那么称该排列是图 G 的「拓扑排序」*1.如果图 G 中存在环(即图 G 不是「有向无环图」),那么图 G 不存在拓扑排序。这是因为假设图中存在环 “x1,x2,…,„,í,那么 x1在排列中必须出现在 xn 的前面,但 xn同时也必须出现在 x1的前面,因此不存在一个满足要求的排列

zhangyuanbonj的博客 1284

【leetcode hot 100 207】课程表

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

longii11的博客 601

leetcode hot100-53 课程表

难点:如何存储邻接表,在。可能会有多个后续课程。bfs 广度优先遍历。

m0_58625012的博客 230

【Leetcode hot 100】207.课程表

摘要 该问题需要判断能否完成所有课程,给定课程间的先修关系构成有向图。核心是检测图中是否存在环(循环依赖)。两种解法: Kahn算法(BFS拓扑排序):统计节点入度,从入度为0的节点开始BFS遍历,最终判断是否所有节点都被访问过。时间复杂度O(V+E)。 DFS环检测:通过递归遍历标记节点状态(未访问/访问中/已访问),若遇到"访问中"节点则存在环。时间复杂度同样为O(V+E)。 两种方法都适用于该问题,Kahn算法更直观,DFS实现更简洁。

专注Java和MySQL领域知识分享 845

leetcode hot100 之 课程表

题目 你这学习需要学习 numCourses 门课程,编号记为 0 到 numCourses - 1。 在选修某些课程之前你需要完成一些必修课程。先修课程按 prerequisites 给出关系,如 prerequisites[i] = [a_i, b_i],表示在选修 a_i 之前需要先完成 b_i。 请判断你最终能否完成所有课程。 示例1: 输入:numCourses = 2, prerequisites = [[1,0]] 输出:true 解释:总共有 2 门课程。学习课程 1 之前,你需要完成课程

smallplum123的博客 244

力扣HOT100之图论:207. 课程表

更加通俗易懂一些,强烈建议参考他的题解,因为图论本来就很难,光是理解起来就已经很费劲了,没有必要为了代码的简洁和优雅而忽略了代码的可读性。这道题第一次做,有向图判断是否有环的思路是完全忘完了,这次没有看灵神的题解,感觉。

weixin_52151595的博客 731

LeetCode刷题之HOT100之课程表

吃完普通的食堂饭菜,回到实验室,继续做一道题!

我的树洞 613

【力扣hot100题】(052)课程表

先将目前能上的课加入队列内(度为0的所有课),然后如果队列不空,就踢出队列的头元素,将头元素出去的线连接的课的出度减一,如果出度为零就加入队列尾部。记录两个东西,一是每一个节点的入度(就是需要上完多少节课才能上当前这节课),一是每个节点出去的线(就是必须上完这节课可以上的其他课)。唯一记得的就是两种存储方法,一种是二维数组法,记录每一条边的有无,一种是只记录有的边,适合于边比较少的情况。遍历整个数组,记录完这两个东西之后,再设置一个队列,记录目前正在上的课。什么人一学期要上2000节课啊jpg。

s478527548的博客 301
上一篇: 蓝桥杯真题—日期问题
下一篇: LeetCode hot 100—岛屿数量
rigidwill666
博客等级 码龄7年 508粉丝 108原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rigidwill666

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值