【每日一题Day324】LC1462课程表 IV | BFS 拓扑排序 Floyd

简介: 【每日一题Day324】LC1462课程表 IV | BFS 拓扑排序 Floyd

课程表 IV【LC1462】

你总共需要上 numCourses 门课,课程编号依次为 0numCourses-1 。你会得到一个数组 prerequisite ,其中 prerequisites[i] = [ai, bi] 表示如果你想选 bi 课程,你 必须 先选 ai 课程。

  • 有的课会有直接的先修课程,比如如果想上课程 1 ,你必须先上课程 0 ,那么会以 [0,1] 数对的形式给出先修课程数对。

先决条件也可以是 间接 的。如果课程 a 是课程 b 的先决条件,课程 b 是课程 c 的先决条件,那么课程 a 就是课程 c 的先决条件。

你也得到一个数组 queries ,其中 queries[j] = [uj, vj]。对于第 j 个查询,您应该回答课程 uj 是否是课程 vj 的先决条件。

返回一个布尔数组 answer ,其中 answer[j] 是第 j 个查询的答案。

暴力

class Solution {
    public List<Boolean> checkIfPrerequisite(int n, int[][] prerequisites, int[][] queries) {
        // 枚举+BFS
        List<Integer>[] g = new List[n];
        Arrays.setAll(g, e -> new ArrayList<>());
        List<Boolean> res = new ArrayList<>();
        for (int[] pre : prerequisites){
            int u = pre[0], v = pre[1];
            g[u].add(v);// v的先决条件是u
        }
        for (int[] q : queries){
            int u = q[0], v = q[1];
            Deque<Integer> queue = new LinkedList<>();
            boolean[] vis = new boolean[n];
            queue.addLast(u);
            vis[u] = true;
            boolean find = false;
            while(!queue.isEmpty()){
                int node = queue.pollFirst();
                if (node == v){
                    find = true;
                    break;
                }
                for (int next : g[node]){                   
                    if (!vis[next]){
                        queue.addLast(next);
                        vis[next] = true;
                    }
                }
            }
            res.add(find);
        }
        return res;
    }
}

image.png

枚举k ,并枚举u 和v ,如果u 是k 的先决条件并且k是v 的先决条件,那么u 是v 的先决条件


实现

class Solution {
    public List<Boolean> checkIfPrerequisite(int n, int[][] prerequisites, int[][] queries) {
        List<Boolean> res = new ArrayList<>();
        boolean[][] f = new boolean[n][n];// f[i][j]代表i是否是j的先决条件
        for (int[] pre : prerequisites){
            int u = pre[0], v = pre[1];
            f[u][v] = true;
        }
        for (int k = 0; k < n; k++){
            for (int u = 0; u < n; u++){
                for (int v = 0; v < n; v++){
                    f[u][v] |= f[u][k] && f[k][v];
                }
            }
        }
        for (int[] q : queries){
            int u = q[0], v = q[1];   
            res.add(f[u][v]);
        }
        return res;
    }
}

image.png

class Solution {
    public List<Boolean> checkIfPrerequisite(int n, int[][] prerequisites, int[][] queries) {
        // 拓扑排序
        List<Integer>[] g = new List[n];
        int[] inDeg = new int[n];
        Arrays.setAll(g, e -> new ArrayList<>());
        List<Boolean> res = new ArrayList<>();
        boolean[][] f = new boolean[n][n];// f[i][j]代表i是否是j的先决条件
        for (int[] pre : prerequisites){
            int u = pre[0], v = pre[1];
            g[u].add(v);
            inDeg[v]++;
        }
        Deque<Integer> queue = new LinkedList<>();
        for (int i = 0; i < n; i++){
            if (inDeg[i] == 0){
                queue.addLast(i);
            }
        }
        while (!queue.isEmpty()){
            int u = queue.pollFirst();
            for (int v : g[u]){
                f[u][v] = true;
                for (int k = 0; k < n; k++){
                    f[k][v] |= f[k][u];//k -> u -> v 
                }
                if(--inDeg[v] == 0){
                    queue.addLast(v);
                }
            }
        }
        for (int[] q : queries){
            int u = q[0], v = q[1];   
            res.add(f[u][v]);
        }
        return res;
    }
}

image.png

目录
相关文章
|
监控 物联网 开发工具
MQTT常见问题之MQTT云端sdk消费者 出现重复消费如何解决
MQTT(Message Queuing Telemetry Transport)是一个轻量级的、基于发布/订阅模式的消息协议,广泛用于物联网(IoT)中设备间的通信。以下是MQTT使用过程中可能遇到的一些常见问题及其答案的汇总:
|
算法 架构师 安全
10年Java面试总结:Java程序员面试必备的面试技巧
作为一名资深10年Java技术专家,我参与了无数次的面试,无论是作为面试者还是面试官。在这里,我将分享我的一些面试经历和面试技巧,希望能帮助即将面临面试的Java程序员们。回顾我的Java职业生涯,我清晰地记得一次特别的面试经历。那是我申请一家知名科技公司的Java开发岗位。为了这次面试,我花了几周的时间准备,这不仅包括Java的基础和高级知识,还有关于公司产品的研究。
731 0
|
11月前
|
存储 运维 负载均衡
智能存储解决方案:探索 TDengine 的多级存储功能
在当今数据驱动的时代,如何高效地存储和管理海量数据已成为企业面临的一大挑战。为了应对这一需求,TDengine Enterprise 不仅支持使用对象存储(S3),还早已引入了独特的多级存储功能。这一功能不仅能够降低存储成本,还能显著提升数据写入性能,并简化系统维护流程。
187 2
|
数据可视化 Python
Matplotlib 教程 之 Seaborn 教程 10
Seaborn 是基于 Matplotlib 的 Python 数据可视化库,专注于统计图形的绘制。它提供了高级接口和美观的默认主题,简化了复杂图形的生成过程。Seaborn 支持多种图表类型,如散点图、折线图、柱状图、热图等,并特别强调视觉效果。例如,使用 `sns.violinplot()` 可以轻松绘制展示数据分布的小提琴图。
132 1
|
7月前
|
弹性计算 监控 安全
实测阿里云操作系统控制台:功能、诊断与优化
阿里云操作系统(AliOS)是阿里巴巴专为物联网和智能设备开发的操作系统,提供高效、安全、智能化的解决方案。本文介绍了如何开通和使用阿里云的云服务器ECS,包括注册、选择操作系统、创建用户及授权等步骤。通过控制台,用户可以实时监控设备状态、管理组件、进行性能诊断,并优化资源使用。掌握这些功能有助于提升系统管理和数据处理能力,满足物联网场景的多样化需求。建议进一步丰富系统健康指标和观测功能,以提供更好的用户体验。
446 24
|
弹性计算 API 云计算
使用LobeChat轻松打造私人智能聊天助手
阿里云计算巢提供了一键部署LobeChat的功能,无需下载代码或安装复杂依赖,通过简单几步即可搭建私人聊天助手,非常适合非技术人员。LobeChat是一款现代化设计的开源聊天应用,支持语音合成及多模态插件系统。部署前需确保已开通阿里云账号且余额充足。
使用LobeChat轻松打造私人智能聊天助手
|
搜索推荐 API 定位技术
解锁携程美食与景点数据接口:打造个性化旅行体验的秘密武器
携程API助您探索旅游信息,虽无专门“美食列表”接口,但可通过景点详情接口获取周边美食推荐。结合地图或餐饮API,丰富美食数据一手掌握。景点列表接口帮助搜索景点详情,包括名称、位置等。使用流程包括注册账号、获取密钥、构造请求及解析响应数据。记得查阅最新文档,确保合规使用。体验API:[链接]。
|
供应链 安全 算法
加密技术与区块链:守护数字世界的双重保障
加密技术和区块链携手打造数字安全。加密通过算法和密钥保护数据,区块链以其分布式、不可篡改的特性增强数据安全。两者结合,应用于数字签名、密钥对、哈希函数,保障信息传输与存储的安全。未来,它们将在物联网、供应链和金融等领域深化数据保护,促进数字经济创新。
|
存储 算法 测试技术
【STM32项目】基于Stm32c8t6-镭射激光打印机的设计(完整工程资料源码)(二)
【STM32项目】基于Stm32c8t6-镭射激光打印机的设计(完整工程资料源码)(二)
446 0
|
算法 量子技术 C#
量子编程入门:从基础到实践
【5月更文挑战第26天】本文引导读者入门量子编程,从量子比特、量子门和量子算法的基础概念,到量子编程语言和量子模拟器的工具介绍,再到编写、运行和调试量子程序的实践步骤。通过学习和实践,开发者可以逐渐掌握量子编程,为未来的量子计算应用打下基础。随着量子计算技术的发展,量子编程将在更多领域展现其潜力。