LeetCode刷题之HOT100之课程表

吃完普通的食堂饭菜,回到实验室,继续做一道题!

1、题目描述

在这里插入图片描述

2、逻辑分析

这道题涉及到图相关知识,应用到了拓扑排序。
题意解释

  • 一共有 n 门课要上,编号为 0 ~ n-1。
  • 先决条件 [1, 0],意思是必须先上课 0,才能上课 1。
  • 给你 n、和一个先决条件表,请你判断能否完成所有课程。

官方给的题解太抽象了,有另一个题解给的很直观,易理解,放过来:题解:课程表

3、代码演示

public boolean canFinish(int numCourses, int[][] prerequisites) {
        // 创建一个哈希映射,用于存储每个课程的入度(即需要先修的课程数量)
        Map<Integer, Integer> inDegree = new HashMap<>();
        // 初始化每个课程的入度为0 
        for(int i = 0; i < numCourses; i++){
            inDegree.put(i,0);
        }

        // 创建一个哈希映射,用于存储每个课程的后续课程列表
        Map<Integer, List<Integer>> adj = new HashMap<>();

        // 遍历先决条件数组 
        for(int[] relate : prerequisites){
            // 当前课程(即需要学习的课程)
            int cur = relate[1];
            // 后续课程(即当前课程的先决条件)
            int next = relate[0];

            // 更新后续课程的入度
            inDegree.put(next, inDegree.get(next) + 1);

            // 如果当前课程的后续课程列表还未初始化,则进行初始化
            if(!adj.containsKey(cur)){
                adj.put(cur, new ArrayList<>());
            }

            // 将后续课程添加到当前课程的后续课程列表中
            adj.get(cur).add(next);
        }

        // 创建一个队列,用于存储入度为0的课程
        Queue<Integer> queue = new LinkedList<>();
        // 将所有入度为0的课程加入队列
        for(int key : inDegree.keySet()){
            if(inDegree.get(key) == 0){
                queue.offer(key);
            }
        }
        // 拓扑排序的主循环
        while(!queue.isEmpty()){
            // 取出队首的入度为0的课程  
            int cur = queue.poll();
            // 如果当前课程没有后续课程(即没有需要它作为先决条件的课程),则跳过此次循环
            if(! adj.containsKey(cur)){
                continue;
            }
            List<Integer> successorList = adj.get(cur);
            // 遍历当前课程的后续课程列表 
            for(int k : successorList){
                // 更新后续课程的入度
                inDegree.put(k, inDegree.get(k) - 1);
                // 如果后续课程的入度变为0,则将其加入队列
                if(inDegree.get(k) == 0){
                    queue.offer(k);
                }
            }
        }
        // 遍历所有课程的入度,如果有任何课程的入度不为0,则说明存在环,无法完成所有课程
        for(int key : inDegree.keySet()){
            if(inDegree.get(key) != 0){
                return false;
            }
        }
        // 所有课程的入度都为0,说明不存在环,可以完成所有课程 
        return true;
    }

哈哈,击败百分之十二,笑了!照着打的,看了半天还是不太懂,懂了我下次做估计也做不出来,先放这儿吧,下次再来看!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

不止是只有维度建模,数据仓库还有Data Vault建模

引言 在数据仓库设计中&#xff0c;传统的星型和雪花型模型有着各自的优势和劣势。随着数据量的增大和数据源的多样化&#xff0c;Data Vault&#xff08;数据仓库&#xff09;建模方法逐渐受到关注和应用。Data Vault建模是一种灵活、可扩展、适应性强的建模方法&#xff0c;…

flash申请内存失败,导致老化问题解决

背景 在闪光灯初始化阶段客制化了一个buffer&#xff0c;下发到kernel的闪光灯驱动中用于保存读取闪光灯寄存器的值。功能测试都是正常的&#xff0c;但是一旦开始批量跑产线老化测试会有1/4500左右概率的后主摄拍照卡住。定位根因是闪光灯初始化失败&#xff0c;进一步原因就…

记一次ndk版本升级

概述 事情的起因是做一次android版本的业务迭代&#xff0c;发现程序crash掉了。经过分析&#xff0c;原因是中台部门对libc_shared.so库进行了升级&#xff0c;正好我们的业务也会用到libc_shared.so库&#xff0c;导致两个库版本冲突。具体crash的原因可以参见参考文献1。 …

Coldrage Dagger

剃刀高地【寒怒匕首 Coldrage Dagger】 2020.11.26.剃刀高地刷【寒怒匕首】-1_网络游戏热门视频 2020.11.26.剃刀高地刷【寒怒匕首】-2_网络游戏热门视频

【M365运维】Outlook和Teams里不显示用户的组织架构

【问题】 由于一些误操作&#xff0c;把用户账户禁用并重新启用后&#xff0c;发现在Outlook和Teams里无法查看用户的组织结构图了。如下图所示&#xff1a; - 在Outlook 里&#xff0c;用户标签页的组织一直显示“正在加载..."&#xff0c;成员身份也是“找不到任何组。…

【项目实训】数据库内容丰富

经团队讨论&#xff0c;对前端页面展示数据进行了增加&#xff0c;于是相应的修改数据库 经团队成员使用大模型对各公司面试经验中问题的总结优化&#xff0c;我们打算将大模型的回答存储到数据库中&#xff0c;以显示在前端页面 于是在数据库中存储大模型的回答&#xff1a;…

同三维T700转换器 USB转HDMI转换器

让USB摄像头变成HDMI输出&#xff0c;支持4K60输出 一、产品简介&#xff1a; 此转换器可以把USB信号转成HDMI信号&#xff0c;支持4K60 HDMI输出&#xff0c;有效解决了USB摄像头连接电视、显示器、导播台的问题&#xff0c;带USB控制口&#xff0c;可升级/接蓝牙接收器&#…

【微服务网关——hystrix-go类库】

1.hystrix-go类库 hystrix-go 是 Netflix 开源的 Hystrix 库在 Go 语言中的实现&#xff0c;用于处理服务中的故障和延迟问题。它通过提供熔断器&#xff08;Circuit Breaker&#xff09;、隔离、降级、限流、以及实时监控等机制&#xff0c;帮助开发者构建健壮的分布式系统。…

初学51单片机之长短键应用定时炸弹及扩展应用

51单片机RAM区域划分 51单片机的RAM分为两个部分&#xff0c;一块是片内RAM&#xff0c;一块是片外RAM。 data&#xff1a; 片内RAM从 0x00 ~0x7F 寻址范围&#xff08;0-127&#xff09; 容量共128B idata: 片外RAM从 0x00~0xFF 寻址范围(0-255) 容量共256B pdata&am…

ADC位数、增益调制与参考电压

位数&#xff1a;12bit、10bit、8bit 一般就是对应的ADC值分别为&#xff1a;4095、1023、255&#xff0c;也就选用对应位数时ADC的最大值。 增益的作用 增益设置用于放大或缩小输入信号&#xff0c;使其适配到ADC的输入范围。增益设置可以通过配置SAADC的通道配置寄存器来实…

java基于ssm+jsp 毕业生就业信息管理系统

1管理员功能模块 管理员输入个人的用户名、密码、角色登录系统&#xff0c;这时候系统的数据库就会在进行查找相关的信息&#xff0c;如果我们输入的用户名、密码不正确&#xff0c;数据库就会提示出错误的信息提示&#xff0c;同时会提示管理员重新输入自己的用户名、密码&am…

高通安卓12-安卓系统定制1

1.改变系统默认语言 从build/make/target/product/full_base.mk 2.修改开机图片 安卓原版操作方式 找到生成脚本&#xff1a;device\qcom\common\display\logo\logo_gen.py 其中readme.txt有操作说明 命令&#xff1a; sudo apt-get install python-imaging python ./logo_…

[AIGC] Doris:一款高效的MPP数据仓库引擎

在大数据处理的领域中&#xff0c;Apache Doris&#xff08;原百度 Palo&#xff09;是一个高效的MPP&#xff08;大规模并行处理&#xff09;数据仓库&#xff0c;最初由百度开发&#xff0c;现在已经成为Apache的孵化项目。 (图片取自百度) – 文章目录 1. Doris的基础知识…

RocketMQ:日常开发中有哪些使用MQ的场景

什么是消息队列&#xff1f; 消息队列是一种通信方法&#xff0c;允许应用程序通过发送和接收消息来互相通信。这些消息/任务/指令存储在一个中间介质中&#xff08;即队列&#xff09;&#xff0c;并由生产者发送&#xff0c;消费者接收。 使用场景 场景一&#xff1a;任务…

输出100以内的质数

质数&#xff1a;只能被1和自身整除的数 let count; for(let i2; i<100; i){for(let j1; j<i; j){if(i % j 0){// 只要能被整除&#xff0c;count就加1count;}} if(count 2) {// 从1到自身被整除完之后&#xff0c;如果count只有两次&#xff0c;则说明i为质数co…

【技巧】如何检查多个GPU之间是否支持P2P通信

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 需要用到cuda_samples&#xff1a;GitHub - NVIDIA/cuda-samples 该工具的详细解释可以看这个&#xff1a; 【知识】详细介绍 CUDA Samples 示例工程…

[数据集][目标检测]电力场景下电柜箱门把手检测数据集VOC+YOLO格式1167张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1167 标注数量(xml文件个数)&#xff1a;1167 标注数量(txt文件个数)&#xff1a;1167 标注…

Leetcode Hot100之链表

1.相交链表 解题思路 快慢指针&#xff1a;分别求出两个链表的长度n1和n2&#xff0c;在长度较长的那个链表上&#xff0c;快指针先走n2 - n1&#xff0c;慢指针再出发&#xff0c;最后能相遇则链表相交 时间复杂度O(mn)&#xff0c;空间复杂度O(1)代码# Definition for singl…

白敬亭章若楠甜度报表的难哄大师

#白敬亭章若楠&#xff0c;甜度爆表的难哄大师#&#x1f389;&#x1f389;&#x1f389;各位小伙伴们&#xff0c;你们还记得那个让我们心跳加速、嘴角上扬的CP组合吗&#xff1f;没错&#xff0c;就是白敬亭和章若楠&#xff01;他们可是凭借一部新剧&#xff0c;再次让我们感…

520. 检测大写字母

题目 我们定义&#xff0c;在以下情况时&#xff0c;单词的大写用法是正确的&#xff1a; 全部字母都是大写&#xff0c;比如 “USA” 。单词中所有字母都不是大写&#xff0c;比如 “leetcode” 。如果单词不只含有一个字母&#xff0c;只有首字母大写&#xff0c;比如 “Go…