想要精通算法和SQL的成长之路 - 课程表IV

news2025/1/15 16:33:16

想要精通算法和SQL的成长之路 - 课程表IV

  • 前言
  • 一. 课程表IV (拓扑排序)

前言

想要精通算法和SQL的成长之路 - 系列导航

做这个题目之前可以回顾一下:课程表II

一. 课程表IV (拓扑排序)

原题链接
在这里插入图片描述

这道题目在课程表II的基础上做了什么升华呢?也就是课程之间的先决条件是可以继承的。 那么我们在原本的拓扑排序基础上可以做些什么操作?

  • 我们需要记录这个先决关系,记录每一对课程之间是否存在直接或间接的先决条件。这里我们可以用一个二维数组matrix来存储。
  • 最终的返回结果,根据queries数组的一二维坐标可以直接查询。

我们先看下拓扑排序中的几个重要步骤:

1.构建邻接图以及计算每个节点的入度数。

List[] adj = new List[numCourses];
// 初始化集合而已
for (int i = 0; i < numCourses; i++) {
    adj[i] = new ArrayList<Integer>();
}
int[] inDegree = new int[numCourses];
for (int[] prerequisite : prerequisites) {
	// [0,1] --> 0->1
    adj[prerequisite[0]].add(prerequisite[1]);
    // 后继节点的入度+1
    inDegree[prerequisite[1]]++;
}

2.利用queue队列,将入度为0的先入队,并做后续的递归操作。入度为0,则说明没有先决课程,可以直接学习。

LinkedList<Integer> queue = new LinkedList<>();
for (int i = 0; i < numCourses; i++) {
    if (inDegree[i] == 0) {
        queue.offer(i);
    }
}

3.开始递归:

while (!queue.isEmpty()) {
    Integer pre = queue.poll();
    List<Integer> nextNode = adj[pre];
    for (Integer next : nextNode) {
    	// 入度-1
        inDegree[next]--;
        // 入度为0之后,立马加入队列,进入下一次递归
        if (inDegree[next] == 0) {
            queue.offer(next);
        }
    }
}

那么本题目将在第三个步骤中增添核心逻辑:

  1. 我们准备一个二维数组matrix
  2. 同时在递归过程中,将对应的指向关系设置为true,代表他们之间的有向性 pre --> next。如果说存在节点 i --> pre。那么一定有i --> next
boolean[][] matrix = new boolean[numCourses][numCourses];
while (!queue.isEmpty()) {
    Integer pre = queue.poll();
    List<Integer> nextNode = adj[pre];
    for (Integer next : nextNode) {
    	// 当前的有向性
        matrix[pre][next] = true;
        // 同时遍历一次数组,在满足pre->next的前提下,如果有i->pre。必定有i->next (i->pre->next)
        // 注意,这里的遍历,我们的纵坐标是固定的,因为纵坐标是指向地(后继节点),而出发点我们应该遍历所有的情况
        for (int i = 0; i < numCourses; i++) {
            if (matrix[i][pre]) {
                matrix[i][next] = true;
            }
        }
        inDegree[next]--;
        if (inDegree[next] == 0) {
            queue.offer(next);
        }
    }
}

最后根据题目的入参queries,像查字典一样,从matrix字典中查出每组的答案:

ArrayList<Boolean> res = new ArrayList<>();
for (int[] query : queries) {
    res.add(matrix[query[0]][query[1]]);
}
return res;

最终完整代码如下:

public class Test1462 {
    public List<Boolean> checkIfPrerequisite(int numCourses, int[][] prerequisites, int[][] queries) {
        List[] adj = new List[numCourses];
        boolean[][] matrix = new boolean[numCourses][numCourses];
        for (int i = 0; i < numCourses; i++) {
            adj[i] = new ArrayList<Integer>();
        }
        int[] inDegree = new int[numCourses];
        for (int[] prerequisite : prerequisites) {
            adj[prerequisite[0]].add(prerequisite[1]);
            inDegree[prerequisite[1]]++;
        }
        LinkedList<Integer> queue = new LinkedList<>();
        for (int i = 0; i < numCourses; i++) {
            if (inDegree[i] == 0) {
                queue.offer(i);
            }
        }
        while (!queue.isEmpty()) {
            Integer pre = queue.poll();
            List<Integer> nextNode = adj[pre];
            for (Integer next : nextNode) {
                matrix[pre][next] = true;
                for (int i = 0; i < numCourses; i++) {
                    if (matrix[i][pre]) {
                        matrix[i][next] = true;
                    }
                }
                inDegree[next]--;
                if (inDegree[next] == 0) {
                    queue.offer(next);
                }
            }
        }
        ArrayList<Boolean> res = new ArrayList<>();
        for (int[] query : queries) {
            res.add(matrix[query[0]][query[1]]);
        }
        return res;
    }
}

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

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

相关文章

通过Git Bash将本地文件上传到本地github

1. 新建一个仓库&#xff08; Repository&#xff09; 1.1登录Github&#xff0c;点击个人头像&#xff0c;点击Your repositories&#xff0c;点击New。 1.2 填写信息 Repository name: 仓库名称 Description(可选): 仓库描述介绍,不是必填项目。~~建议填写上哦&#xff01;…

排序算法:快速排序(三种排序方式、递归和非递归)

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关排序算法的相关知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通…

PMP中十大知识领域及敏捷部分

今天给大家分享一篇PMP考试中十大知识领域及敏捷部分。希望正在备考11月PMP的宝子们能够清楚地拿捏重难点&#xff0c;稳稳上岸&#xff01; 我是胖圆~欢迎大家关注留言&#xff01; 或者移步公众号【胖圆说PM】找我

SpringBoot-可视化监控

一、添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--采集应用的指标信息&#xff0c;prometheus--> <dependency…

牛客练习赛115 A Mountain sequence - 乘法原理

a 到 b有3条路&#xff0c;b到c有4条路&#xff0c;那a到c共有12种选择。 最大值作为顶点&#xff0c;统计每个数的数量&#xff0c;比如说最大值为9&#xff0c;且只有一个&#xff0c;7的数量为4 有的可能为 77779 77797 77977 79777 97777 共计5种可能性&#xff0c;设一…

windows 下载安装 mysql

windows 下载安装 mysql 官网地址&#xff1a;https://dev.mysql.com/ 下载地址&#xff1a;https://cdn.mysql.com//Downloads/MySQLInstaller/mysql-installer-community-8.0.34.0.msi 点击 Downloads 点击 MySQL Community (GPL) Downloads 点击 MySQL Installer for Window…

C高级day5

实现一个对数组求和的函数&#xff0c;数组通过实参传递给函数 #!/bin/bashfunction sum() {i${#*}j0m0while [ $j -lt $i ]do((m${arr[j]}))((j))doneecho "数组和为$m"} read -a arr sum ${arr[*]} 写一个函数&#xff0c;输出当前用户的uid和gid&…

Android悬浮窗实现源码-悬浮球转盘悬浮加速小火箭效果悬浮播放视频图片

一、实现思路 悬浮窗是一种比较常见的需求&#xff0c;就是把需要展示的内容界面缩小成一个悬浮窗&#xff0c;然后用户可以在其他界面上处理事情。 基本实现原理&#xff1a; 主要是通过WindowManager这个类来实现 addView方法用于添加一个悬浮窗&#xff0c; updateViewLay…

如何拆卸滚珠螺杆的螺母?

现在滚珠螺杆的使用中&#xff0c;相信很多人都遇到过因外力原因需要拆卸螺母这种状况&#xff0c;对螺母不熟悉&#xff0c;在拆卸的过程中很容易会损坏螺母&#xff01;因此&#xff0c;掌握正确的拆卸方法是非常必要的。 拆卸滚珠螺杆螺母需要准备一些工具&#xff0c;包括扳…

提升运营效率:仓储可视化的实时监控与优化

当今&#xff0c;仓储管理已经不再是简单的储存和分发商品的过程。随着供应链的复杂性增加&#xff0c;企业需要更高效的方式来管理和优化其仓储运营。在这个背景下&#xff0c;仓储可视化成为了一项关键的技术&#xff0c;它利用先进的数字化工具和数据分析来提升仓储管理的效…

【Linux基础】权限管理

​&#x1f47b;内容专栏&#xff1a; Linux操作系统基础 &#x1f428;本文概括&#xff1a; 用户之间的切换、sudo提权、Linux权限管理、文件访问权限的相关方法、目录权限、粘滞位等 &#x1f43c;本文作者&#xff1a; 阿四啊 &#x1f438;发布时间&#xff1a;2023.9.11 …

D1. Candy Party (Easy Version) Codeforces Round 896 (Div. 2)

Problem - D1 - Codeforces 题目大意&#xff1a;有一个n个数的数组a&#xff0c;要求令每一个数减去一个任意数&#xff0c;然后任选一个数加上&#xff0c;问能否使所有数相等 1<n<2e5 思路&#xff1a;因为要让每个数相等&#xff0c;首先检查他们的和能否平分成n份…

Linux文件属性操作函数

access函数 chmod函数 chown函数 修改文件的所在组或者所有者 truncate函数

RabbitMQ - 如保证消息的可靠性?

目录 一、消息可靠性 1.1、生产者消息确认&#xff08;生产者角度&#xff09; 1.1.1、理论 1.1.2、实践 1.2、消息持久化&#xff08;消息角度&#xff09; 1.2.1、理论 1.3、消费者消息确认&#xff08;消费者角度&#xff09; 1.3.1、理论 1.3.2、实践 1.4、失败重…

母婴用品小程序开发

母婴用品小程序商城开发 商品分类与搜索&#xff1a; 提供母婴用品的分类&#xff0c;如奶粉、尿片、婴儿服装等。 用户可以根据需求进行搜索&#xff0c;快速找到所需的母婴用品。 商品详情与评价&#xff1a; 展示母婴用品的详细信息&#xff0c;包括商品图片、价格、规…

使用Cpolar和极简主义文件管理器构建个人云储存平台并进行公网访问

文章目录 1. 前言2.Tiny File Manager网站搭建2.1.Tiny file manager下载和安装2.2 Tiny file manager网页测试2.2 Tiny file manager网页测试3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试总结 1. 前言 文件共享和查阅是现在网络最常见的应用场景&am…

再见ChatGPT 无需代码能力创建自定义ChatGPT

【无需代码技能】您可以使用3个不同的LLM创建自己的自定义ChatGPT GPT-4 Llama 2Falcon LLM 这是如何与Dante AI创建自己的聊天机器人 Dante AI是一个去中心化的人工智能平台&#xff0c;允许用户创建和训练自己的AI模型。它使用基于区块链的系统来管理数据和交易&#xff…

UG\NX二次开发 获取曲面uv中心点 UF_MODL_ask_face_props

文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,里海BlockUI专栏,C\C++-CSDN博客 简介: UG\NX二次开发 获取曲面uv中心点 UF_MODL_ask_face_props。 效果: 代码: #include "me.hpp"void AskFaceMidpoint() {//选择面tag_t face …

C语言猜数字游戏详解及代码优化

目录 引言&#xff1a; 1.程序思路&#xff1a; 2.代码实现&#xff1a; 2.1.生成游戏菜单&#xff1a; 2.2.构建主函数框架&#xff1a; 2.3.构建游戏函数&#xff1a; 3.游戏源码&#xff1a; 4.程序优化&#xff1a; &#x1f388;优化后源码&#xff1a; 结论…