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

【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.xdnf.cn/news/15053.html

相关文章:

  • Redis数据淘汰策略
  • 从0开始学习R语言--Day42--LM检验
  • 旅游管理实训室建设的关键要点探讨
  • uniapp中使用uView-plus踩坑记录
  • 数据结构基础准备:包装类 泛型 泛型的上界 密封类
  • 脑电分析入门指南:信号处理、特征提取与机器学习
  • 主流大模型Agent框架 AutoGPT详解
  • 深度学习模型在C++平台的部署
  • vue2 echarts中国地图、在地图上标注经纬度及标注点
  • 伪装计算器软件,隐藏手机隐私文件
  • 精准医疗,AR 锚定球囊扩张导管为健康护航​
  • 暑假读书笔记第五天
  • 剑指offer54_平衡二叉树
  • PostgreSQL如何进行跨服务器迁移数据
  • JavaEE初阶第八期:解锁多线程,从 “单车道” 到 “高速公路” 的编程升级(六)
  • Flink-1.19.0源码详解-番外补充4-JobGraph图
  • HTML应用指南:利用GET请求获取全国山姆门店位置信息
  • 二分查找篇——在排序数组中查找元素的第一个和最后一个位置【LeetCode】
  • Go 延迟调用 defer 用法详解
  • dify配置邮箱,密码重置以及邮箱邀请加入
  • Android Notification 通过增加addAction 跳转回Service重新执行逻辑
  • 中山排气歧管批量自动化智能化3D尺寸测量及cav检测分析
  • QNX中timer的使用
  • 【C++】容器适配器 + stack/queue/deque详解
  • Android-重学kotlin(协程源码第二阶段)新学习总结
  • 【Linux网络编程】Socket - TCP
  • linux-进程信号的产生与发送
  • WPF使用WebBrowser 解决href标签target=_blank在浏览器窗口打开新链接而非窗体内部打开的问题
  • Python 项目快速部署到 Linux 服务器基础教程
  • 【macOS】【Swift】不让App采用macOS的外观风格,直接保持白色背景,怎么处理?