【重点】【拓扑排序】207.课程表|210.课程表II

C++基础数据结构 | 图(Graph) C++基础数据结构 | 图(Graph) 最小生成树MST 总结 时间复杂度 Kruscal克鲁斯卡尔算法 并查集模版,边edges记录并排序,通过排序控制前后顺序,逐个边进行并查集,如果边的两端父节点不一样,那就合并 if(dsu.find(cur[0])==dsu.find(cur[1]))continue;用共同父节点剪枝 ElogV Prim普里姆算法 稀疏图E<V 顶点Vertex. 阅读详情

207.课程表

其实就是『有向图里找环』。
题目
参考链接

Python

207
入度+邻接矩阵!!!
在这里插入图片描述

class Solution:
    def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
        indegree = [0] * numCourses
        adjacency = [[] for _ in range(numCourses)]
        for tmp in prerequisites:
            indegree[tmp[0]] += 1
            adjacency[tmp[1]].append(tmp[0])

        queue = collections.deque()
        for i in range(numCourses):
            if indegree[i] == 0:
                queue.append(i)
        visited = 0
        while queue:
            curNode = queue.popleft()
            visited += 1
            for endNode in adjacency[curNode]:
                indegree[endNode] -= 1
                if indegree[endNode] == 0:
                    queue.append(endNode)
        
        return visited == numCourses

210
题目

class Solution:
    def findOrder(self, numCourses: int, prerequisites: List[List[int]]) -> List[int]:
        res = list()
        q = collections.deque()
        indegrees = [0] * numCourses
        adajcency = [[] for _ in range(numCourses)]
        for tmp_array in prerequisites:
            indegrees[tmp_array[0]] += 1
            adajcency[tmp_array[1]].append(tmp_array[0])
        
        for i in range(numCourses):
            if indegrees[i] == 0:
                q.append(i)

        while q:
            top = q.popleft()
            res.append(top)
            for tmp in adajcency[top]:
                indegrees[tmp] -= 1
                if indegrees[tmp] == 0:
                    q.append(tmp)
        
        return res if len(res) == numCourses else []

Java

法1:DFS

很容易理解的方法!
在这里插入图片描述
在这里插入图片描述

class Solution {
    public boolean canFinish(int numCourses, int[][] prerequisites) {
        int[] flags = new int[numCourses];
        List<List<Integer>> adjacency = new ArrayList<>();
        for (int i = 0; i < numCourses; ++i) {
            adjacency.add(new ArrayList<>());
        }
        for (int[] array : prerequisites) {
            adjacency.get(array[1]).add(array[0]);
        }
        for (int i = 0; i < numCourses; ++i) {
            if (!dfs(adjacency, flags, i)) {
                return false;
            }
        }

        return true;
    }
 
    // 无环图 => true; 有环图 => false
    public boolean dfs(List<List<Integer>> adjacency, int[] flags, int index) {
        if (flags[index] == 1) {
            return false;
        } else if (flags[index] == -1) {
            return true;
        }
        flags[index] = 1;
        for (int nextInx : adjacency.get(index)) {
            if (!dfs(adjacency, flags, nextInx)) {
                return false;
            }
        }
        flags[index] = -1;

        return true;
    }
}

法2:入度表(BFS)

复习入度和出度的概念!

class Solution {
    public boolean canFinish(int numCourses, int[][] prerequisites) {
        int visited = 0;
        int[] indegrees = new int[numCourses];
        Queue<Integer> queue = new LinkedList<>();
        List<List<Integer>> adjacency = new ArrayList<>();
        for (int i = 0; i < numCourses; ++i) {
            adjacency.add(new ArrayList<>());
        }
        for (int[] array : prerequisites) {
            ++indegrees[array[0]];
            adjacency.get(array[1]).add(array[0]);
        }
        for (int i = 0; i < numCourses; ++i) {
            if (indegrees[i] == 0) {
                queue.offer(i);
            }
        }
        while (!queue.isEmpty()) {
            int topInx = queue.poll();
            ++visited;
            for (int k : adjacency.get(topInx)) {
                --indegrees[k];
                if (indegrees[k] == 0) {
                    queue.offer(k);
                }
            }
        }

        return visited == numCourses;
    }
}

210.课程表II

题目

法1:入度表(BFS)

BFS更简单实现!!!

class Solution {
    public int[] findOrder(int numCourses, int[][] prerequisites) {
        List<Integer> res = new ArrayList<>();
        Queue<Integer> queue = new LinkedList<>();
        int[] indegrees = new int[numCourses];
        List<List<Integer>> adjacency = new ArrayList<>();
        for (int i = 0; i < numCourses; ++i) {
            adjacency.add(new ArrayList<>());
        }
        for (int[] arr : prerequisites) {
            ++indegrees[arr[0]];
            adjacency.get(arr[1]).add(arr[0]);
        }
        for (int i = 0; i < numCourses; ++i) {
            if (indegrees[i] == 0) {
                queue.offer(i);
            }
        }

        while (!queue.isEmpty()) {
            int topInx = queue.poll();
            res.add(topInx);
            for (int k : adjacency.get(topInx)) {
                --indegrees[k];
                if (indegrees[k] == 0) {
                    queue.offer(k);
                }
            }
        }
        
        if (res.size() == numCourses) {
            int[] resArray = new int[numCourses];
            for (int i = 0; i < res.size(); ++i) {
                resArray[i] = res.get(i);
            }

            return resArray;
        }

        return new int[0];
    }
}
SMETANA 安装使用教程 关于SMETANA的安装和简单使用信息 阅读详情

相关推荐

记一次springboot集成海康威视SDK过程

一开始没有接触过物联网这块,走了很多弯路,后面还是自己一点点摸索出来的。有个项目,需要对海康的门禁设备进行集成,后台统一管理设备,进行设备人脸数据的下发、删除等操作。3.我还接入了门禁设备的事件监听,门禁所有的事件都会上报到后台服务,这块代码有需要的可以找我。在linux系统中,sdk我使用的是绝对路径,把Linux版本的文件放到服务时,Acs文件夹下的 各个Manage都有现成的代码,可以根据自己的需要调用即可。路径也不要有中文,切记!2.sdk的存放路径不要有中文,不然会出现很多奇怪的问题。

huang_xiaoen的博客 2348

leetcode 210 课程表II

leetcode 210 课程表II

大草的博客 304

二维“能量源”(电场、磁场、功率)入射边界设置方法

comsol光学仿真设计相关学习笔记和经验 1. 二维“能量源”(电场、磁场、功率)入射边界设置方法 2.边界条件设置薄膜材料

VJCP_90909Bu0的博客 5192

LeetCode 210 课程表II

题目 现在你总共有 n 门课需要选,记为 0 到 n-1。在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1]给定课程总量以及它们的先决条件,返回你为了学完所有课程所安排的学习顺序。可能会有多个正确的顺序,你只要返回一种就可以了。如果不可能完成所有课程,返回一个空数组。 示例 1: 输入: 2, [[1,0]] 输出: [0,1] 解释: 总共有 2 门课程。要学习课程 1,你需要先完成课程 0。因此,正确的课程顺序为 [0,1]

gbh18682030862的博客 176

脑机接口(BCI)从原理到开发实战 10|脑控外设:用脑电波控制机械臂/游戏

摘要: 脑机接口(BCI)的“最后一公里”是将分类结果转化为实际动作的关键环节。本文介绍如何通过指令映射、硬件通信和执行反馈实现脑控外设,包括离散/连续控制策略、防抖处理及串口/蓝牙通信方法。通过两个实战案例(运动想象控制机械臂抓取、P300/SSVEP控制游戏)和完整项目(OpenBCI控制小车),演示了从分类标签到设备动作的完整流程,重点涵盖指令生成算法(多数投票)、Python与Arduino的串口通信集成,为BCI系统落地提供实用解决方案。(149字)

小明的博客 765

Spirent TestCenter 3.90吞吐测试全流程详解(附RFC 2544配置避坑指南)

本文详细解析了使用Spirent TestCenter 3.90进行网络吞吐测试的全流程,并提供了符合RFC 2544标准的配置指南与避坑要点。内容涵盖测试环境搭建、核心概念澄清、STC软件配置步骤、结果深度解读以及自动化脚本入门,旨在帮助网络测试工程师精准评估设备性能,规避常见配置陷阱。

weixin_42602368的博客 370

拓扑排序(Topological Sort)

问题引入 现实生活中我们遇到的要处理的事情可能要讲究先后顺序,比如说要先穿好衬衫才能穿外套,再比如说一个计算机系的学生想修完所有课程: 面对这样一张图,如何求出做事的顺序?这时需要拓扑排序: 将事件视为点,先后关系视为边,则可以把“先做事件2,再做事件1”抽象成:2→1,同理可将上面的课表变成一副有向图: 拓扑排序算法 拓扑排序就是通过以上这种有向图来获知这一系列事情的先后顺序。算法的主要步骤有: 首先找一个入度为零的点(入度为零表示没有点指向该点,说明做该点代表的事没有前提,找不到说明该图是一个环

ZergWang's Blog 1541

密码学:一文看懂Base64算法

Base64常常在我们开发中出现,我们可能只知道它是一串乱码(看不懂的符号),知道有时候知道我们需要把一些数据进行base64编码,有时候需要进行Base64解码。但是却不知道它的作用是什么?它存在的意义是什么?还有它是如何生成的?如何编码和解码?上述的疑问相信在你读完本篇文章之后烟消云散。下面开始正文。Base64是什么?它和加密解密操作有什么关系吗?没错,这就是经过Base64编码后的字符串。对它解码后,我们获得以下内容点个关注,是对我持续创作的最大的鼓励!

Shujie 1万+

LeetCode[210]课程表II

LeetCode[210]课程表II 有思路,有源码,有讲解

月亮被咬碎成星星的博客 331

利用正射影像对斜射图像进行反向投影

因此,RANSAC算法可以通过计算inliners和outliers的数量来评估估计关键点的质量,确保与其他点不一致的点不会在Homography矩阵中被估计。然后,它通过考虑关键点周围区域中图像的梯度大小和方向来计算每个提取的关键点的方向。由于单应性矩阵的计算可能会受到两个图像中异常值的存在的影响,这将导致矩阵的不正确估计并导致沿图像的对准和映射不良。FLANN匹配器的方法基于K近邻搜索的概念,即从图像中找到k个近邻。找到相机在正射影像坐标系中的位置并在正射影像上绘制重叠区域的边界框。

gis收藏家的博客 1511

基于STM32与FPGA的数据采集系统的设计与实现

数据采集系统在现代工程中起着至关重要的作用,用于实时获取和处理各种传感器或外部设备的数据。在本文中,我们将探讨如何基于STM32微控制器和FPGA(现场可编程门阵列)实现一个高效的数据采集系统。我们可以使用STM32的UART、SPI或I2C接口与各种传感器或外部设备进行通信,并通过GPIO口实现控制功能。在硬件连接完成后,我们可以通过STM32控制FPGA的配置和数据传输。STM32作为主控单元负责与外部设备进行通信和数据处理,而FPGA则用于高速数据采集和实时处理。具体的通信协议取决于连接的设备类型。

UbiSqlserver的博客 1797

环检测、拓扑排序、并查集

环检测的重点就是遍历图,检测到环则返回。BFS:更直观地处理入度关系,适合判断是否存在拓扑排序。DFS:更适合需要记录路径或回溯的场景。

qq_46310423的博客 1053

【硬件的单元测试 UT 3】PCIe 3.0及信号完整性测试方法

PCIe标准自从推出以来,1代和2代标准已经在PC和Server上逐渐普及,用于满足高速显卡、高速存储设备对于高速数据传输的要求。出于支持更高总线数据吞吐率的目的,PCI-SIG组织在2010年制定了PCIe 3.0,即PCIe 3代的规范,数据速率达到8Gbps。

qq_43416206的博客 1412

解决拓扑排序

拓扑排序(Topological Sorting)是对有向无环图(DAG, Directed Acyclic Graph) 顶点的一种排序方式,核心是让图中任意一条有向边对应的 “前驱顶点” 始终排在 “后继顶点” 之前,最终得到一个满足所有边的方向约束的顶点序列。它不是唯一的 —— 一个 DAG 可能存在多个合法的拓扑序列。入度:有多少边指向我,作用是判断顶点是否具备开始条件,入度 = 0:无任何前置边,是 “无依赖的起点”(如拓扑排序的初始节点、项目中的 “启动任务”)

关注学习C++领域,感谢陪伴,共同进步! 460

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【优选算法篇】拓扑排序——逻辑先后与任务依赖的终极拆解

摘要:拓扑排序的逻辑枷锁与解法 本文探讨拓扑排序在依赖关系中的应用,通过两个经典问题展示其核心逻辑: 课程表问题:将课程建模为有向图节点,依赖关系为边。通过BFS统计入度并逐步解除依赖,判断是否存在可行学习路径或返回具体顺序。若处理节点数不足总数,则存在环。 火星词典问题:通过比较相邻单词的首个差异字符建立字母顺序依赖。需处理非法前缀情况,最终通过拓扑排序推导字母顺序,若结果长度不足则说明存在环。 关键点在于:将实际问题转化为有向无环图,通过入度统计和BFS逐步解除依赖,既解决顺序问题又能检测逻辑死锁(环)

半截诗的博客~ 675

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【Leetcode】图算法总结

Leetcode中图的算法是比较常见的类型,比如无向图的单源最短路径,有向图的单源最短路径,多源最短路径等问题,下面就对图的算法进行总结。

小朱小朱绝不认输的博客 2201

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

算法题目---BFS解决拓扑排序

关于“拓扑排序”,主要看图片中的内容来理解。

2403_89229523的博客 215

算法C++ 面试常考拓扑排序理解 面试复习用(第四章)

文章目录造轮子博客链接参考博文闲聊拓扑排序的理解思路分析 代码如何输出拓扑序拓扑排序有关的题目 实践出真知 造轮子博客链接 算法第四版C++算法实现全集 参考博文 一文七图搞懂面试常考算法「拓扑排序」 作者:码农田小齐 闲聊 我对于一些我实在看不下去的东西 有的时候也忘记了 感觉不是很重要的话 我就会去网上搜索 这个东西面试会不会考察 发现要考察的时候 还是觉得要写一篇博客 来记录一下 因为毕竟我对于我不是很想看的东西的话 我的理解相对来说就没有那么好 写一篇总比没写好 拓扑排序的理解 图分为无向

Love 6's Private Blog 524

拓扑排序(Java)

1.代码拓扑排序可以判断是否有环并查集可以判断无向图是否有环先建图,度为0的节点直接入队列,处理队列中的节点,更新邻居节点的度,度 - -;且count++;最后比较count(count是 总共进入队列中的节点个数)和 n的值,若count==n 说明是有向无环图,否则就是出现count<n的情况也就是有向有环图。(为什么count<n呢?因为成环的那几个节点你指我我指你,度不可能为0,就没办法入队列)。

2502_92963723的博客 193

拓扑排序(leetcode 207、210)

拓扑排序 有向无环图 有向无环图:无环的有向图,简称DAG(Directed Acycline Graph)。 有向无环图的应用 有向无环图常用来描述一个工程或系统的进行过程(通常把计划、施工、生产、程序流程等当成一个工程)。 一个工程可以分为若干个子工程,只要完成了这些子工程(活动),就可以使得整个工程完成。 有向无环图分为两种表示方法,AOV网与AOE网。 AOV网 (拓扑排序) 用一个有向图表示一个工程的各个工程及其互相制约关系,其中顶点表示活动,弧表示活动之间的优先制约关系,称这种有向图为顶点表示活

马金波 709

图、图的遍历及图的拓扑排序

图、图的遍历及图的拓扑排序

qq_46118239的博客 532

【chap12-图论(P1-6深搜&广搜、P21拓扑排序)】用Python3刷《代码随想录》

1、深度优先搜索(所有可达路径)、广度优先搜索; 2、岛屿系列:岛屿数量; 3、拓扑排序:课程表

qq_43629945的博客 417

PT-Plugin-Plus 安装配置完整指南:手把手本地构建并加载进浏览器

在 PT 站刷完种子列表,还得挨个点开页面把下载链接拷进 Transmission?装上 **PT-Plugin-Plus**(PT 助手 Plus,一个能把种子一键发送到下载服务器的浏览器插件)之后,这些手动活就省了。这篇指南带你从源码把它构建出来,并装进浏览器。 ## 环境自检清单 项目用 TypeScript 编写,界面基于 Vue,打包靠 Webpack(把代码打捆成可运行产物的构建工

gitblog_01008的博客 709

2023年10月力扣算法和数据结构学习日志

2023年1月决定将力扣作为自己学习算法和数据结构的长期平台。9月20日左右,决定记录下来自己解决力扣编程题的过程(多半是山路十八弯、秃头、白了少年头的过程,菜菜菜!!!这份学习日志争取做到以下三点(以上,完毕。

m0_62243101的博客 939

Python 列表初始化避坑指南:`[[] for _ in range(n)]` 与 `[[]] * n` 的区别详解

在 LeetCode 课程表问题中,我们经常需要初始化一个邻接表。但同样是创建 n 个空列表,不同的写法可能导致天壤之别。本文将深入剖析两种写法的底层原理,帮你彻底避开这个 Python 入门经典陷阱。

Luna_cdzrbxpy的博客 302

Hot100图论算法解析与面试应用

图论是计算机科学中研究图结构及其性质的重要分支,其核心算法包括DFS/BFS遍历、最短路径、拓扑排序等。这些算法通过节点和边的抽象模型,能有效解决社交网络分析、路径规划等实际问题。在工程实践中,Dijkstra算法优化物流配送,拓扑排序处理任务调度依赖关系。LeetCode Hot100题库精选的图论题目,如岛屿数量(DFS应用)、网络延迟时间(最短路径)等,既涵盖基础算法实现,又考察问题建模能力。掌握邻接表/矩阵的选择、避免递归爆栈等技巧,对通过技术面试至关重要。

weixin_31292729的博客 300
上一篇: 【重点】【BFS】994.腐烂的橘子
下一篇: 【重点】【前缀树|字典树】208.实现Trie(前缀树)
Allenlzcoder
博客等级 码龄10年 925粉丝 512原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值