夯实算法-课程表

news2024/11/13 16:28:22

 

题目:LeetCode

你这个学期必须选修 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<=1051 <= numCourses <= 10^51<=numCourses<=105
  • 0 <= prerequisites.length <= 5000
  • prerequisites[i].length == 2
  • 0 <= ai, bi < numCourses
  • prerequisites[i] 中的所有课程对 互不相同

解题思路

课程是n个,prerequisites中描述的是边,这看起来就是在描述一个图。课程是节点,范围[0,n−1],prerequisites中则是有向边,整体这就形成了一个有向图。

建图

课程是从0 到 n−1,那么可以用一个邻接列表来表示图,主列表用ArrayList,因为数量是已知的,且需要随机访问,用ArrayList最合适,每一个元素都 是一个列表,是从下标代表的课程作为先修的后修课程,也就是从下标出发能到达到节点。

入度与出度

有向图中,以某个节点v为终点的边的数目,称为此节点的入度;以此节点v为起始的边的数目 则是出度。

从入度为0的节点开始,运用BFS,先把入度为0的节点加入队列,然后,BFS对队列中的每个节点的下一个节点,入度减1,这相当于减少一个边(减少一个从先修到后修的课程对)。如入度变成0,则再入队,直到队列为空。

代码实现

public boolean canFinish(int numCourses, int[][] prerequisites) {
    List < List < Integer >> graph = new ArrayList < > (numCourses);
    for (int i = 0; i < numCourses; i++) {
        graph.add(new LinkedList < Integer > ());
    }
    int[] inDegrees = new int[numCourses];
    for (int[] pair: prerequisites) {
        graph.get(pair[1]).add(pair[0]);
        inDegrees[pair[0]] ++;
    }

    Queue < Integer > queue = new LinkedList < > ();
    IntStream.range(0, numCourses)
        .filter(i - > inDegrees[i] == 0)
        .forEach(queue::offer);

    while (!queue.isEmpty()) {
        int from = queue.poll();
        for (int v: graph.get(from)) {
            inDegrees[v] --;
            if (inDegrees[v] == 0) {
                queue.offer(v);
            }
        }
    }

    return Arrays.stream(inDegrees).allMatch(k - > k == 0);
}
复制代码

复杂度分析

  • 空间复杂度:O(1)O(1)O(1)
  • 时间复杂度:O(n2)O(n^2)O(n2)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/68076.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux系统编程5——Socket编程(网络通信)

文章目录前言一、套接字二、基础知识三、网络套接字函数3.1、struct sockaddr3.2、socket函数3.3、bind函数3.4、listen函数3.5、accept函数3.6、connect函数3.7、读取/发送数据函数3.8 客户端服务器通信demo四、select函数1、TCP状态简介2、端口复用2.1、setsockopt函数3、半关…

云之道知识付费v1.5.4小程序+前端(含pc付费插件)

内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍 云之道知识付费v1.5.4小程序前端&#xff08;含pc付费插件&#xff09; 版本号&#xff1a;1.5.4 – 商用无限开 无需重新上传小程序 【修复】上一版本公众号版本打开白屏问题 版本号&a…

【C语言】函数三要素,变量作用域、生存周期、存储类型

目录 写在前面 一、函数的用法 1、声明 2、调用 3、定义 形参与实参类型不一致 形参与实参类型一致 函数值类型与返回值类型不一致 函数值类型与返回值类型一致 二、变量的作用域与生存周期 三、变量的储存类型&#xff08;auto,extern,static,register&#xff09;…

AI虚拟人千亿级市场来袭,景联文科技提供全方面数据采集标注服务

“AI虚拟人通过语音、文字、视觉的理解和生成&#xff0c;结合动作识别、环境感知等多种方式可与人进行互动。AI虚拟人中运用到的强大算法需要高质量标注数据不断对其进行优化训练&#xff0c;景联文科技提供全方面数据采集标注服务。” 11月18日&#xff0c;科大讯飞在第五届世…

行为型模式 - 访问者模式Visitor

学习而来&#xff0c;代码是自己敲的。也有些自己的理解在里边&#xff0c;有问题希望大家指出。 行为型模式&#xff0c;我之所以把他放到第一个&#xff0c;是因为它号称是GoF中最难的一个。 模式的定义与特点 在访问者模式中&#xff08;Visitor Pattern&#xff09;中&…

pandasGUI:一款开源的功能异常强大的数据可视化分析工具

在很早之前关于可视化的描述中&#xff0c;我们介绍过一款D-table的数据分析操作工具。和D-table的操作相似&#xff0c;还有一款pandasGUI的开源工具更加强势。 Pandasgui是一个开源的python模块&#xff0c;它为pandas创建了一个GUI界面&#xff0c;我们可以在其中使用panda…

Impact of Problem Decomposition on Cooperative Coevolution

0、论文背景 本文在CCVIL的基础上&#xff0c;讨论了问题的分解效果对于CC框架的影响。由于VIL本身是一项计算成本昂贵的任务&#xff0c;因此应该避免在VIL上花费过多的时间而对CCEA没有显著的好处。我们进行实证研究来解决三个密切相关的问题&#xff1a; 1)更好的问题分解会…

STC 51单片机58——旋转LED

STC11F LED部分&#xff1a; #include "STC11.h" #define u8 unsigned char #define u16 unsigned int //全亮 //u8 code Picture1[8]{0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f} ; //u8 code Picture2[8]{0xe7,0xdb,0xbd,0x7e,0x7e,0xbd,0xdb,0xe7}; //u8 code P…

阿里云的工程师又闯祸了,github上紧急修复

最近不少用户使用阿里云提供的测试用例出现了被删除了用户目录下的所有文件&#xff0c;项目地址是&#xff1a;https://github.com/aliyun/aliyun-clialiyun-cli/cli/completion_installer_test.goLines 87 to 99 in 550ccb6path : filepath.Join(u.HomeDir, ".bashrc&qu…

求知 | 聊聊Android资源加载那些事 - Resource的初始化

Hi,你好 &#x1f603; 引言 在上一篇&#xff0c;求知 | 聊聊Android资源加载的那些事 - 小试牛刀 中&#xff0c;我们通过探讨 Resource.getx() ,从而解释了相关方法的背后实现, 明白了那些我们日常调用方法的背后实现。 那么&#xff0c;不知道你有没有好奇 context.reso…

【蓝桥杯国赛真题07】python杨辉三角形 蓝桥杯青少年组python编程 蓝桥杯国赛真题解析

目录 python杨辉三角 一、题目要求 1、提示信息 2、编程实现 3、输入输出

蓝桥杯嵌入式Debug

文章目录前言一、Debug是什么二、如何调试1.重要调试按键介绍2.其他按键介绍三、监视变量窗口总结前言 这一篇文章是非常重要的&#xff0c;掌握了这篇文章有助于大家在比赛中快速找到错误。 一、Debug是什么 Debug是一种程序&#xff0c;一种调试工具&#xff0c;说白了就是…

Elasticsearch:如何在 Elastic Agents 中配置 Beats 来采集定制日志

在我之前的文章 “Observability&#xff1a;使用 Elastic Agent 来摄入日志及指标 - Elastic Stack 8.0”&#xff0c;我详细地描述了如何安装 Elasticsearch&#xff0c;Stack 及 Elastic Agents 来采集系统日志及指标。很多开发者可能会有疑问&#xff0c;在我们的实际使用中…

陈都灵《我们当打之年》热播《关索岭》上热搜,温州人爱望京卡牌

最近&#xff0c;电视连续剧《我们的当打之年》&#xff0c;正在各大卫视台热播&#xff0c;一起热起来的还有该剧主演陈都灵。说起主演陈都灵&#xff0c;她虽然不是正宗的电影学院科班出身&#xff0c;但是她的演技却透露着灵气&#xff0c;也给人以真实的感觉。 陈都灵无疑是…

[附源码]Python计算机毕业设计Django学习帮扶网站设计与实现

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

2023年哪些渲染器更好用?3D新手适合的渲染器汇总

现在很多人都使用3D软件来创作自己的作品&#xff0c;所以渲染器的使用必不可少。有许多流行的渲染器&#xff0c;包括 V-Ray、Octane、Arnold、Corona、RedShift。对于许多 3D 新手来说&#xff0c;哪种渲染器最好&#xff1f; 这些渲染器的原理基本相同&#xff0c;只是操作…

大学免费查题接口系统

大学免费查题接口系统 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&#xff08;点…

地图信息,障碍判断以及寻路算法(A星算法,B星算法和蚁群算法等)

一、广度优先遍历和深度优先遍历 在学习寻路算法之前,我们先来了解一下广度优先遍历和深度优先遍历. 什么是广度优先遍历? 广度优先遍历(breadth first search)是一个万能的算法. 广度优先是从初始状态一层一层向下找&#xff0c;直到找到目标为止。 广度优先遍历&#x…

Elasticsearch入门(一)基本介绍与安装

介绍&#xff1a; Elaticsearch&#xff1a;简称为 ES&#xff0c;ES 是一个开源的高扩展的分布式全文搜索引擎&#xff0c;是整个 Elastic Stack 技术栈的核心。它可以近乎实时的存储、检索数据&#xff1b;本身扩展性很好&#xff0c;可以扩展到上百台服务器&#xff0c;处理…

STL-常用遍历算法

目录 1.for_each 功能描述 函数原型 2.transform 功能描述 函数原型 1.for_each 功能描述 实现容器遍历 函数原型 for_each(itertor beg,iterator end,_func); //遍历算法 遍历容器元素 //beg 开始迭代器 //end 结束迭代器 //_func函数或者函数对象 代码 #include <i…