课程表00

news2025/1/18 10:58:11

题目链接

课程表

题目描述

注意点

  • prerequisites[i] 中的所有课程对 互不相同
  • prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程 bi
  • numCourses表示这个学期必须选修 numCourses 门课程
  • prerequisites[i].length == 2

解答思路

  • 最初想到的是使用一个数据结构存储每门课程索要学习的前置课程(很容易想到用Map进行存储),再使用一个数组存储当前哪些课是可以学习的(最初只有无前置课程的可以学习),随后不断根据这两个数据结构推出后续可以学习的课程,最终判断是否numCourses门课程都能学习,关键要注意循环终止条件。但是时间复杂度和空间复杂度都不理想,且这种方法也较为复杂

  • 参照题解使用拓扑排序的思想解决本题,首先要了解入度和出度的概念:入度是学习某个课程前需要学习的所有课程,出度是学习了某个课程后对哪些课程有影响。随后以广度优先遍历的思想不断判断哪些课程可以学习,最终判断是否所有课程都能学习
  • 广度优先遍历判断课程可以学习的过程是:每次遍历判断所有入度为0的课程,此时学习该课程无需前置课程或者前置课程都已学习完,任意课程确定能学习后,根据其出度将其影响的相应课程的入度减1,不断重复此过程直到没有新的课程可以学习为止

代码

class Solution {
    public boolean canFinish(int numCourses, int[][] prerequisites) {
        int res = 0;
        // 存储学习当前课程的入度数量
        int[] currCourses = new int[numCourses];
        // 将该课程作为前置课程的相关课程列表
        List<List<Integer>> prevCourseList = new ArrayList<>();
        for (int i = 0; i < numCourses; i++) {
            prevCourseList.add(new ArrayList<Integer>());
        }
        // 当前已学习课程
        for (int i = 0; i < prerequisites.length; i++) {
            Integer course1 = prerequisites[i][0];
            Integer course2 = prerequisites[i][1];
            currCourses[course1] += 1;
            prevCourseList.get(course2).add(course1);
        }
        Queue<Integer> queue = new LinkedList<>();
        for (int i = 0; i < currCourses.length; i++) {
            if (currCourses[i] == 0) {
                queue.add(i);
            }
        }
        while (!queue.isEmpty()) {
            res++;
            int u = queue.poll();
            for (int v : prevCourseList.get(u)) {
                currCourses[v]--;
                if (currCourses[v] == 0) {
                    queue.add(v);
                }
            }
        }
        return res >= numCourses;
    }
}

关键点

  • 理解入度和出度的概念
  • 拓扑排序的概念
  • 广度优先遍历寻找学习课程的过程

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

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

相关文章

idea --Git Commit Template插件

Git Commit Template是一款免费的IntelliJ IDEA插件&#xff0c;用于提供Git提交模板。该插件可以帮助开发者编写规范的Git提交信息&#xff0c;提高代码管理效率。 首先安装插件&#xff1a; 使用Git Commit Template插件: 注&#xff1a;long description和Breaking changes…

亚马逊卖家必备的3款AI作图工具

Mokker Mokker AI - Instant AI Background Replacement 作为亚马逊的卖家&#xff0c;想要做好看的产品图&#xff0c;如果你此时缺少拍摄设备和环境&#xff0c;那么就可以用这个工具帮你。Mokker使用AI技术&#xff0c;可以帮你智能生成背景图。只需要上传产品图&#xff…

C# task多线程创建,暂停,继续,结束使用

1、多线程任务创建 private void button1_Click(object sender, EventArgs e) //创建线程{CancellationToken cancellationToken tokensource.Token;Task.Run(() > //模拟耗时任务{for (int i 0; i < 100; i){if (cancellationToken.IsCancellationRequested){return;…

习题练习 C语言(暑期)

编程能力小提升&#xff01; 前言一、转义字符二、重命名与宏定义三、三目运算符四、计算日期到天数转换五、计算字符串长度六、宏定义应用七、const常量八、C语言基础九、const常量&#xff08;二&#xff09;十、符号运算十一、记负均正十二、SWITCH&#xff0c;CASE十三、错…

元素隐式具有 “any“ 类型,因为类型为 “string“ 的表达式不能用于索引类型

今天在写ts文件的过程中&#xff0c;我遍历了一个对象&#xff0c;然后取值的时候发现爆红,如下图&#x1f447; 经过我一通排查&#xff08;原因我对ts也不是很熟练&#xff09;&#xff0c;了解到大致意思是说key的值类型不是string类型&#xff0c;在javascript中是默认给你…

金融行业步入大模型时代,AI重塑生态与价值

中国人工智能事业尽管起步较晚&#xff0c;但呈现出飞速发展的势头&#xff0c;自2014年起至今&#xff0c;经历了从创业高潮到应用部署再到技术瓶颈的全面生命周期&#xff0c;而今正迈入大规模商业变现的崭新阶段。围绕生成式AI浪潮下&#xff0c;谁能率先落地的AIGC应用&…

若依前端Vue3模板——自定义主题+炫彩主题

文章目录 若依框架新增自定义主题风格实现结果实现步骤默认主题的设置布局设置图标文件布局组件 准备CSS变量对状态管理库中的主题名称进行匹配logo图标组件左侧导航栏菜单组件顶部导航栏组件 炫彩主题实现结果实现步骤布局设置布局组件 其他展示内容的路由出口布局设置-开启to…

计算机网络aaaaaaa

差错检测 在一段时间内&#xff0c;传输错误的比特占所传输比特总数的比率称为误码率BER(Bit Error Rate) 11111111111111111111111111111111111111111111111111111111111111111111111111111111 11111111111111111111111111111111111111111111111111111111111111111111111111…

HPC是如何助力AI推理加速的?

高性能计算&#xff08;High-Performance Computing&#xff0c;HPC&#xff09;通过提供强大的计算能力、存储资源和网络互联&#xff0c;可以显著地辅助人工智能&#xff08;AI&#xff09;应用更快地进行训练和推断。那么&#xff0c;HPC是如何助力AI推理加速的&#xff1f;…

电脑识别不了固态硬盘怎么办?

在使用固态硬盘时&#xff0c;可能会出现电脑无法识别的情况&#xff0c;这时我们就无法使用固态硬盘中的数据。那么&#xff0c;电脑识别不了固态硬盘怎么办&#xff1f; 为什么电脑识别不了固态硬盘&#xff1f; 一般来说&#xff0c;电脑识别不了固态硬盘是因为以下3个原因…

PO设计模式是selenium自动化测试中最佳的设计模式之一

Page Object Model&#xff1a;PO设计模式是selenium自动化测试中最佳的设计模式之一&#xff0c;主要体现在对界面交互细节的封装&#xff0c;也就是在实际测试中只关注业务流程就OK了传统的设计中&#xff0c;在新增测试用例之后&#xff0c;代码会有以下几个问题&#xff1a…

汽车3D HMI图形引擎选型指南【2023】

推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 2002年&#xff0c;电影《少数派报告》让观众深入了解未来。 除了情节的核心道德困境之外&#xff0c;大多数人都对它的技术着迷。 我们看到了自动驾驶汽车、个性化广告和用户可以无缝交互的 3D 计算机界面。 令人惊讶的是…

Live800:在线沟通有这些新趋势

近年来&#xff0c;随着互联网技术的快速发展&#xff0c;越来越多的企业开始采用在线客服系统&#xff0c;以解决与客户沟通的问题。这项技术的出现&#xff0c;不仅改变了企业与客户之间沟通的方式&#xff0c;也为未来在线沟通提供了新的方向。 在线客服系统的特点主要有以下…

产品发布 | 成集云-积分商城系统

应用背景 近年来&#xff0c;随着互联网和移动支付的普及&#xff0c;消费者的消费行为逐渐从线下转移到线上。在互联网和移动支付的竞争中&#xff0c;如何吸引和留住用户是各个平台面临的重要问题。 积分商城的起源可以追溯到用户积累一定积分后&#xff0c;使用积分换购商品…

(笔记三)opencv图像基础操作

强调&#xff1a;本文只为学习记录做笔记 详细可参考opencv官网 &#xff1a;https://docs.opencv.org/4.1.1/d0/d86/tutorial_py_image_arithmetics.html &#xff08;1&#xff09;将cv2的BGR模式改为RGB模式 #!/usr/bin/env python # -*- coding:utf-8 -*- ""&q…

Bently 146031-01瞬态数据接口模块

数据采集&#xff1a; 该模块用于采集旋转机械&#xff08;如涡轮机、发电机、压缩机等&#xff09;的振动、温度、压力、电流等数据。这些数据有助于监测设备的性能和状态。 瞬态数据&#xff1a; 该模块专门用于瞬态数据采集&#xff0c;这意味着它能够捕获和存储瞬时事件和…

【漏洞复现】万户协同办公平台未授权访问漏洞

漏洞描述 万户ezOFFICE协同管理平台涵盖门户自定义平台、信息知识平台管理、系统管理平台功能&#xff0c;它以工作流引擎为底层服务&#xff0c;以通讯沟通平台为交流手段&#xff0c;以门户自定义平台为信息推送显示平台&#xff0c;为用户提供集成的协同工作环境。该平台存…

汽车自适应巡航系统车距控制策略研究

1 引言 自适应巡航控制( Adaptive Cruise Control&#xff0c;ACC) 是汽车驾驶辅助系统的重要组成部分&#xff0c;其作用是根据车距传感器探测到本车( ACC 车辆) 与主目标车辆( 前车) 之间的相对位置和相对速度信息&#xff0c;自动调节ACC 车辆的节气门开度或部分制动力矩( 即…

水利部信息中心:数字孪生流域14家先行先试取得成效

&#xff08;1&#xff09;长江委 对汉江中下游一维水动力学模型进行升级改造&#xff0c;在确保模型计算精度的同时进一步提升模型的计算速度和稳定性&#xff0c;已更新集成至数字孪生汉江系统&#xff0c;更好支持防洪调度策略推荐等业务功能&#xff0c;具有较好推广性。 …

JAVA基础-JDBC

本博客记录JAVA基础JDBC部分的学习内容 JDBC基本概念 JDBC : JAVA链接数据库&#xff0c;是JAVA链接数据库的技术的统称&#xff0c;包含如下两部分&#xff1a; 1. JAVA提供的JDBC规范&#xff08;即各种数据库接口&#xff09;存储在java.sql 和 javax.sql中的api 2. 各个数…