当前位置: 首页 > news >正文

【LeetCode 第207题】

LeetCode 207

  • LeetCode 207 课程表(拓扑排序 + 邻接表实现)题解
    • 题目描述
    • 二、核心思路:拓扑排序(Kahn算法)
      • 步骤:
    • 三、代码实现解析(重点)
      • 1. 邻接表结构
      • 加边函数
      • 2. 建图 + 入度统计
      • 3. 初始化队列(入度为 0)
      • 4. 拓扑排序过程
      • 5. 判断是否有环
    • 四、复杂度分析
    • 五、一些关键理解点
      • 1️⃣ 为什么入度为 0 可以学?
      • 2️⃣ 为什么能检测环?
    • 六、总结
    • 七、推荐优化(可写进进阶部分)

LeetCode 207 课程表(拓扑排序 + 邻接表实现)题解

题目描述

题目理解
这道题本质是在问:

给你一堆课程依赖关系,能不能把所有课程都学完?

比如:

  • [1, 0]表示:学 1 之前必须先学 0
  • 也就是:0 → 1

问题就变成:

👉这个有向图中是否存在环?

  • 有环 ❌ → 一定学不完(死循环)
  • 无环 ✅ → 可以学完(存在拓扑序)

二、核心思路:拓扑排序(Kahn算法)

我们用入度 + BFS(或栈模拟)来做:

步骤:

  1. 建图(邻接表)

  2. 统计每个点的入度

  3. 把所有入度为 0 的点加入队列

  4. 每次取一个点:

    • 删除它(模拟学完)
    • 它指向的点入度减 1
    • 如果某个点入度变成 0 → 入队
  5. 最后看:

    • 能不能把所有点都删掉

三、代码实现解析(重点)

手写邻接表 + 拓扑排序,ACM 风格 👍

1. 邻接表结构

inth[N],e[N],ne[N],idx;

含义:

数组作用
h每个点的链表头
e边的终点
ne下一条边
idx当前边编号

加边函数

voidadd(inta,intb){e[idx]=b;ne[idx]=h[a];h[a]=idx++;}

表示:
👉 从a → b


2. 建图 + 入度统计

for(auto&edge:prerequisites){intai=edge[0];intbi=edge[1];add(bi,ai);// bi → aiin[ai]++;}

解释:

  • [ai, bi]表示:bi → ai

  • 所以:

    • 加边bi → ai
    • ai入度 +1

3. 初始化队列(入度为 0)

for(inti=0;i<numCourses;i++){if(in[i]==0){q.push_back(i);s.insert(i);st[i]=true;}}

这里做了三件事:

  • q:模拟队列(你用 vector 当栈用)
  • s:记录访问过的节点
  • st:防止重复入队

4. 拓扑排序过程

while(!q.empty()){intu=q.back();q.pop_back();for(inti=h[u];i!=-1;i=ne[i]){intv=e[i];in[v]--;if(in[v]==0&&!st[v]){st[v]=true;s.insert(v);q.push_back(v);}}}

流程:

  1. 取一个入度为 0 的点u
  2. 遍历它的所有邻居v
  3. 入度--
  4. 如果变成 0 → 加入队列

5. 判断是否有环

returns.size()==numCourses;

解释:

  • 如果所有点都被“删除”(拓扑排序成功)
    s.size() == n
  • 否则说明:
    → 有环 ❌

四、复杂度分析

  • 时间复杂度:
    👉O(n + m)
  • 空间复杂度:
    👉O(n + m)

其中:

  • n:课程数
  • m:依赖关系数

五、一些关键理解点

1️⃣ 为什么入度为 0 可以学?

因为:

👉 没有任何课程依赖它


2️⃣ 为什么能检测环?

如果有环:

0 → 1 → 2 → 0

那每个点入度都 ≥ 1
👉永远没有入度为 0 的点

➡️ 拓扑排序无法开始 / 中途卡住


六、总结

一句话总结这题:

判断有向图是否有环 → 用拓扑排序

七、推荐优化(可写进进阶部分)

其实可以把这部分简化:

unordered_set<int>s;boolst[N];

👉 完全可以换成:

intcnt=0;

每处理一个点:

cnt++;

最后:

returncnt==numCourses;

更轻量、更高效 👍

http://www.gsyq.cn/news/1427460.html

相关文章:

  • DS4Windows终极配置指南:7步实现游戏手柄完美映射
  • DIY高扭矩机器人关节执行器:BLDC电机+FOC控制+行星减速箱全解析
  • 跨平台模组下载终极指南:无需Steam轻松访问创意工坊的完整解决方案
  • QMC音频解码器:3分钟解锁加密音乐,实现跨平台播放自由
  • 2026年昆明代理记账与云南工商变更全生命周期财税服务综合解读:避坑指南与靠谱机构推荐 - 企业名录优选推荐
  • 终极指南:如何用Wand-Enhancer解锁WeMod完整功能体验
  • 基于本体语义与对象特征的非结构化信息搜索解析方案【附代码】
  • 2026新疆定制游与政企接待选择:旅行社深度横评避坑指南 - 优质企业观察收录
  • 基于OpenCV与Haar级联分类器的实时人脸检测实战教程
  • 太原黄金上门回收平台推荐2026 - 黄金回收
  • 中国传媒大学考研辅导班强烈推荐【独峰考研】全解析 - michalwang
  • 太康锅炉联系方式:正规厂家直通渠道与避坑指南 - 品牌2026
  • 别再只看Top-1了!用Python代码实战解析Rank-5准确率在ImageNet分类中的意义
  • 惠州黄金上门回收平台对比2026年 - 黄金回收
  • 北京信息科技大学考研辅导班强烈推荐【独峰考研】全解析 - michalwang
  • 东莞黄金上门回收平台怎么选?靠谱平台推荐 - 黄金回收
  • 光纤
  • 基于Arduino与状态机的双人反应速度对战游戏盒制作全解析
  • Rocky Linux 10.2 发布 - RHEL 100% 完全兼容免费发行版
  • Instagram算法变迁与用户体验异化:从社交分享到流量博弈的转型分析
  • 最新太康锅炉联系方式 咨询对接无忧 - 品牌2026
  • 太康锅炉厂家哪家比较好?2026年综合实力排名前十厂家 - 品牌2026
  • 郑州口碑好的HIclaw龙虾AI厂家
  • 【车载 AOSP 16 蓝牙(bluedroid)服务】【qcom 平台双蓝牙】【12.handleBluetoothActiveDeviceChanged 解析】
  • 2026 哈尔滨钻石回收性价比解析,高价安全省心优选 - 薛定谔的梨花猫
  • 北京印刷学院考研辅导班强烈推荐【独峰考研】全解析 - michalwang
  • 入境就医服务公司上海机构
  • 运维工程师的利器:用PowerShell脚本批量收集局域网内Win电脑的硬件资产信息
  • Highcharts v13的创新|如何让使用数据源变得简单
  • 突破性本地增强方案:WandEnhancer重新定义游戏修改器体验边界