【LeetCode】【算法】209. 课程表

LeetCode 209. 课程表

题目描述

你这个学期必须选修numCourses门课程,记为0到numCourses- 1 。
在选修某些课程之前需要一些先修课程。先修课程按数组prerequisites给出,其中 prerequisites[i] = [a_i,b_i] ,表示如果要学习课程a_i则必须先学习课程b_i。
例如,先修课程对[0, 1]表示:想要学习课程0,你需要先完成课程1。
请你判断是否可能完成所有课程的学习?如果可以,返回true;否则,返回false。

思路

这是一个经典的拓扑排序问题,什么是拓扑排序问题?我理解就是需要判断先完成什么事儿再完成什么事儿的那种问题
可以考虑通过建立一个图,对于入度为0的图先开始做搜索,看最后能不能把所有的图节点遍历掉。
第一步:根据给定的prerequisites建立一个类型为List<List<Integer>>edges的列表,其中下标i表示第i门课程,List<Integer>则表示第i门课程的后置课程;同时还有一个indeg=new int[numCourses]数组,该数组中记录每门课程有多少门前置课程
第二步:建立队列,遍历indeg数组,寻找那些前置课程门数为0的课程,并入队到队列尾
第三步:建立一个visited变量存储学习的课程数量,while(队列不为空时)

  • ①出队首元素;
  • ②学习课程数+1;
  • ③通过上面的第一步的List<List<Integer>> edges获得该门课程的所有后置课程,遍历里边的元素for (int v:edges.get(u))对于里面的元素执行:
    --indeg[v];因为该门课程的前置课程数量-1
    if (indeg[v]==0)说明该元素此时入度为0(没有前置课程了),入队到队列尾

第四步:返回visited == numCourses,就知道能否学完所有课程了

代码

class Solution {List<List<Integer>> edges;int[] indeg;public boolean canFinish(int numCourses, int[][] prerequisites) {// 建立图以后做搜索edges = new ArrayList<>();for (int i = 0; i < numCourses; i++){edges.add(new ArrayList<>());}indeg = new int[numCourses];for (int[] prerequisite : prerequisites) {edges.get(prerequisite[1]).add(prerequisite[0]);++indeg[prerequisite[0]]; // 记录这个位置有几个子节点,便于后续做广度优先搜索 -> 但是真的有必要吗?edges[prerequisite[0]]的长度不行吗}Queue<Integer> queue = new LinkedList<>();for (int i = 0; i < numCourses; i++) {if (indeg[i] == 0){ // 找到入度为0的节点开始广度优先搜索queue.offer(i);}}int visited = 0;while (!queue.isEmpty()){++visited;int u = queue.poll(); // 出队for (int v: edges.get(u)){ // 广度优先搜索,里面的内容入队--indeg[v];if (indeg[v] == 0){ // 直到这个节点不再被其他节点所指,才能入队继续遍历它下面的节点queue.offer(v);}}}return visited == numCourses;}
}

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

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

相关文章

基于大语言模型的规划

文章目录 整体框架方案生成反馈获取虽然上下文学习和思维链提示方法形式上较为简洁且较为通用,但是在面对诸如几何数学求解、游戏、代码编程以及日常生活任务等复杂任务时仍然表现不佳。为了解决这类复杂任务,可以使用基于大语言模型的规划(Planning)。该方法的核心思想在于…

【一些正经的思考】牵牛花在秋天播种可以开花吗

这是一篇正经的思考&#xff0c;因为是发生在工位上的事情&#xff0c;所以这也是上班记录~ 我入职新公司已经两个月了&#xff0c;和部门的新伙伴出去吃饭的频率高了1000%&#xff0c;不得不说&#xff0c;这边的食堂确实不是那么好吃&#xff0c;就和小伙伴经常去一个在江边…

零基础Java第十四期:继承与多态(二)

目录 一、继承 1.1. 继承的方式 1.2. final关键字 1.3. 继承与组合 1.4. protected关键字 二、多态 2.1. 多态的概念 2.2. 向上转型 2.3. 重写 2.4. 向下转型 2.5. 多态的优缺点 一、继承 1.1. 继承的方式 猫类可以继承动物类&#xff0c;中华田园猫类可以继承猫类…

Django 详细入门介绍

Django 详细入门介绍 1. 什么是 Django&#xff1f; Django 是一个开源的、用 Python 编写的 Web 框架。它遵循了“快速开发”和“不要重复自己”&#xff08;DRY&#xff09;的设计原则&#xff0c;旨在简化复杂的 Web 开发。Django 提供了多种强大的功能模块&#xff0c;如…

RabbitMQ 不公平分发介绍

RabbitMQ 是一个流行的开源消息代理软件&#xff0c;它实现了高级消息队列协议&#xff08;AMQP&#xff09;。在 RabbitMQ 中&#xff0c;消息分发策略对于系统的性能和负载均衡至关重要。默认情况下&#xff0c;RabbitMQ 使用公平分发&#xff08;Fair Dispatch&#xff09;策…

WebRTC REMB算法

WebRTC REMB&#xff08;Receiver Estimated Maximum Bitrate&#xff09;是一种带宽估计算法&#xff0c;用于在WebRTC中动态地调整视频发送端的码率&#xff0c;以适应网络带宽的变化。以下是对WebRTC REMB的详细解释&#xff1a; 一、定义与原理 定义&#xff1a;REMB是一…

RocketMQ 广播消息

所谓的广播消息就是发送的一条消息会被多个消费者收到。 ⼴播是向主题&#xff08; topic &#xff09;的所有订阅者发送消息。订阅同⼀个 topic 的多个消费者&#xff0c;能全量收到⽣产者发送的所有消息。 生产者发送了10个order&#xff0c;每个order里面有5个消息&#xff…

.Net IOC理解及代码实现

IOC理解 IoC(Inversion of Control)&#xff1a;即控制反转&#xff0c;这是一种设计思想&#xff0c;指将对象的控制权交给IOC容器&#xff0c;由容器来实现对象的创建、管理&#xff0c;程序员只需要从容器获取想要的对象就可以了。DI(Dependency Injection)&#xff0c;即依…

kafka面试十五题

1、kafka消息发送的流程 消息经过main线程里的拦截器&#xff08;可选&#xff09;、序列化器、分区器。分区器将数据发送到分区中&#xff0c;每个分区创建一个双端队列&#xff08;分区是在内存中完成的&#xff09;&#xff0c;内存总大小为32M&#xff0c;每个批次的大小为…

CSS Position 定位如何使用?

写在前面 在网页设计中&#xff0c;定位元素是非常重要的。CSS 提供了多种定位方式&#xff0c;其中最常用的是 position 属性。position 属性允许你精确地控制元素在页面中的位置和布局。 1. static static 是默认的定位方式&#xff0c;表示元素将按照正常的文档流进行布局…

react的创建与书写

一&#xff1a;创建项目 超全面详细一条龙教程&#xff01;从零搭建React项目全家桶&#xff08;上篇&#xff09; - 知乎 1.创建一个文件夹&#xff0c;shift鼠标右键选择在此处打开powershell 2.为了加速npm下载速度&#xff0c;先把npm设置为淘宝镜像地址。 npm config s…

量化交易系统开发-实时行情自动化交易-数据源选择

19年创业做过一年的量化交易但没有成功&#xff0c;作为交易系统的开发人员积累了一些经验&#xff0c;最近想重新研究交易系统&#xff0c;一边整理一边写出来一些思考供大家参考&#xff0c;也希望跟做量化的朋友有更多的交流和合作。 关于数据采集方面&#xff0c;首先聊聊…

【微信小游戏学习心得】

这里是引用 微信小游戏学习心得 简介了解微信小游戏理解2d游戏原理数据驱动视图总结 简介 本人通过学习了解微信小游戏&#xff0c;学习微信小游戏&#xff0c;加深了对前端框架&#xff0c;vue和react基于数据驱动视图的理解&#xff0c;及浏览器文档模型和javaScript之间的关…

【C++】【算法基础】第k个数(分治法)

第k个数 题目 在一个长度为 n n n的整数数列中找到第 k k k大的数。 题解 核心思想同快速排序&#xff08;实际就是快速排序加一个第 k k k大的数会在哪边的判定条件&#xff09;&#xff1a; #include<iostream> using namespace std;int quickSelect(int *a, int …

TVM计算图分割--LayerGroup

文章目录 介绍Layergroup调研TVM中的LayergroupTVM Layergroup进一步优化MergeCompilerRegions处理菱形结构TVM中基于Pattern得到的子图TPUMLIR地平线的Layergroup介绍 Layergroup目前没找到严格、明确的定义,因为不同厂家的框架考虑的因素不同,但是基本逻辑是差不多的。一般…

深究JS底层原理

一、JS中八种数据类型判断方法 在JavaScript中&#xff0c;数据类型分为两大类&#xff1a;基本&#xff08;原始&#xff09;数据类型和引用&#xff08;对象&#xff09;数据类型。 基本数据类型&#xff08;Primitive Data Types&#xff09; 基本数据类型是表示简单的数…

ssm071北京集联软件科技有限公司信息管理系统+jsp(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;北京集联软件科技有限公司信息管理系统 \ 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本信息…

Yocto 项目下通过网络更新内核、设备树及模块

Yocto 项目下通过网络更新内核、设备树及模块 前言 在 Yocto 项目的开发过程中&#xff0c;特别是在进行 BSP&#xff08;Board Support Package&#xff09;开发时&#xff0c;经常需要调整特定软件包的版本&#xff0c;修改内核、设备树以及内核模块。然而&#xff0c;每次…

k8s集群安装(kubeadm)

k8s集群安装&#xff08;kubeadm&#xff09; 1、环境准备&#xff08;master和node节点都执行&#xff09;1.1、替换yum源1.2、关闭selinux1.3、永久关闭防火墙1.4、永久关闭swap1.5、修改主机名添加host1.6、时间同步1.7、将桥接的IPv4流量传递到iptables的链1.8、docker安装…

Ubuntu 修改时区 同步时间

Ubuntu 修改时区 同步时间 1、设置系统时区为中国上海2、更新软件包列表3、安装 ntpdate 工具4、从阿里云 NTP 服务器同步时间5、将系统时间同步到硬件时钟6、读取硬件时钟时间 1、设置系统时区为中国上海 timedatectl set-timezone Asia/Shanghai2、更新软件包列表 apt upda…