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

【LeetCode207.课程表】以及变式

题目链接

207. 课程表 - 力扣(LeetCode)

实现思路

  1. 用一个二维数组存邻接表,存储的是某个课程的下一门课程的集合;
  2. 用一个数组存储每门课程的入度,也就是如果某门课程需要另外一门先修课程,入度就+1;
  3. 用一个队列,存储当前入度为0的课程,也就是可以修的课程x,每次循环,判断x作为哪些课程的先修课程,那么这门课程的入度-1,如果为0,这门课程也可以修了,加入队列中;
  4. 最后,判断完成的课程数是否和总课程数相等。

代码实现

class Solution {
public:bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {// 构造邻接表vector<vector<int>> edges(numCourses);// 统计入度vector<int> indegree(numCourses, 0);for (int i = 0; i < prerequisites.size(); i++) {int x = prerequisites[i][0];int y = prerequisites[i][1];edges[x].push_back(y);indegree[y]++;}int finish = 0;queue<int> q;for (int i = 0; i < numCourses; i++) {if (!indegree[i]) {finish++;q.push(i);}}while (q.size()) {int x = q.front();q.pop();for (int y : edges[x]) {indegree[y]--;if (!indegree[y]) {finish++;q.push(y);}}}return finish == numCourses;}
};

变式

题目解析

如果已经修好的课程是通过另外一个数组传入的,也就是说,如果仅仅给出修课条件[[1,0]],那么0,1两门课都不能修,但是如果已经修好的课程数组为[0],那么0,1就都可以修。(限制:不存在循环依赖的情况,也就是0的先修课程是1,1的先修课程是0的情况)。

实现思路

  • 在之前的代码上,增加一个判断,就是如果不在已经学习的集合中,那么就算通过邻接图的入度为0,也要手动将入度设置为1。

代码实现

class Solution {
public:bool canFinish(int numCourses, vector<vector<int>>& prerequisites, set<int>& learned) {// 构造邻接表vector<vector<int>> edges(numCourses);// 统计入度vector<int> indegree(numCourses, 0);for (int i = 0; i < prerequisites.size(); i++) {int x = prerequisites[i][0];int y = prerequisites[i][1];edges[x].push_back(y);indegree[y]++;}// 新增:只有在learned数组中的课程,入度才是0,否则若原来是0的需要改为1for (int i = 0; i < numCourses; i++) {if (!indegree[i] && !learned.count(i)) {indegree[i] = 1;}}int finish = 0;queue<int> q;for (int i = 0; i < numCourses; i++) {if (!indegree[i]) {finish++;q.push(i);}}while (q.size()) {int x = q.front();q.pop();for (int y : edges[x]) {indegree[y]--;if (!indegree[y]) {finish++;q.push(y);}}}return finish == numCourses;}
};

http://www.dtcms.com/a/270576.html

相关文章:

  • 暑假算法日记第五天
  • [2025CVPR]Mr. DETR:检测Transformer的多路由指导训练解析
  • Mysql组合索引的update在多种情况下的间隙锁的范围(简单来说)
  • 141-CEEMDAN-VMD-Transformer-BiLSTM-ABKDE多变量区间预测模型!
  • [数学基础] 矩阵的秩及其应用
  • El-Select组件实现模糊查询与失焦赋值
  • 第6章应用题
  • 学术绘图(各种神经网络)
  • 5.注册中心横向对比:Nacos vs Eureka vs Consul —— 深度解析与科学选型指南
  • Microsoft AZ-305 Exam Question
  • Flutter基础(前端教程⑦-Http和卡片)
  • Flutter基础(前端教程⑥-按钮切换)
  • 《重构项目》基于Apollo架构设计的项目重构方案(多种地图、多阶段、多任务、状态机管理)
  • 【教程】在ubuntu安装Edge浏览器
  • 工业通讯网关在电子制造中的核心作用——从DeviceNet到Modbus TCP的智能转换
  • 家庭网络中的服务器怎么对外提供服务?
  • 跨平台ROS2视觉数据流:服务器运行IsaacSim+Foxglove本地可视化全攻略
  • 【网络】Linux 内核优化实战 - net.ipv4.tcp_dsack
  • NHibernate案例
  • scp:上传大型数据集到实验室服务器
  • 2025年人工智能、虚拟现实与交互设计国际学术会议
  • 蛋白质序列-kappa参数计算算法解读
  • Linux——I/O复用
  • django 一个表中包括id和parentid,如何通过parentid找到全部父爷id
  • 微信小程序91~100
  • 什么是高防 IP?从技术原理到实战部署的深度解析
  • 制作MikTex本地包可用于离线安装包
  • springBoot使用XWPFDocument 和 LoopRowTableRenderPolicy 两种方式填充数据到word模版中
  • ARM单片机滴答定时器理解与应用(一)(详细解析)
  • Node.js 是什么?npm 是什么? Vue 为什么需要他们?