算法之旅:LeetCode 拓扑排序由简入繁完全攻略
前言
欢迎来到我的算法探索博客,在这里,我将通过解析精选的LeetCode题目,与您分享深刻的解题思路、多元化的解决方案以及宝贵的实战经验,旨在帮助每一位读者提升编程技能,领略算法之美。
👉更多高频有趣LeetCode算法题
拓扑排序是一种适用于 有向无环图(DAG) 的重要算法,常用于解决依赖关系问题,如课程安排、任务调度等。在本文中,我们将通过以下四道题目,详细讲解拓扑排序的原理、实现方式及其多样化应用场景:
1557. 可以到达所有点的最少点数目 | 207. 课程表 |
---|---|
210. 课程表 II | 802. 找到最终的安全状态 |
拓扑排序基础知识
核心思想:
拓扑排序旨在为图中的节点安排一种线性顺序,使得对每条有向边 (u, v),节点 u 总是排在 v 之前。
本节我们利用 入度表 + 广度优先搜索(BFS)
实现拓扑排序:
- 入度的概念
- 每个节点的 入度 是指有多少条边指向这个节点。
- 如果某个节点的入度为 0,说明它没有依赖,可以作为起点开始。
- 拓扑排序的原理
- 将所有入度为 0 的节点加入队列(表示这些节点可以直接开始,不需要经过任何依赖)。
- 从队列中逐一取出节点,将其所有出边的目标节点的入度减 1 (被引用次数-1)。
- 如果某个节点的入度变为 0,将其加入队列。
- 重复这一过程,直到队列为空。
- 如果完成所有节点的拓扑排序,说明图中无环;否则,说明存在环。
适用条件:
图必须是 有向无环图(DAG)。
若存在环,则无法构建拓扑排序。
常见实现方法:
- Kahn算法: 基于入度统计。逐步移除入度为 0 的节点,动态更新图结构。
- DFS(深度优先搜索): 通过后序遍历逆序输出结果。
实战:经典例题讲解
1557. 可以到达所有点的最少点数目
🪸题目描述
🪷核心思路
这是一个经典的入度问题,这题可以看作是 拓扑排序思想的局部应用
,利用入度信息
快速判断需要作为起点的节点。初具雏形。
若一个节点的入度为 0,则必须从它出发才能到达该节点。
因此,我们只需要找出所有入度为 0 的节点即可。
- 构建入度数组
for(List<Integer> a : edges){inDegree[a.get(1)]++;
}
- 遍历所有边,计算每个节点的入度 (即有多少条边指向该节点,被引用的次数) 。
- 结果存储在 inDegree 数组中,其中 inDegree[i] 表示节点 i 的入度。
- 找出入度为 0 的节点
for (int i = 0; i < n; i++) {if (inDegree[i] == 0) {res.add(i);}
}
- 遍历所有节点,检查哪些节点的入度为 0。
- 入度为 0 的节点没有任何依赖,它们必须作为路径的起点,加入结果列表 res。
- 返回结果
最终返回res
,即所有入度为 0 的节点构成的集合。
🌿代码实现
Java
class Solution {public List<Integer> findSmallestSetOfVertices(int n, List<List<Integer>> edges) {List<Integer> res = new ArrayList<>();int[] inDegree = new int[n];// 构建入度数组// 其中每个元素表示对应被依赖的次数,也就是 入度for(List<Integer> a : edges){inDegree[a.get(1)]++;}// 将所有入度为 0 的课程加入队列Queue<Integer> queue = new LinkedList<>();for (int i = 0; i < n; i++) {if (inDegree[i] == 0) {res.add(i);}}return res;}
}
Python
class Solution(object):def findSmallestSetOfVertices(self, n, edges):""":type n: int:type edges: List[List[int]]:rtype: List[int]"""# 初始化入度数组in_degree = [0] * n# 构建入度数组for edge in edges:in_degree[edge[1]] += 1# 找出所有入度为 0 的节点return [i for i in range(n) if in_degree[i] == 0]
C++
class Solution {
public:vector<int> findSmallestSetOfVertices(int n, vector<vector<int>>& edges) {// 初始化入度数组vector<int> inDegree(n, 0);// 构建入度数组for (const auto& edge : edges) {inDegree[edge[1]]++;}// 找出所有入度为 0 的节点vector<int> result;for (int i = 0; i < n; ++i) {if (inDegree[i] == 0) {result.push_back(i);}}return result;}
};
207. 课程表
🪸题目描述
🪷核心思路
这是一道经典的图是否有环的问题,可以通过 Kahn算法
或 DFS
判断环的存在。
利用 入度表 + 广度优先搜索(BFS)
实现拓扑排序。
比上一题多了一步的就是加了一个邻接表,目的就是把两个点的有向连接(图二)表示出来进行BFS遍历求得结果。
🌿代码实现
Java
class Solution {public boolean canFinish(int numCourses, int[][] prerequisites) {// 入度数组,表示每个课程被依赖的次数int[] inDegree = new int[numCourses];// 图的邻接表表示List<List<Integer>> adjacency = new ArrayList<>();for (int i = 0; i < numCourses; i++) {adjacency.add(new ArrayList<>());}// 构建图和入度数组for (int[] pair : prerequisites) {inDegree[pair[0]]++;// 每个课程(节点)都有一个列表,列表中存储的是所有依赖于该课程的其他课程(即该课程是其他课程的先修课程)adjacency.get(pair[1]).add(pair[0]);}// 将所有 入度为 0 的课程加入队列,表示这些课程可以直接学习,无需先修课程。Queue<Integer> queue = new LinkedList<>();for (int i = 0; i < numCourses; i++) {if (inDegree[i] == 0) {queue.offer(i);}}// BFS 遍历int count = 0; // 记录已完成的课程数量while (!queue.isEmpty()) {int course = queue.poll();count++;for (int nextCourse : adjacency.get(course)) {inDegree[nextCourse]--;// 添加接下来 入度为0 的元素if (inDegree[nextCourse] == 0) {queue.offer(nextCourse);}}}// 当 BFS 结束时,如果拓扑排序数组中的课程数小于总课程数,说明图中存在环,无法完成所有课程。这时,返回空数组 []return count == numCourses;}
}
Python
class Solution(object):def canFinish(self, numCourses, prerequisites):""":type numCourses: int:type prerequisites: List[List[int]]:rtype: bool"""# 入度数组,表示每个课程被依赖的次数in_degree = [0] * numCourses# 图的邻接表表示adjacency = [[] for _ in range(numCourses)]# 构建图和入度数组for pair in prerequisites:in_degree[pair[0]] += 1adjacency[pair[1]].append(pair[0])# 将所有 入度为 0 的课程加入队列,表示这些课程可以直接学习,无需先修课程。queue = []for i in range(numCourses):if in_degree[i] == 0:queue.append(i)# BFS 遍历count = 0 # 记录已完成的课程数量while queue:course = queue.pop(0)count += 1for next_course in adjacency[course]:in_degree[next_course] -= 1if in_degree[next_course] == 0:queue.append(next_course)# 如果拓扑排序中的课程数小于总课程数,说明存在环,无法完成所有课程return count == numCourses
C++
class Solution {
public:bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {// 入度数组,表示每个课程被依赖的次数vector<int> inDegree(numCourses, 0);// 图的邻接表表示vector<vector<int>> adjacency(numCourses);// 构建图和入度数组for (const auto& pair : prerequisites) {inDegree[pair[0]]++;adjacency[pair[1]].push_back(pair[0]);}// 将所有 入度为 0 的课程加入队列,表示这些课程可以直接学习,无需先修课程。queue<int> q;for (int i = 0; i < numCourses; ++i) {if (inDegree[i] == 0) {q.push(i);}}// BFS 遍历int count = 0; // 记录已完成的课程数量while (!q.empty()) {int course = q.front();q.pop();count++;for (int nextCourse : adjacency[course]) {inDegree[nextCourse]--;if (inDegree[nextCourse] == 0) {q.push(nextCourse);}}}// 如果拓扑排序中的课程数小于总课程数,说明存在环,无法完成所有课程return count == numCourses;}
};
210. 课程表 II
🪸题目描述
🪷核心思路
和 207. 课程表 类似,但需要输出一条合法的课程学习路径。我们可以直接基于拓扑排序构造学习路径。
🌿代码实现
Java
class Solution {public int[] findOrder(int numCourses, int[][] prerequisites) {// 入度数组,表示每个课程被依赖的次数int[] inDegree = new int[numCourses];// 图的邻接表表示List<List<Integer>> adjacency = new ArrayList<>();for (int i = 0; i < numCourses; i++) {adjacency.add(new ArrayList<>());}// 构建图和入度数组for (int[] pair : prerequisites) {inDegree[pair[0]]++;adjacency.get(pair[1]).add(pair[0]);}// 将所有入度为 0 的课程加入队列Queue<Integer> queue = new LinkedList<>();for (int i = 0; i < numCourses; i++) {if (inDegree[i] == 0) {queue.offer(i);}}// 保存课程学习顺序int[] order = new int[numCourses];int index = 0; // 指向 `order` 数组的位置// BFS 遍历while (!queue.isEmpty()) {int course = queue.poll();order[index++] = course; // 将课程加入学习顺序for (int nextCourse : adjacency.get(course)) {inDegree[nextCourse]--;if (inDegree[nextCourse] == 0) {queue.offer(nextCourse);}}}return index < numCourses ? new int[0] : order; // 返回课程学习顺序}
}
Python
class Solution(object):def findOrder(self, numCourses, prerequisites):""":type numCourses: int:type prerequisites: List[List[int]]:rtype: List[int]"""# 入度数组,表示每个课程被依赖的次数in_degree = [0] * numCourses# 图的邻接表表示adjacency = [[] for _ in range(numCourses)]# 构建图和入度数组for pair in prerequisites:in_degree[pair[0]] += 1adjacency[pair[1]].append(pair[0])# 将所有入度为 0 的课程加入队列queue = []for i in range(numCourses):if in_degree[i] == 0:queue.append(i)# 保存课程学习顺序order = []while queue:course = queue.pop(0)order.append(course)for next_course in adjacency[course]:in_degree[next_course] -= 1if in_degree[next_course] == 0:queue.append(next_course)# 如果拓扑排序未覆盖所有课程,返回空数组return order if len(order) == numCourses else []
C++
class Solution {
public:vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {// 入度数组,表示每个课程被依赖的次数vector<int> inDegree(numCourses, 0);// 图的邻接表表示vector<vector<int>> adjacency(numCourses);// 构建图和入度数组for (const auto& pair : prerequisites) {inDegree[pair[0]]++;adjacency[pair[1]].push_back(pair[0]);}// 将所有入度为 0 的课程加入队列queue<int> q;for (int i = 0; i < numCourses; ++i) {if (inDegree[i] == 0) {q.push(i);}}// 保存课程学习顺序vector<int> order;while (!q.empty()) {int course = q.front();q.pop();order.push_back(course);for (int nextCourse : adjacency[course]) {inDegree[nextCourse]--;if (inDegree[nextCourse] == 0) {q.push(nextCourse);}}}// 如果拓扑排序未覆盖所有课程,返回空数组return order.size() == numCourses ? order : vector<int>();}
};
802. 找到最终的安全状态
🪸题目描述
🪷核心思路
我们可以从反向图出发,寻找出度为 0 的节点(终点),并依次标记为安全。
为什么反向图能够帮助我们找到安全节点?
- 从安全节点开始反向查找:
- 安全节点是指没有环的节点,因此从这些节点出发无法到达其他节点,因此它们的反向图中入度为 0。
- 一旦节点的入度为 0,意味着没有节点依赖它,它是“安全”的。
- 拓扑排序的过程:
- 在反向图中,拓扑排序会找到所有的“无依赖”节点(即入度为 0 的节点),这些节点可以认为是安全的。
- 通过拓扑排序,如果某个节点进入队列并被处理,说明它没有环,并且在反向图中是可以到达终点的。
🌿代码实现
Java
class Solution {public List<Integer> eventualSafeNodes(int[][] graph) {// 反向图 + 拓扑排序int n = graph.length;List<List<Integer>> reverseGraph = new ArrayList<>();int[] inDegree = new int[n];for (int i = 0; i < n; i++) {reverseGraph.add(new ArrayList<>());}for (int i = 0; i < n; i++) {for (int next : graph[i]) {reverseGraph.get(next).add(i);inDegree[i]++;}}// 2. 将所有入度为 0 的节点加入队列(安全节点)Queue<Integer> queue = new LinkedList<>();for (int i = 0; i < n; i++) {if (inDegree[i] == 0) {queue.offer(i);}}// 3. 拓扑排序List<Integer> safeNodes = new ArrayList<>();while (!queue.isEmpty()) {int node = queue.poll();safeNodes.add(node);for (int prev : reverseGraph.get(node)) {// 如果当前节点是某个节点的依赖节点,减少它的入度inDegree[prev]--;if (inDegree[prev] == 0) {queue.offer(prev); // 如果该节点的入度为 0,说明它是安全节点}}}// 4. 返回所有安全节点(按升序排序)Collections.sort(safeNodes);return safeNodes;}
}
Python
class Solution(object):def eventualSafeNodes(self, graph):""":type graph: List[List[int]]:rtype: List[int]"""n = len(graph)reverseGraph = [[] for _ in range(n)]inDegree = [0] * n# 构建反向图并计算入度for i in range(n):for next_node in graph[i]:reverseGraph[next_node].append(i)inDegree[i] += 1# 将所有入度为 0 的节点加入队列queue = deque()for i in range(n):if inDegree[i] == 0:queue.append(i)# 拓扑排序safeNodes = []while queue:node = queue.popleft()safeNodes.append(node)for prev in reverseGraph[node]:inDegree[prev] -= 1if inDegree[prev] == 0:queue.append(prev)# 返回所有安全节点,按升序排序safeNodes.sort()return safeNodes
C++
class Solution {
public:vector<int> eventualSafeNodes(vector<vector<int>>& graph) {int n = graph.size();vector<vector<int>> reverseGraph(n);vector<int> inDegree(n, 0);// 构建反向图和计算每个节点的入度for (int i = 0; i < n; ++i) {for (int next : graph[i]) {reverseGraph[next].push_back(i); // 反向图inDegree[i]++; // 计算入度}}// 将所有入度为 0 的节点加入队列queue<int> q;for (int i = 0; i < n; ++i) {if (inDegree[i] == 0) {q.push(i);}}// 拓扑排序vector<int> safeNodes;while (!q.empty()) {int node = q.front();q.pop();safeNodes.push_back(node);for (int prev : reverseGraph[node]) {if (--inDegree[prev] == 0) {q.push(prev);}}}// 返回所有安全节点,按升序排序sort(safeNodes.begin(), safeNodes.end());return safeNodes;}
};
结语
通过这四道题,我们可以看到拓扑排序的强大应用:
- 解决 依赖问题,如课程安排(207, 210)。
- 处理 图中状态分类 的问题,如安全状态(802)。
- 分析 关键点或入度特性,如找到最小的起点集合(1557)。
拓扑排序不仅是一种算法,更是一种理解图结构的思维方式。在面试中,遇到类似依赖关系的题目,尝试从有向图的角度切入往往是一个很好的突破点。
如果您渴望探索更多精心挑选的高频LeetCode面试题,以及它们背后的巧妙解法,欢迎您访问我的博客,那里有我精心准备的一系列文章,旨在帮助技术爱好者们提升算法能力与编程技巧。
👉更多高频有趣LeetCode算法题
在我的博客中,每一篇文章都是我对算法世界的一次深入挖掘,不仅包含详尽的题目解析,还有我个人的心得体会、优化思路及实战经验分享。无论是准备面试还是追求技术成长,我相信这些内容都能为您提供宝贵的参考与启发。期待您的光临,让我们共同在技术之路上不断前行!
相关文章:
算法之旅:LeetCode 拓扑排序由简入繁完全攻略
前言 欢迎来到我的算法探索博客,在这里,我将通过解析精选的LeetCode题目,与您分享深刻的解题思路、多元化的解决方案以及宝贵的实战经验,旨在帮助每一位读者提升编程技能,领略算法之美。 👉更多高频有趣Lee…...
vue3项目中使用星火API
在node环境epxress中使用讯飞ai接口进行二次封装,通过ai对话回复提取,获得ai提取的文章摘要 本文章只是简单使用,更复杂功能比如调用星火API制作对话机器人可以查看文档,对于初次使用星火AI接口或许有帮助 讯飞星火大模型API-大模…...
蓝桥杯第 23 场 小白入门赛
一、前言 好久没打蓝桥杯官网上的比赛了,回来感受一下,这难度区分度还是挺大的 二、题目总览 三、具体题目 3.1 1. 三体时间【算法赛】 思路 额...签到题 我的代码 // Problem: 1. 三体时间【算法赛】 // Contest: Lanqiao - 第 23 场 小白入门赛 …...
Cause: java.sql.SQLException: No value specified for parameter 4
问题 执行更新sql时报错,异常栈如下 org.springframework.jdbc.BadSqlGrammarException: ### Error updating database. Cause: java.sql.SQLException: No value specified for parameter 4 ### The error may exist in com/my/mapper/MyMapper.java (best gue…...
第五课 Unity资源导入工作流效率优化(AssetGraph工具)
上期我们学习了简单的animation动画的优化,接下来我们继续资源导入效率的优化 工程目录 首先我们来学习一下工程目录结构及用途 Asset文件夹:用来储存和重用的项目资产 Library文件夹:用来储存项目内部资产数据信息的目录 Packages文件夹…...
create-vue创建vue3项目
create-vue是Vue官方新的脚手架工具 前提条件: 已安装16.0或更高版本的Node.js (node -v查看) 创建一个Vue应用 npm init vuelatest 这一指令会帮我们安装并执行create-vue cd vue-project npm install —— 安装依赖 npm run dev...
27 基于51单片机的方向盘模拟系统
目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52单片机,采用两个MPX4115压力传感器作为两路压力到位开关电路, 采用滑动变阻器连接数模转换器模拟重力加速度传感器电路; 一个按键控制LED灯的点亮与…...
HarmonyOS
UIAbility UIAbility 组件是一种包含UI的应用组件,主要用于和用户交互 设计理念:原生支持应用组件的跨端迁移和多端协同、支持多设备和多窗口的形态 UIAbility组件是系统调度的基本单位,为应用提供绘制界面的窗口。 /** 为使应用能够正常使用…...
字符串处理(二)
第1题 篮球比赛 查看测评数据信息 学校举行篮球比赛,请设计一个计分系统统计KIN、WIN两队分数,并输出分数和结果! 如果平分就输出‘GOOD’,否则输出获胜队名! 输入格式 输入数据共n1行, 第1行n…...
达梦数据库文件故障的恢复方法
目录 1、概述 1.1 概述 1.2 环境介绍 2、使用备份集的恢复方法 2.1 实验准备 2.2 误删除“用户表空间数据文件” 2.3 误删除SYSTEM.DBF 2.4 误删除ROLL.DBF 2.5 REDO日志文件 3、无备份集的恢复方法 3.1 误删除“表空间数据文件” 3.2误删除控制文件 3.3 误删除RO…...
Redis(5):哨兵
一、作用和架构 1. 作用 在介绍哨兵之前,首先从宏观角度回顾一下Redis实现高可用相关的技术。它们包括:持久化、复制、哨兵和集群,其主要作用和解决的问题是: 1)持久化:持久化是最简单的高可用方法(有时甚…...
准确--在 AlmaLinux 9.2 上快速搭建 FTP 服务器
FTP 服务器配置与验证完整步骤 以下内容是针对在 192.168.6.101 配置 FTP 服务器,端口为 59999 的完整详细操作步骤,包括配置与验证。每个步骤都附有详细注释。 配置 FTP 服务器 1. 安装 vsftpd 根据系统类型,执行以下命令安装 FTP 服务&a…...
Monitor 显示器软件开发设计入门二
基础篇--显示驱动方案输出接口介绍 写在前面:首先申明,这篇文章是写给那些初入显示器软件行业的入门者,或是对显示器没有基本知识的小白人员。如您是行业大咖大神,可以绕行,可看后期进阶文章。 上篇介绍了输入接口及相…...
MySQL 数据库学习教程一:开启数据库探索之旅
在当今数字化时代,数据已然成为企业和组织最为宝贵的资产之一。而数据库管理系统则是存储、管理和操作这些数据的核心工具。MySQL 作为一款广泛应用的开源关系型数据库管理系统,以其可靠性、高性能和易用性而备受青睐。如果你渴望踏入数据库领域…...
课程答疑微信小程序设计与实现
私信我获取源码和万字论文,制作不易,感谢点赞支持。 课程答疑微信小程序设计与实现 摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了课程答疑微信小程序设计与实现的开发全过程。通过分析…...
基于yolov8、yolov5的铝材缺陷检测识别系统(含UI界面、训练好的模型、Python代码、数据集)
摘要:铝材缺陷检测在现代工业生产和质量管理中具有重要意义,不仅能帮助企业实时监控铝材质量,还为智能化生产系统提供了可靠的数据支撑。本文介绍了一款基于YOLOv8、YOLOv5等深度学习框架的铝材缺陷检测模型,该模型使用了大量包含…...
docker 僵尸进程问题
docker僵尸进程 子进程结束后,父进程没有回收该进程资源(父进程可能没有wait),子进程残留资源存放与内核中,就变为僵尸进程(zombie) 场景分析:python脚本A中执行B应用,将A部署在docker中&#…...
Web 毕设篇-适合小白、初级入门练手的 Spring Boot Web 毕业设计项目:电影院后台管理系统(前后端源码 + 数据库 sql 脚本)
🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 项目介绍 2.0 用户登录功能 3.0 用户管理功能 4.0 影院管理功能 5.0 电影管理功能 6.0 影厅管理功能 7.0 电影排片管理功能 8.0 用户评论管理功能 9.0 用户购票功…...
webpack5 的五大核心配置(二)
webpack主要构成部分: entry 入口output 出口loaders 转化器plugins 插件mode 模式devServer 开发服务器 webpack.config.js 配置文件基本格式 module.exports{//入口文件entry:{},//出口文件output:{},//module rules loadersmodule{};//插件plugins:[],//开发…...
Python语法基础(四)
🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” 高阶函数之map 高阶函数就是说,A函数作为B函数的参数,B函数就是高阶函数 map:映射 map(func,iterable) 这个是map的基本语法,…...
UnityShader——初级篇之开始Unity Shader学习之旅
开始Unity Shader学习之旅 一个最简单的顶点/片元着色器顶点/片元着色器的基本结构模型数据从哪里来顶点着色器和片元着色器之间如何通信如何使用属性 强大的援手:Unity 提供的内置文件和变量内置的包含文件内置的变量 Unity 提供的 Cg/HLSL 语义什么是语义Unity 支…...
Burp入门(6)-自动化漏洞测试理论
声明:学习视频来自b站up主 泷羽sec,如涉及侵权马上删除文章 声明:本文主要用作技术分享,所有内容仅供参考。任何使用或依赖于本文信息所造成的法律后果均与本人无关。请读者自行判断风险,并遵循相关法律法规。 感谢泷…...
【git】git 客户端设置本地缓冲区大小
文章目录 1. 报错2. 解决:增加本地缓冲区 1. 报错 git -c core.quotepathfalse -c log.showSignaturefalse push --progress --porcelain origin refs/heads/master:master Enumerating objects: 17, done. Counting objects: 5% (1/17) Counting objects: 11% …...
Xcode——LLDB Debugger 与断点调试学习
Xcode——LLDB Debugger 与断点调试学习 文章目录 Xcode——LLDB Debugger 与断点调试学习前言介绍打开LLDB命令helpprintexpression 断点调试异常断点——Exception Breakpoint标志断点——Symbolic Breakpointwatchpointset 断点行为condition条件判断 最后参考文章 前言 在…...
linux安全管理-系统环境安全
1 历史命令设置 1、检查内容 检查操作系统的历史命令设置。 2、配置要求 建议操作系统的历史命令设置。 3、配置方法 编辑/etc/profile 文件,配置保留历史命令的条数 HISTSIZE 和保留历史命令的记录文件大小 HISTFILESIZE,这两个都设置为 5。 配置方法如…...
【Maven】依赖冲突如何解决?
准备工作 1、创建一个空工程 maven_dependency_conflict_demo,在 maven_dependency_conflict_demo 创建不同的 Maven 工程模块,用于演示本文的一些点。 什么是依赖冲突? 当引入同一个依赖的多个不同版本时,就会发生依赖冲突。…...
学习视频超分辨率扩散模型中的空间适应和时间相干性(原文翻译)
文章目录 摘要1. Introduction2. Related Work3. Our Approach3.1. Video Upscaler3.2. Spatial Feature Adaptation Module3.3. Temporal Feature Alignment Module3.4. Video Refiner3.5. Training Strategy 4. Experiments4.1. Experimental Settings4.2. Comparisons with …...
MFC工控项目实例三十四模拟量实时监控数字显示效果
点击监控按钮,对选中模拟量用数字显示效果实时显示数值。 SenSet.cpp中相关代码 UINT m_nCounterID_1[6] { IDC_STATIC0,IDC_STATIC1,IDC_STATIC2,IDC_STATIC3,IDC_STATIC4,IDC_STATIC5,};UINT m_nCounterID_2[7] { IDC_STATIC7,IDC_STATIC8,IDC_STATIC9,IDC_S…...
Z2400032基于Java+Mysql+SSM的校园在线点餐系统的设计与实现 代码 论文
在线点餐系统 1.项目描述2. 技术栈3. 项目结构后端前端 4. 功能模块5. 项目实现步骤注意事项 6.界面展示7.源码获取 1.项目描述 本项目旨在开发一个校园在线点餐系统,通过前后端分离的方式,为在校学生提供便捷的餐厅点餐服务,同时方便餐厅和…...
Linux Deploy安装Debian桌面
下载安装Linux Deploy 下载地址 https://github.com/lateautumn233/Linuxdeploy-Pro/releases/download/3.1.0/app-debug.apk 配置 发行版本:Debian架构:arm64发行版版本:bookworm源地址:http://mirrors.aliyun.com/debian/安装…...
C语言数据相关知识:静态数据、越界与溢出
1、静态数组 在 C 语言中,数组一旦被定义后,占用的内存空间就是固定的,容量就是不可改变的,既不能在任何位置插入元素,也不能在任何位置删除元素,只能读取和修改元素,我们将这样的数组称为静态…...
纯Go语言开发人脸检测、瞳孔/眼睛定位与面部特征检测插件-助力GoFly快速开发框架
前言 开发纯go插件的原因是因为目前 Go 生态系统中几乎所有现有的人脸检测解决方案都是纯粹绑定到一些 C/C 库,如 OpenCV 或 dlib,但通过 cgo 调用 C 程序会引入巨大的延迟,并在性能方面产生显著的权衡。…...
华为ACL应用笔记
1、基本ACL 2000-2999 基本ACL(Access Control List,访问控制列表)是一种网络安全技术,它根据源IP地址、分片信息和生效时间段等信息来定义规则,对报文进行过滤。 规则: ACL由一系列规则组成,每…...
Axios:现代JavaScript HTTP客户端
在当今的Web开发中,与后端服务进行数据交换是必不可少的。Axios是一个基于Promise的HTTP客户端,用于浏览器和node.js,它提供了一个简单的API来执行HTTP请求。本文将介绍Axios的基本概念、优势、安装方法、基本用法以及如何使用Axios下载文件。…...
Qml-TabBar类使用
Qml-TabBar类使用 TabBar的概述 TabBar继承于Container 由TabButton进行填充,可以与提供currentIndex属性的任何容器或布局控件一起使用,如StackLayout 或 SwipeView;contentHeight : real:TabBar的内容高度,用于计算标签栏的隐…...
qt QGraphicsEllipseItem详解
1、概述 QGraphicsEllipseItem是Qt框架中QGraphicsItem的一个子类,它提供了一个可以添加到QGraphicsScene中的椭圆项。QGraphicsEllipseItem表示一个带有填充和轮廓的椭圆,也可以用于表示椭圆段(通过startAngle()和spanAngle()方法ÿ…...
单链表---移除链表元素
对于无头单向不循环链表,给出头结点head与数值val,删除链表中数据值val的所有结点 #define ListNodeDataType val struct ListNode { struct ListNode* psll;ListNodeDataType val; } 方法一---遍历删除 移除所有数值为val的链表结点,…...
Kafka知识体系
一、认识Kafka 1. kafka适用场景 消息系统:kafka不仅具备传统的系统解耦、流量削峰、缓冲、异步通信、可扩展性、可恢复性等功能,还有其他消息系统难以实现的消息顺序消费及消息回溯功能。 存储系统:kafka把消息持久化到磁盘上,…...
Micopython与旋转按钮(Encoder)
一、 encoder.py文件 CLK pin attached to GPIO12DT pin attached to GPIO13GND pin attached to GND 旋转编码器s1->CLK s2->DTimport time from rotary_irq_esp import RotaryIRQ r = RotaryIRQ(pin_num_clk=12, #clk引脚 pin_num_dt=13, #dat…...
联想Lenovo SR650服务器硬件监控指标解读
随着企业IT架构的复杂性和业务需求的增长,服务器的稳定运行变得至关重要。联想Lenovo SR650服务器以其高性能和稳定性,在各类应用场景中发挥着关键作用。为了保障服务器的稳定运行,监控易作为一款专业的IT基础设施监控软件,为联想…...
RAG数据拆分之PDF
引言RAG数据简介PDF解析方法及工具代码实现总结 二、正文内容 引言 本文将介绍如何将RAG数据拆分至PDF格式,并探讨PDF解析的方法和工具,最后提供代码示例。 RAG数据简介 RAG(关系型属性图)是一种用于表示实体及其关系的图数据…...
基于STM32的传感器数据采集系统设计:Qt、RS485、Modbus Rtu协议(代码示例)
一、项目概述 项目目标与用途 本项目旨在设计并实现一个基于STM32F103RCT6微控制器的传感器数据采集系统。该系统通过多个传感器实时监测环境参数,并将采集到的数据传输至上位机进行处理和分析。系统的主要应用领域包括环境监测、工业控制、智能家居等。通过该系统…...
【计网不挂科】计算机网络——<34道经典简述题>特训
前言 大家好吖,欢迎来到 YY 滴计算机网络 系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 本博客主要内容,收纳了一部门基本的计算机网络题目,供yy应对期中考试复习。大家可以参考 本章为分章节的习题内容题库&#x…...
Spring Web开发(请求)获取JOSN对象| 获取数据(Header)
大家好,我叫小帅今天我们来继续Spring Boot的内容。 文章目录 1. 获取JSON对象2. 获取URL中参数PathVariable3.上传⽂件RequestPart3. 获取Cookie/Session3.1 获取和设置Cookie3.1.1传统获取Cookie3.1.2简洁获取Cookie 3. 2 获取和存储Session3.2.1获取Session&…...
算法训练营day22(二叉树08:二叉搜索树的最近公共祖先,插入,删除)
第六章 二叉树part08 今日内容: ● 235. 二叉搜索树的最近公共祖先 ● 701.二叉搜索树中的插入操作 ● 450.删除二叉搜索树中的节点 详细布置 235. 二叉搜索树的最近公共祖先 相对于 二叉树的最近公共祖先 本题就简单一些了,因为 可以利用二叉搜索树的…...
【论文阅读】 Learning to Upsample by Learning to Sample
论文结构目录 一、之前的上采样器二、DySample概述三、不同上采样器比较四、整体架构五、设计过程(1)初步设计(2)第一次修改(3)第二次修改(4)第三次修改 六、DySample四种变体七、复…...
Android 图形系统之五:Gralloc
Gralloc (Graphics Allocator) 是 Android 系统中的关键组件之一,用于管理图形缓冲区的分配、映射以及处理。在 Android 的图形架构中,Gralloc 充当了 HAL (Hardware Abstraction Layer) 的一部分,为系统和硬件提供了通用的接口,使…...
【大数据学习 | Spark调优篇】Spark之内存调优
1. 内存的花费 1)每个Java对象,都有一个对象头,会占用16个字节,主要是包括了一些对象的元信息,比如指向它的类的指针。如果一个对象本身很小,比如就包括了一个int类型的field,那么它的对象头实…...
Spring Data JPA(一) 基础入门
Spring Data JPA(一) 基础入门 JPA 的全称是 Java Persistence API , 即 Java 持久层 API。Spring Data JPA 是 Spring 生态中提出的一套数据库 ORM (对象关系映射)规范、抽象标准,或者说它是对ORM框架实现的顶层抽象…...
Flutter | 基于函数式编程的通用单选列表设计
背景 项目中多次用到如下图的通用单选列表页: 常规封装 此列表需要三样东西: 标题数组当前选中项的 index点击 cell 的回调 封装大体如下: import package:flutter/material.dart;class ListPage1 extends StatefulWidget {const ListPa…...