当前位置: 首页 > news >正文

动态规划算法的欢乐密码(一):斐波那契数模型

专栏:算法的魔法世界

个人主页:手握风云

目录

一、动态规划

二、例题讲解

2.1. 第 N 个泰波那契数

2.2. 三步问题

2.3. 使用最小花费爬楼梯

2.4. 解码方法


一、动态规划

        动态规划是一种将复杂问题分解为更小的子问题,并利用子问题的解来构建原问题的解的方法。它主要用于解决具有重叠子问题最优子结构特性的问题,通过存储子问题的解(避免重复计算)来提高效率。

        动态规划的解题思路通常可以分为以下几个步骤:(1)定义状态表示;(2)推导状态转移方程;(3)初始化和边界条件;(4)填表顺序;(5)返回值

二、例题讲解

2.1. 第 N 个泰波那契数

        本题可以看作是斐波那契数的加强版,并且首项是从第0项开始计算的。我们先来创建一个一位数组dp[],这个dp表里面的值就是我们的状态表示。题目要求我们求出第N个泰波那契数,那么dp[i]就表示第i个泰波那契数。dp[i]的表示就是状态转移方程,题目其实给出状态转移方程,dp[i]依赖于前三个状态,dp[i]=dp[i-1]+dp[i-2]+dp[i-3]。接下来就是初始化,保证填表的时候不越界,如果我们使用上面的状态表示方程,dp[0]、dp[1]、dp[2]都会发生越界。而题目也已经将前三个状态给了出来,dp[0]=0、dp[1]=1、dp[2]=1。下面我们填表的时候,为了填写当前状态,所需的状态必须是已经计算出来的,所以填表顺序从左到右。

        完整代码实现:

class Solution {public int tribonacci(int n) {if (n == 0)return 0;if (n == 1 || n == 2)return 1;int[] dp = new int[n + 1];dp[0] = 0;dp[1] = 1;dp[2] = 1;for (int i = 3; i <= n; i++)dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3];return dp[n];}
}

        时间复杂度为O(n),因为额外创建了数组,空间复杂度也为O(n)

        空间优化:一般情况下,动态规划都可以利用滚动数组来解决。在这道题中,从第三个数开始,我们仅需前三个数就可以求出当前状态的结果,其他的空间就会产生浪费。使用滚动数组,我们只需要存储最近的三个泰波那契数。如下图,先初始化a、b、c的值,第N个泰波那契数d=a+b+c,当我们要求下一个泰波那契数时,将d的值更新为c,c的值更新为b,b的值更新为a。因为这种求法不用创建数组,空间复杂度可以优化为O(n)

2.2. 三步问题

        当n=1时,只有1种方式。当n=2时,从0直接到2,1种方式;我们不管怎么从0到1,直接考虑从1到2,1种方式,所以0到2一共是1+1=2种方式。当n=3时,从0直接到3,1种方式;从1开始直接到3,1种方式,前面从0到1,1种方式,1*1=1种;从2开始直接到3,1种方式,从0到2,2种方式,2*1=2种方式,所以0到3一共是1+1+2=4种方式;当n=4时,按照上面的推导过程,从0到4一共是1+2+4=7种方式。所以递推公式为:当n>3时,F(n)=F(n-1)+F(n-2)+F(n-3)。

        我们根据题目要求可以得出状态表示为到达n号台阶时,共有多少种方式。这个小孩一次可以上1阶、2阶、3阶台阶,我们以第n阶台阶最近的一步划分,那么状态转移方程为:dp[n]=dp[n-1]+dp[n-2]+dp[n-3]。当n<4时,这个状态转移方程就没有意义了,初始化操作,dp[1]=1,dp[2]=2,dp[3]=4。根据题目要求,填表顺序为从左到右。

        完整代码实现:

class Solution {public int waysToStep(int n) {// 定义模数,用于防止结果溢出int mod = (int) 1e9 + 7;if (n == 1 || n == 2) return n;if (n == 4) return 4;int[] dp = new int[n + 1];// 初始化前三个台阶的方法数dp[1] = 1;dp[2] = 2;dp[3] = 4;// 从第4个台阶开始,计算每个台阶的方法数for (int i = 4; i <= n; i++) {// 到达第i个台阶的方法数为前三个台阶的方法数之和,并取模防止溢出dp[i] = ((dp[i - 1] + dp[i - 2]) % mod + dp[i - 3]) % mod;}return dp[n];}
}

2.3. 使用最小花费爬楼梯

        题目给出了一个长度为n的数组cost,其中cost[i]表示爬到第i个台阶所需要的花费。目标是计算出从底部爬到顶部所需的最小花费。我们首先要明白楼梯顶部在哪里,这里不是数组的最后一个元素,而是越过数组末尾的下一个位置。

  • 第一种解法

        根据题目分析可以得出,本题的状态表示为到达n阶台阶时,最小花费的数目。接着利用之前的状态来推导dp[n]的值,根据最近的一步或者两步来划分问题:先到达dp[n]的前一个位置dp[n-1],然后支付cost[n-1]走一步,到达dp[n]花费为dp[n-1]+cost[n-1];先到达dp[n-2]的前两个位置dp[n-2],然后支付cost[n-2]走两步,花费为dp[n-2]+cost[n-2]。那么递推公式dp[n]=Math.min(dp[n-1]+cost[n-1],dp[n-2]+cost[n-2])。初始化dp[0]=dp[1]=0。填表顺序从左到右。

        完整代码实现:

class Solution {public int minCostClimbingStairs(int[] cost) {int n = cost.length;int[] dp = new int[n + 1];for (int i = 2; i <= n; i++) {dp[i] = Math.min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);}return dp[n];}
}
  • 第二种解法 

        第一种解法是利用结尾作为状态表示,第二种我们以起点作为状态表示。这里dp[i]表示从i位置出发到达楼顶的最小花费。状态转移方程:当我们支付cost[i]向后走一步到达i+1位置时,再从i+1位置到达终点,花费为dp[i+1]+cost[n];当我们支付cost[i]向后走两步到达i+2位置时,再从i+2位置到达终点,花费为dp[i+2]+cost[n],所以递推公式为dp[i]=Math.min(dp[i+1],dp[i+2])+cost[i]。接着将dp表最后两个元素初始化,仅需支付这一层台阶的花费到达终点即可,所以dp[n-1]=cost[n-1],dp[n-2]=cost[n-2]。填表顺序从左到右。起始位置要从0下标或者1下标开始爬楼梯,最后要返回dp[0]与dp[1]的最小值。

        完整代码实现:

class Solution {public int minCostClimbingStairs(int[] cost) {int n = cost.length;int[] dp = new int[n];// 初始化dp数组的最后一个元素,即到达最后一阶楼梯的花费dp[n - 1] = cost[n - 1];// 初始化dp数组的倒数第二个元素,即到达倒数第二阶楼梯的花费dp[n - 2] = cost[n - 2];for (int i = n - 3; i >= 0; i--) {// 到达当前阶楼梯的最小花费等于到达下一阶或下两阶楼梯的最小花费加上当前阶的花费dp[i] = Math.min(dp[i + 1],dp[i + 2]) + cost[i];}return Math.min(dp[0],dp[1]);}
}

    2.4. 解码方法

            题目给定一个只包含数字的非空字符串,要求计算解码方法的总数。如果没有合法的方式解码整个字符串,返回0。

            状态表示:以i位置为结尾,从0到i计算字符串有多种解码方式,题目当中要求计算总字符串的解码方式,所以dp[i]表示以i位置为结尾,解码方法的总数。状态转移方程:根据最近的一步,让i位置单独解码,或者以i-1和i结合进行解码(我们在算i+1位置时,会考虑i与i+1结合,所以在计算i位置时,不必考虑i与i+1结合)。当i位置单独解码时,1<=i<=9时成功解码,反之失败。如果0到i-1之间的解码数dp[i-1],再加上i位置解码,也是dp[i-1]种,如果失败,则整体解码也失败。当i-1与i位置结合时,10<=10*(i-1)+i<=99才能解码成功,整体解码数为dp[i-2],失败则没有。dp[i]=dp[i-1]+dp[i-2]。初始化:如果0位置解码成功,dp[0]=1,反之dp[1]=1;dp[1]结合上面的推导,可以出现0、1、2三种情况。填表顺序从左到右。结果直接返回dp[i]。

            完整代码实现:

    class Solution {public int numDecodings(String s) {int n = s.length();char[] ch = s.toCharArray();int[] dp = new int[n]; // 创建一个动态规划数组,用于存储每个位置的解码方式数量//初始化第一个位置if (ch[0] != '0') dp[0] = 1;if (n == 1) return dp[0];//初始化第二个位置if (ch[1] != '0' && ch[0] != '0') dp[1] += 1;int t = (ch[0] - '0') * 10 + ch[1] - '0';if (t >= 10 && t <= 26) dp[1] += 1;for (int i = 2; i < n; i++) {//单独解码if (ch[i] != '0') dp[i] += dp[i - 1];//结合解码int tt = (ch[i - 1] - '0') * 10 + ch[i] - '0';if (tt >= 10 && tt <= 26) dp[i] += dp[i - 2];}return dp[n - 1]; // 返回最后一个位置的解码方式数量,即为字符串的总解码方式数量}
    }
    • 边界处理和初始化的优化

            前面三道题的初始化代码非常简单,但这道题的初始化却有很多,并且还存在相似的代码。而接下来就是创建虚拟头结点来对初始化的代码进行优化。我们先将旧的dp表新增一个结点,并将旧dp表里的元素统一后移一位。这里需要注意,1.虚拟结点的值要保证后面填表的正确性,2.下标的映射关系。dp[2]的状态取决于dp[0]和dp[1],根据前面的状态转移方程,需要+dp[0]时,说明0和1位置可以解码成功,所以dp[0]初始化为1,解码不成功直接忽略。当我们在新dp表里面初始化dp[0]时,我需要看字符串0位置的解码情况。所以只需在新dp表里面-1就可以。

            优化后的代码:

    class Solution {public int numDecodings(String s) {int n = s.length();char[] ch = s.toCharArray();int[] dp = new int[n + 1]; // 创建一个动态规划数组,用于存储每个位置的解码方式数量//初始化第一个位置dp[0] = 1;//初始化第二个位置if(ch[1 - 1] != '0') dp[1] = 1;for (int i = 2; i <= n; i++) {//单独解码if (ch[i - 1] != '0')dp[i] += dp[i - 1];//结合解码int tt = (ch[i - 2] - '0') * 10 + ch[i - 1] - '0';if (tt >= 10 && tt <= 26)dp[i] += dp[i - 2];}return dp[n]; // 返回最后一个位置的解码方式数量,即为字符串的总解码方式数量}
    }

    相关文章:

    动态规划算法的欢乐密码(一):斐波那契数模型

    专栏&#xff1a;算法的魔法世界 个人主页&#xff1a;手握风云 目录 一、动态规划 二、例题讲解 2.1. 第 N 个泰波那契数 2.2. 三步问题 2.3. 使用最小花费爬楼梯 2.4. 解码方法 一、动态规划 动态规划是一种将复杂问题分解为更小的子问题&#xff0c;并利用子问题的解来…...

    【FreeRTOS进阶】优先级翻转现象详解及解决方案

    【FreeRTOS进阶】优先级翻转现象详解及解决方案 接下来我们聊聊优先级翻转这个经典问题。这个问题在实时系统中经常出现&#xff0c;尤其是在任务较多的场景下&#xff0c;而且问题定位起来比较麻烦。 什么是优先级翻转&#xff1f; 优先级翻转的核心定义很简单&#xff1a;…...

    解决 IntelliJ IDEA 项目启动时端口冲突问题

    1.问题 Description: The Tomcat connector configured to listen on port 8082 failed to start. The port may already be in use or the connector may be misconfigured. Action: Verify the connectors configuration, identify and stop any process thats listening…...

    笔试专题(十一)

    文章目录 添加字符&#xff08;暴力枚举&#xff09;题解代码 城市群数量&#xff08;dfs&#xff09;题解代码 判断是不是平衡二叉树&#xff08;递归&#xff09;题解代码 最大子矩阵&#xff08;二维前缀和&#xff09;题解代码 小葱的01串 &#xff08;固定区间大小的滑动窗…...

    C++11新增语法:列表初始化

    前言&#xff1a; 接下来我们将要讲解&#xff0c;相较于c98&#xff0c;c11中新增的语法以及如何使用~。我们首先来讲解&#xff1a;列表初始化。 下文预告&#xff1a;右值引用和移动语义 C98中传统的{} 在c98中的{}&#xff0c;仅能初始化数组和结构体 #include<iostrea…...

    Linux:基础IO---动静态库

    文章目录 1. 动静态库前置知识1.1 动静态库知识回顾1.2 什么是动静态库 2. 动静态库2.1 站在库的制作者的角度2.2 站在库的使用者的角度2.3 动态库是怎么被加载的&#xff08;原理&#xff09; 序&#xff1a;上一篇文章我们从认识到理解&#xff0c;从理解到实现场景&#xff…...

    从裸仓库到GitLab全解析

    Git服务器搭建与使用指南&#xff1a;从裸仓库到GitLab全解析 前言 在团队协作开发中&#xff0c;版本控制系统是必不可少的工具。虽然GitHub提供了优秀的代码托管服务&#xff0c;但企业级项目往往需要更安全的私有化部署方案。本文将手把手教你两种主流的Git服务器搭建方式…...

    OzGIS:地理信息分析与处理软件

    大家好&#xff0c;今天为大家介绍的软件是OzGIS&#xff1a;一款地理信息分析与处理软件。下面&#xff0c;我们将从软件的主要功能、支持的系统、软件官网等方面对其进行简单的介绍。 OzGIS官网网址为&#xff1a;https://ozgis.sourceforge.io/。 OzGIS是一款开源软件&#…...

    PHP异常处理__Throwable

    在 PHP 里&#xff0c;Throwable 是一个极为关键的接口&#xff0c;自 PHP 7 起被引入。它为错误和异常处理构建了一个统一的框架。下面会详细介绍 Throwable 的相关内容。 1. 基本概念 Throwable 是 Exception 和 Error 的父接口。在 PHP 7 之前&#xff0c;异常&#xff08…...

    PHP异常处理__Exception类

    以下是对 PHP 中 Exception 类的详细解释&#xff1a; 一、Exception 类概述 Exception 是 PHP 中所有异常类的基类。它提供了一个通用的异常处理机制&#xff0c;用于处理程序执行过程中可能出现的错误情况。当程序中出现异常时&#xff0c;可以创建 Exception 的实例并将其…...

    C++中动态多态类别浅析

    非抽象类继承和虚函数 #include <iostream> using namespace std;class Base { public:virtual void func() { // 虚函数&#xff0c;支持动态绑定cout << "Base::func()" << endl;} };class Derived : public Base { public:void func() overrid…...

    游戏引擎学习第234天:实现基数排序

    回顾并为今天的内容设定背景 我们今天继续进行排序的相关&#xff0c;虽然基本已经完成了&#xff0c;但还是想收尾一下&#xff0c;让整个流程更完整。其实这次排序只是个借口&#xff0c;主要是想顺便聊一聊一些计算机科学的知识点&#xff0c;这些内容在我们项目中平时不会…...

    系分架构论文《论高并发场景的架构设计和开发方法》

    系统分析师论文范文系列 【摘要】 2022年8月&#xff0c;我司承接了某知名电商平台“秒杀系统架构优化”项目&#xff0c;我作为系统分析师主导了整体架构设计与技术选型工作。该平台在促销活动中面临瞬时流量超过50万QPS的挑战&#xff0c;原有架构存在数据库崩溃、服务响应延…...

    最新得物小程序sign签名加密,请求参数解密,响应数据解密逆向分析

    点击精选&#xff0c;出现https://app.dewu.com/api/v1/h5/index/fire/index 这个请求 直接搜索sign的话不容易定位 直接搜newAdvForH5就一个&#xff0c;进去再搜sign&#xff0c;打上断点 可以看到t.params就是没有sign的请求参数&#xff0c; 经过Object(a.default)该函数…...

    jangow靶机笔记(Vulnhub)

    环境准备&#xff1a; 靶机下载地址&#xff1a; https://download.vulnhub.com/jangow/jangow-01-1.0.1.ova kali地址&#xff1a;192.168.144.128 靶机&#xff08;jangow&#xff09;地址&#xff1a;192.168.144.180 一.信息收集 1.主机探测 使用arp-scan进行主机探…...

    Spring Boot + Caffeine:打造高性能缓存解决方案

    1. 引言 1.1 缓存的重要性 缓存是提升系统性能的关键技术之一,通过将频繁访问的数据存储在内存中,减少对数据库或其他外部系统的访问次数,从而降低延迟并提高吞吐量。 缓存的基本概念:缓存是一种临时存储机制,用于快速访问常用数据。缓存在提升系统性能中的作用:减少数…...

    C++入门小馆: 深入string类

    嘿&#xff0c;各位技术潮人&#xff01;好久不见甚是想念。生活就像一场奇妙冒险&#xff0c;而编程就是那把超酷的万能钥匙。此刻&#xff0c;阳光洒在键盘上&#xff0c;灵感在指尖跳跃&#xff0c;让我们抛开一切束缚&#xff0c;给平淡日子加点料&#xff0c;注入满满的pa…...

    命令行基础

    学习目标 掌握VRP命令行的基础知识 利用VRP命令行进行基本的配置 VRP命令行的基础知识 一、VRP 命令行基本架构 1. 用户视图&#xff08;User View&#xff09; 进入方式&#xff1a;设备启动后默认进入&#xff0c;提示符为 &#xff1c;HUAWEI&#xff1e;。功能&#…...

    10-DevOps-Jenkins参数化构建实现多版本发布

    在之前的Jenkins配置中&#xff0c;固定写死了程序的版本号&#xff0c;实际情况是随着版本的不断迭代&#xff0c;版本号也是不断变化的&#xff0c;版本号由代码仓库&#xff08;GitLab&#xff09;设置。 当前Jenkins配置是固定写的1.0&#xff0c;本节我们要把它改成动态的…...

    C++游戏服务器开发之⑦redis的使用

    目录 1.当前进度 2.守护进程 3.进程监控 4.玩家姓名添加文件 5.文件删除玩家姓名 6.redis安装 7.redis存取命令 8.redis链表存取 9.redis程序结构 10.hiredisAPI使用 11.基于redis查找玩家姓名 12.MAKEFILE编写 13.游戏业务实现总结 1.当前进度 2.守护进程 3.进程监…...

    二进制裁剪命令mips-linux-gnu-strip 命令的使用

    -s 或者--strip-all:移除所有符号和调试信息 -g 或者--strip-debug:仅移除调试信息 -d 或者--strip-unneeded:移除不需要的符号 默认不传任何参数 也是移除所有符号和调试 应用:把文件系统所有二进制镜像使用一遍,缩小文件系统大小 79K Apr 19 15:47 fat.ko //使用前 mips-l…...

    【Bluedroid】蓝牙存储模块配置管理:启动、读写、加密与保存流程解析

    本文围绕蓝牙存储模块展开&#xff0c;主要解析了蓝牙存储模块&#xff08;StorageModule&#xff09;的初始化流程&#xff0c;重点围绕配置文件校验、读取、设备类型修复及加密处理展开。通过工厂重置检测、校验和验证、多源配置加载、设备类型推断修正等步骤&#xff0c;确保…...

    SpringBoot启动后初始化的几种方式

    目录 一、静态代码块 二、构造方法 三、PostConstruct 四、InitializingBean 接口 五、 Bean 注解中的 initMethod 六、 CommandLineRunner 接口 七、ApplicationRunner 接口 八、EventListener事件 九、SmartInitializingSingleton接口 十、ApplicationListener接口…...

    asp.net core webapi+efcore

    简洁的restfull风格 目前c#提供了多种风格的web编程&#xff0c;因为微软有自己的前端&#xff0c;所以集成了很多内容&#xff0c;不过基于现在编程前后端分离的模式&#xff0c;webapi是合适的。 webapi 目前网络上有很多介绍&#xff0c;不反复说这个了。在建立控制器时&…...

    java怎么完善注册,如果邮箱中途更换,能否判断

    解析在下面 附赠代码 private static class CodeInfo {String code;long timestamp;CodeInfo(String code, long timestamp) {this.code code;this.timestamp timestamp;}}// 存储验证码&#xff08;邮箱 -> 验证码信息&#xff09;(保证线程安全) 以免中途更改邮箱pri…...

    实战设计模式之备忘录模式

    概述 与解释器模式、迭代器模式一样&#xff0c;备忘录模式也是一种行为设计模式。备忘录模式允许我们保存一个对象的状态&#xff0c;并在稍后恢复到这个状态。该模式非常适合于需要回滚、撤销或历史记录等功能的应用场景。通过使用备忘录模式&#xff0c;开发者可以轻松添加诸…...

    数据库表设计

    一对一关系 共享主键 两个表的主键是相同的 唯一外键 从表中记录主表的id 一对多关系 从表&#xff08;多的表&#xff09;存储主表的id 多对多关系 设计一个中间表&#xff08;关联表&#xff09;&#xff0c;它有两列分别记录两个主表&#xff08;A 和 B&#xff09;…...

    Linux 桌面环境 LXQt 2.2 发布

    Linux 桌面环境 LXQt 2.2 于 2025 年 4 月 17 日正式发布。这是该轻量级开源 Qt 桌面环境的最新稳定版本&#xff0c;带来了诸多改进&#xff0c;特别是在 Wayland 支持方面。以下是一些主要的更新内容&#xff1a; Wayland 支持增强&#xff1a; 提升了多屏支持&#xff0c;使…...

    多人五子棋联机对战平台 测试报告

    目录 项目介绍 测试用例设计 部分功能测试示例 自动化测试 测试范围 排除范围 自动化测试目录​编辑 执行全部自动化测试用例 性能说明 总结 性能测试 结果分析 测试总结 项目介绍 该项目基于WebSocket实现实时通信&#xff0c;采用SSM框架构建在线五子棋多人联机…...

    探索 .bat 文件:自动化任务的利器

    在现代计算机操作中&#xff0c;批处理文件&#xff08;.bat 文件&#xff09;是一种简单而强大的工具&#xff0c;它可以帮助我们自动化重复性任务&#xff0c;工作效率提高。尽管随着编程语言和脚本工具的发展&#xff0c;.bat 文件的使用频率有所下降&#xff0c;但它依然是…...

    240419 leetcode exercises

    240419 leetcode exercises jarringslee 文章目录 240419 leetcode exercises[19. 删除链表的倒数第 N 个结点](https://leetcode.cn/problems/remove-nth-node-from-end-of-list/)&#x1f501; 经典方法&#xff1a;两次遍历暴力求解&#x1f501; 双指针法 &#xff1a;快慢…...

    开源Midjourney替代方案:企业级AI绘画+PPT生成系统+AI源码

    「AI取代设计师&#xff1f;」开源Midjourney替代方案&#xff1a;企业级AI绘画PPT生成系统 ——零代码私有化部署&#xff0c;5倍速出图100%版权合规 设计师行业的危机与机遇 1. 传统设计流程的致命短板 痛点 人工设计 AI系统 单张海报耗时 3小时&#xff08;含反复修改…...

    学习笔记十七——Rust 支持面向对象编程吗?

    &#x1f9e0; Rust 支持面向对象编程吗&#xff1f; Rust 是一门多范式语言&#xff0c;主要以 安全、并发、函数式、系统级编程为核心目标&#xff0c;但它同时也支持面向对象的一些关键特性&#xff0c;比如&#xff1a; 特性传统 OOP&#xff08;如 Java/C&#xff09;Ru…...

    图灵奖得主LeCun:DeepSeek开源在产品层是一种竞争,但在基础方法层更像是一种合作;新一代AI将情感化

    图片来源&#xff1a;This is World 来源 | Z Potential Z Highlights&#xff1a; 新型的AI系统是以深度学习为基础&#xff0c;能够理解物理世界并且拥有记忆、推理和规划能力的。一旦成功构建这样的系统&#xff0c;它们可能会有类似情感的反应&#xff0c;但这些情感是基…...

    Flink框架十大应用场景

    Flink框架适合应用的场景 1. 流式数据处理 Flink框架最常用的应用场景是流式数据处理。流式数据处理是指对实时数据进行处理,以便及时地做出决策。例如,一个电商网站需要对用户的行为进行实时分析,以便根据用户的兴趣和行为推荐商品。Flink框架可以帮助电商网站实时地处理数…...

    C++镌刻数据密码的树之铭文:二叉搜索树

    文章目录 1.二叉搜索树的概念2.二叉搜索树的实现2.1 二叉搜索树的结构2.2 二叉搜索树的节点寻找2.2.1 非递归2.2.2 递归 2.3 二叉搜索树的插入2.3.1 非递归2.3.2 递归 2.4 二叉搜索树的删除2.4.1 非递归2.4.2 递归 2.5 二叉搜索树的拷贝 3.二叉树的应用希望读者们多多三连支持小…...

    CAN与CANFD协议说明

    在 CAN&#xff08;Controller Area Network&#xff0c;控制器局域网&#xff09;协议里&#xff0c;仲裁域波特率和数据域比特率有着不同的含义和作用&#xff0c;下面为你详细介绍并举例说明。 概念解释 仲裁域波特率 含义&#xff1a;仲裁域是 CAN 数据帧中的一部分&…...

    【C++ Qt】信号和槽(内配思维导图 图文并茂 通俗易懂)

    每日激励&#xff1a;“不设限和自我肯定的心态&#xff1a;I can do all things。 — Stephen Curry” 绪论​&#xff1a; 本章是Qt中的第三章&#xff0c;也是我们理解Qt中必备的点 信号槽&#xff0c;它本质由信号和槽两个来实现&#xff0c;其中将细致的讲述如何自定义信号…...

    【实战】在 Linux 上使用 Nginx 部署 Python Flask 应用

    在 Linux 上使用 Nginx 部署 Python Flask 应用 步骤一&#xff1a;准备 Flask 应用 创建 Flask 应用 确保你有一个可以运行的 Flask 应用。例如&#xff0c;创建一个简单的 app.py 文件&#xff1a; from flask import Flask app Flask(__name__)app.route(/) def hello_wor…...

    java ai 图像处理

    Java AI 图像处理 图像处理是人工智能&#xff08;AI&#xff09;领域中非常重要的一个应用方向。通过使用Java编程语言和相应的库&#xff0c;我们可以实现各种图像处理任务&#xff0c;如图像识别、图像分类、图像分割等。本文将介绍一些常见的图像处理算法&#xff0c;并通过…...

    【绘制图像轮廓】图像处理(OpenCV) -part7

    15 绘制图像轮廓 15.1 什么是轮廓 轮廓是一系列相连的点组成的曲线&#xff0c;代表了物体的基本外形。相对于边缘&#xff0c;轮廓是连续的&#xff0c;边缘不一定连续&#xff0c;如下图所示。轮廓是一个闭合的、封闭的形状。 轮廓的作用&#xff1a; 形状分析 目标识别 …...

    Mesh模型孔洞修补算法总汇

    关于Mesh 孔洞修补算法&#xff08;Hole Filling in Meshes&#xff09;&#xff0c;这是计算几何和图形学中的一个重要话题&#xff0c;常用于重建、3D 扫描、建模等领域。下面我会系统总结主流和经典的孔洞修补方法&#xff0c;并按技术路线分类说明每种的原理、优缺点&#…...

    ARINC818协议(六)

    上图中&#xff0c;红色虚线上面为我们常用的simple mode简单模式&#xff0c;下面和上面的结合在一起&#xff0c;就形成了extended mode扩展模式。 ARINC818协议 container header容器头 ancillary data辅助数据 视频流 ADVB帧映射 FHCP传输协议 R_CTRL:路由控制routing ctr…...

    RTMP握手流程

    RTMP&#xff08;Real-Time Messaging Protocol&#xff09; 不支持除H.264/AAC之外的标准。 使用TCP,当到达网络拥塞、宽带上限时&#xff0c;传输质量受到影响。 URL格式&#xff1a; rtmp://host:port/app&#xff08;名称&#xff09;/stream&#xff08;流ID&#xff…...

    【解决】torch引入过程中的ImportError: __nvJitLinkAddData_12_1, version libnvJitLink.so.12

    大纲 本文记录在环境配置好后&#xff0c;在 import torch 过程中报了 异常 ImportError: /home/Coding/Envs/envs/only_test/lib/python3.10/site-packages/torch/lib/../../nvidia/cusparse/lib/libcusparse.so.12: undefined symbol: __nvJitLinkAddData_12_1, version lib…...

    面试招聘:新能源汽车研发测试人员需求内部研讨会纪要(2025年4月19日草稿流出)

    标题&#xff1a;XX汽车技术中心技术管理岗闭门会议纪要完整版&#xff1a;双非招聘策略、面试话术与风控方案&#xff08;附待定事项&#xff09; 【内部密级文件】 时间&#xff1a;2025年4月15日 14:00-17:30 地点&#xff1a;某主机厂研发中心会议室&#xff08;305&#…...

    从零开始学习 Lucene.Net:.NET Core 中的全文搜索与索引管理

    Lucene.Net 是一个开源的全文搜索引擎库&#xff0c;它是 Apache Lucene 项目的 .NET 移植版本。Lucene.Net 提供了强大的搜索功能&#xff0c;广泛应用于文档搜索、日志分析、数据检索等场景。随着大数据的爆发&#xff0c;开发者越来越依赖高效的搜索引擎来实现复杂的搜索需求…...

    opencv--图像处理

    图像处理技术 图像处理技术是利用计算机对图像进行计算,分析和处理的技术,包括数字图像处理和计算机视觉两大领域。 对图像的处理包括滤波,缩放,分割,识别(两种信息对比)等。 链接 数字图像处理 1. 数字图像处理(Digital Image Processing) 数字图像处理主要关注图…...

    JCST 2025年 区块链论文 录用汇总

    Conference&#xff1a;Journal of Computer Science and Technology (JCST) CCF level&#xff1a;CCF B Categories&#xff1a;交叉/综合/新兴 Year&#xff1a;2025&#xff08;截止4.19&#xff09; JCST 2024年 区块链论文 录用汇总 1 Title: An Understandable Cro…...

    股指期货跨期套利是如何赚取价差利润的?

    股指期货跨期套利&#xff0c;简单来说&#xff0c;就是在同一交易所内&#xff0c;针对同一股指期货品种的不同交割月份合约进行的套利交易。投资者会同时买入某一月份的股指期货合约&#xff0c;并卖出另一月份的股指期货合约&#xff0c;待未来某个时间点&#xff0c;再将这…...