leetcode207. 课程表

这篇具有很好参考价值的文章主要介绍了leetcode207. 课程表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

你这个学期必须选修 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、创建一个领接表存放所有课程之间的学习关系,所以我们开一个二维数组g存放每门课和它的后继课程;创建一个大小为numCourses的一维数组inDrgree 存放所有课程的先修课程(入度)。 最开始先遍历prerequisities数组,由于prerequisities数组中给的关系是先给后继课程,再给前驱课程,所以存放到g数组的时候要注意一下顺序,前驱课程在前, 后继课程在后。
2、遍历存放所有点之间的依赖关系的数组(这题是prerequisities数组),统计所有入度为0的节点,即没有任何先修课程的课程。
3、有一个队列存放所有的点(入队顺序表示学习课程的顺序),将所有入度为0的节点入队。 然后进行BFS,不断取出队列中的队头元素,并且更新这个点的所有后继节点(这里队头元素是所有入度为0的节点,表示已经学习过的课程, 则这门课的所有后继课程的先修课程数量减一,也就是学了一门先修课程),然后判断减一之后,后继课程们是否已经没有了先修课程(入度是否为0), 如果入度为0,就把这门课加入到队列中。当然,每取出一门课程,我们都有一个计数变量cnt加一,表示已经修过多少门课程。
4、重复第(2)步,直到队列为空,这时判断一下修过的课程数量cnt是否和课程总数numCourses,如果是,说明存在一种拓扑序列,可以学习完所有课程。 如果不相等,说明不存在。文章来源地址https://www.toymoban.com/news/detail-423116.html

#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;

bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
    vector<vector<int>> adj(numCourses);
    vector<int> indegree(numCourses, 0);//每个课程的入度
    for (auto courseEdge : prerequisites) //边数组转成邻接表
    {
        adj[courseEdge[1]].push_back(courseEdge[0]);//a b代表b->a的边
        indegree[courseEdge[0]]++;//a的入度+1
    }
    queue<int> q;//辅助队列
    int res = 0;
    for (int course = 0; course < numCourses; course++)
        if (indegree[course] == 0)
            q.push(course);//入度为0的课程入队列
    while (!q.empty())//继续拓扑排序
    {
        int cur = q.front();//当前课程
        q.pop();
        res++;
        vector<int>  courseArr = adj[cur];//后修课程
        for (auto postCourse : courseArr)//遍历每个后修课程
        {
            indegree[postCourse]--;//删除该边 即后修课程的入度-1 因为当前节点唯一访问 所以不需要删除邻接表
            if (indegree[postCourse] == 0)//删除边后 该节点的入度为0且未在拓扑排序中
                q.push(postCourse);//入队列
        }
    }
    return res == numCourses ? true : false;
}

int main() {
	vector<vector<int> > cours{ {1,0} };
	int n = 2;
	bool res = canFinish(n, cours);
	cout << boolalpha << res << endl;	
	return 0;
}

到了这里,关于leetcode207. 课程表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【LeetCode】210. 课程表 II——拓扑排序

    题目链接:210. 课程表 II 题目描述: 现在你总共有 numCourses 门课需要选,记为 0 到 numCourses - 1。给你一个数组 prerequisites ,其中 prerequisites[i] = [ai, bi] ,表示在选修课程 ai 前 必须 先选修 bi 。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示:[0,1] 。 返

    2024年02月09日
    浏览(34)
  • 2023-09-09 LeetCode每日一题(课程表)

    点击跳转到题目位置 你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程 bi 。 例如,先修课程对 [0, 1] 表示:想要学

    2024年02月09日
    浏览(51)
  • LeetCode 0630.课程表 III:贪心 + 优先队列

    力扣题目链接:https://leetcode.cn/problems/course-schedule-iii/ 这里有 n 门不同的在线课程,按从 1 到 n  编号。给你一个数组 courses ,其中 courses[i] = [duration i , lastDay i ] 表示第 i 门课将会 持续 上 duration i 天课,并且必须在不晚于 lastDay i 的时候完成。 你的学期从第 1 天开始。且不能

    2024年02月09日
    浏览(35)
  • 【LeetCode: 210. 课程表 II:拓扑排序+图】

    🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,CSDN-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文

    2024年02月09日
    浏览(59)
  • 2023-09-10 LeetCode每日一题(课程表 II)

    点击跳转到题目位置 现在你总共有 numCourses 门课需要选,记为 0 到 numCourses - 1。给你一个数组 prerequisites ,其中 prerequisites[i] = [ai, bi] ,表示在选修课程 ai 前 必须 先选修 bi 。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示:[0,1] 。 返回你为了学完所

    2024年02月09日
    浏览(48)
  • 2023-09-11 LeetCode每日一题(课程表 III)

    点击跳转到题目位置 这里有 n 门不同的在线课程,按从 1 到 n 编号。给你一个数组 courses ,其中 courses[i] = [durationi, lastDayi] 表示第 i 门课将会 持续 上 durationi 天课,并且必须在不晚于 lastDayi 的时候完成。 你的学期从第 1 天开始。且不能同时修读两门及两门以上的课程。 返

    2024年02月09日
    浏览(38)
  • 【LeetCode热题100】打卡第38天:课程表&实现前缀树

    大家好,我是知识汲取者,欢迎来到我的LeetCode热题100刷题专栏! 精选 100 道力扣(LeetCode)上最热门的题目,适合初识算法与数据结构的新手和想要在短时间内高效提升的人,熟练掌握这 100 道题,你就已经具备了在代码世界通行的基本能力。在此专栏中,我们将会涵盖各种

    2024年02月17日
    浏览(51)
  • 自制课程表小程序

    微信开发者工具:稳定版 Stable Build 根据自己电脑的系统下载对应的版本 完整代码连接: https://pan.baidu.com/s/1VbgPOS6CUOae8vg2axhGIg?pwd=hk9e 提取码:hk9e 先把完整代码的压缩包解压,并记住这个路径,后面要用 1.打开下载好的微信开发工具, 注意不要用游客登录 ,我一开始就是游客

    2024年02月09日
    浏览(83)
  • java实现课程表 II

    题目: 现在你总共有  numCourses  门课需要选,记为  0  到  numCourses - 1 。给你一个数组  prerequisites  ,其中  prerequisites[i] = [ai, bi]  ,表示在选修课程  ai  前  必须  先选修  bi  。 例如,想要学习课程  0  ,你需要先完成课程  1  ,我们用一个匹配来表示: [0,1]  。

    2024年02月09日
    浏览(41)
  • 210. 课程表 II Python

    现在你总共有 numCourses 门课需要选,记为 0 到 numCourses - 1 。给你一个数组 prerequisites ,其中 prerequisites[i] = [ai, bi] ,表示在选修课程 ai 前 必须 先选修 bi 。 返回你为了学完所有课程所安排的学习顺序。可能会有多个正确的顺序,你只要返回 任意一种 就可以了。如果不可能完

    2024年02月14日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包