[LeetCode] 207. 课程表

server/2024/10/25 3:15:18/

题目描述:

你这个学期必须选修 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 。这是不可能的。

提示:

  • 1 <= numCourses <= 2000
  • 0 <= prerequisites.length <= 5000
  • prerequisites[i].length == 2
  • 0 <= ai, bi < numCourses
  • prerequisites[i] 中的所有课程对 互不相同

题目链接:

. - 力扣(LeetCode)

解题主要思路:

经典的bfs拓扑排序题,先借助stl容器将有向图和节点对应的入度记录下来,接着先将入度为0的节点入队列,当队列不为空时循环进行以下操作:

        1. 提取头节点,对头节点的相邻节点去边

        2.判断邻居节点的入度是否为0,若为0则加入到队列中

最后再遍历记录节点对应的入度容器

        若存在入度不为0的节点,则说明我们所构建的有向图中存在环的情况,这种情况就是题目所提供的例2,是不合法不存在的,所以返回false;

        若不存在入度不为0的节点,则说明我们所构建的有向图是AOV图,这种情况就是题目所提供的例1,是合法存在的,所以返回true。

解题代码:

class Solution {
public:bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {unordered_map<int, vector<int>> edges;  // 邻接表vector<int> in(numCourses);  // 记录入度// 建图for (auto& e : prerequisites) {int a = e[0], b = e[1];  // b -> aedges[b].push_back(a);++in[a];}// 拓扑排序 -- bfs// 先找到入度为0的节点,加入que中queue<int> que;for (int i = 0; i < numCourses; ++i) {if (in[i] == 0) que.push(i);}// bfswhile (!que.empty()) {int t = que.front();  que.pop();// 修改相连的边for (auto& e : edges[t]) {--in[e];if (in[e] == 0) que.push(e);}}// 检测是否还有节点的入度不为0(判断是否有环)  for (auto& e : in) {if (e) return false;}return true;}
};


http://www.ppmy.cn/server/134588.html

相关文章

CZX前端秘籍1

盒模型 1 标准盒模型 box-sizing: content-box; margin border padding content 2 怪异&#xff08;IE&#xff09;盒模型 box-sizing: border-box; margin content(border padding content) 3 区别 计算宽高的时候&#xff0c;怪异盒模型会把边框的内边距计算进…

Spark 基础概念

Apache Spark 是一个快速、分布式的计算系统&#xff0c;用于大规模数据处理和分析。它提供了一个高级 API&#xff0c;用于编写并行处理的任务&#xff0c;可以在大规模集群上运行。 Spark 的基本概念包括以下几个方面&#xff1a; Resilient Distributed Datasets (RDDs)&a…

5. Node.js Http模块

2.4 Http模块 2.4.1创建Http服务端 //1.导入http模块 let httprequire(http)//2.创建服务对象 let serverhttp.createServer((request,response)>{console.log(request.method) //获取请求方式console.log(request.url) //获取请求url(路径和参数部份)co…

全面击破工程级复杂缓存难题

目录 一、走进业务中的缓存 &#xff08;一&#xff09;本地缓存 &#xff08;二&#xff09;分布式缓存 二、缓存更新模式分析 &#xff08;一&#xff09;Cache Aside Pattern&#xff08;旁路缓存模式&#xff09; 读操作流程 写操作流程 流程问题思考 问题1&#…

如何利用 OCR 和文档处理,快速提高供应商管理效率 ?

在当今瞬息万变的商业环境中&#xff0c;有效的供应商管理通常需要处理大量实物文档&#xff0c;这带来了巨大的挑战。手动提取供应商名称、编号和其他关键信息等关键细节非常耗时、容易出错&#xff0c;并且会降低整体效率。 为了应对这些挑战&#xff0c;组织正在逐步采用自…

什么是虚拟线程?Java 中虚拟线程的介绍与案例演示

文章目录 1. 传统线程的痛点2. 虚拟线程的优势3. 虚拟线程的实际应用场景4. 案例演示&#xff1a;如何使用虚拟线程案例 1&#xff1a;传统线程的创建案例 2&#xff1a;虚拟线程的创建案例 3&#xff1a;高并发任务中的优势 5. 总结推荐阅读文章 虚拟线程&#xff08;Virtual …

zsh: command not found: nvm 问题(Mac)

安装nvm step1: 打开终端 安装nvm brew install nvm step2: 检查是否能使用 nvm --version 然后报错出现&#xff1a;zsh: command not found: nvm 解决方法如下&#xff1a; (1): 使用vim打开.bash_profile文件进行修改 vim ~/.bash_profile按 i 键进入插入模式&#xff0c…

2010年国赛高教杯数学建模A题储油罐的变位识别与罐容表标定解题全过程文档及程序

2010年国赛高教杯数学建模 A题 储油罐的变位识别与罐容表标定 通常加油站都有若干个储存燃油的地下储油罐&#xff0c;并且一般都有与之配套的“油位计量管理系统”&#xff0c;采用流量计和油位计来测量进/出油量与罐内油位高度等数据&#xff0c;通过预先标定的罐容表&#…