- 博客(74)
- 收藏
- 关注
原创 Leetcode题解:647回文子串,如何理解二维DO数组!?
本文介绍了一种使用动态规划算法统计字符串中回文子串数量的方法。通过构建二维数组dp记录每个子串是否为回文,当s[i]==s[j]且满足特定条件时标记为回文。算法时间复杂度O(n²),空间复杂度O(n²),适用于正反读相同的连续字符序列。代码实现展示了从字符串末尾开始的遍历过程,最终统计所有标记为true的子串数量。该方法有效解决了回文子串统计问题,示例验证了"abc"有3个回文子串。
2025-09-06 01:00:02
533
原创 Leetcode题解:198打家劫舍,动态规划的起点!
摘要:该问题要求在非负整数数组表示的房屋金额中,选择不相邻元素的最大和。使用动态规划算法,初始化dp数组存储前i个房屋的最大金额,状态转移方程为dp[i] = max(dp[i-1], dp[i-2] + nums[i])。时间复杂度O(n),空间复杂度O(n)。示例nums=[2,7,9,3,1]时,最大金额为12。
2025-08-28 00:12:34
468
原创 C++八股文面试必备!malloc、new、free与delete的区别
C++中动态内存管理的关键区别:malloc/free是C语言库函数,在堆上分配原始内存,需手动计算大小和类型转换;new/delete是C++运算符,在自由存储区分配内存,自动计算大小并调用构造/析构函数。malloc失败返回NULL,new抛出异常;free直接释放内存,delete先调用析构函数。new/delete更安全可靠,适合面向对象编程,而malloc/free适合底层内存操作。开发者应根据场景选择合适的内存管理方式,确保资源正确释放和异常安全。
2025-08-19 23:39:32
541
原创 Leetcode题解:215,数组中的第k个最大元素,如何使用快速算法解决!
本文介绍了一种使用快速选择算法在O(n)平均时间复杂度内查找数组中第k大元素的方法。该算法基于快速排序,通过划分数组逐步缩小搜索范围:首先选择基准值将数组分为左右两部分,然后根据基准值位置与目标k的关系递归查找左或右子数组。当基准值位置等于目标索引时返回该元素。文章详细说明了算法逻辑、复杂度分析(时间O(n),空间O(1)),并提供了C++代码实现及示例执行过程。最后总结了快速选择算法通过划分和递归查找高效定位目标元素的特性。
2025-08-13 19:21:01
1021
原创 Leetcode题解:739每日温度,用单调栈解决问题!
该题目要求根据每日温度数组,计算每天需要等待几天才能遇到更高温度。采用单调栈算法解决:维护一个存储温度索引的栈,遍历数组时,若当前温度高于栈顶元素对应的温度,则弹出栈顶并计算天数差,存入结果数组。时间复杂度O(n),空间复杂度O(n)。例如对于输入[73,74,75,71,69,72,76,73],输出结果为[1,1,4,2,1,1,0,0]。该算法通过单调栈高效地解决了"下一个更大元素"类问题。
2025-08-07 00:01:59
695
原创 leetcode题解 :210课程表,拓扑排序的应用!
该题目要求对课程进行拓扑排序,确保每门课程在其先修课程完成后才能学习。使用邻接表存储课程关系,入度数组记录课程依赖,队列处理入度为0的课程。通过不断移除入度0节点并更新后续课程入度,若最终结果包含全部课程则返回顺序,否则返回空数组。时间复杂度O(V+E),空间复杂度O(V+E)。示例展示了有环和无环两种情况下的处理过程。
2025-08-01 09:05:44
742
原创 Leetcode239:滑动窗口最大值,双端队列的实现!
摘要:本文介绍了一种使用双端队列高效解决滑动窗口最大值问题的算法。给定数组nums和窗口大小k,算法通过维护一个存储索引的双端队列,确保队列头部始终是当前窗口最大值。遍历数组时,先移除超出窗口范围的元素,再移除尾部小于当前元素的无效值,最后将当前元素加入队列。当窗口形成时,记录队列头部元素作为最大值。该算法时间复杂度O(n),空间复杂度O(k),并提供C++和C两种实现代码。示例展示了对数组[1,3,-1,-3,5,3,6,7]执行k=3时的具体计算过程。
2025-07-28 09:31:19
746
原创 Leetcode题解:209长度最小的子数组,掌握滑动窗口从此开始!!!
本文介绍了使用滑动窗口算法寻找数组中满足总和≥目标值的最短连续子数组的方法。题目分析部分说明了输入输出要求,算法采用双指针技术动态调整窗口范围,通过移动左右指针来扩展或收缩窗口,同时维护当前和与最小长度。解题要点强调了滑动窗口的定义和移动规则,指出算法的时间复杂度为O(n)。提供了C++和C语言的实现代码,并附有详细注释解释窗口扩展、收缩及终止条件。最后通过示例演示了代码执行过程,展示了在数组[2,3,1,2,4,3]中寻找目标值7时的具体步骤,最终确定最短子数组[4,3]的长度为2。
2025-07-22 20:07:28
501
原创 MYSQL:深入解析 SQL 查询技巧,一篇上手!
本文介绍了关系型数据库中数据查询语言(DQL)的核心操作,重点讲解了SELECT语句的使用方法。主要内容包括:1. DQL概述及其核心功能;2. SELECT查询基础操作,涵盖列查询、条件过滤、排序分页和分组聚合;3. 表连接技术,详细解析了内连接、外连接(左/右/全连接)和自连接的使用场景及语法。通过具体示例,展示了如何高效地从单表或多表中检索数据,包括数据过滤、排序分组等实用技巧,帮助读者掌握数据库查询的核心技术。
2025-07-22 00:20:39
694
原创 C语言实现Linux命令:统计文件的代码行数,课程设计必备!
本文介绍了一个Linux下C语言实现的代码统计工具,能够分析C语言源文件并输出四种统计指标:总行数、注释行数(支持//和/**/)、空行数和实际代码行数。程序通过文件操作函数逐字符/行读取内容,使用状态标记处理多行注释,采用命令行参数控制输出选项。该工具展示了Linux系统编程中的文件处理、字符串操作和参数解析技术,可用于评估代码质量,默认显示全部统计项,也支持通过-l/-w/-c/-b选项分别查看特定指标。
2025-07-19 18:36:49
544
原创 MYSQL新手入门: DDL让你一篇学会表的创建与操作!
本文介绍了MySQL数据库中的SQL语言框架,重点讲解了数据定义语言(DDL)的用法。SQL语言主要分为DDL(数据定义)、DML(数据操纵)、DQL(数据查询)和DCL(数据控制)四类。DDL用于管理数据库结构,包括CREATE(创建)、ALTER(修改)、DROP(删除)、TRUNCATE(清空)和GRANT(授权)等命令。文章详细说明了创建数据库/表、修改表结构、删除数据库对象等操作的具体语法,并强调了DDL与DML的区别。掌握DDL是数据库管理的基础,建议读者多加练习以熟悉这些命令的使用。
2025-07-19 18:26:12
910
原创 leetcode题解77:组合(回溯算法的门面)
本文介绍了使用回溯算法解决组合问题的思路。给定整数n和k,要求在1到n范围内生成所有可能的k个数组合。通过递归函数backtracking实现:当路径长度等于k时保存结果;否则从startindex开始逐个添加数字,递归处理i+1位置的数字,并在回溯时移除当前数字。示例展示了n=4、k=2时的完整递归过程,最终生成所有有效组合。该方法通过递归分解问题,利用回溯恢复状态,确保正确生成所有不重复的组合。
2025-06-23 15:34:54
982
原创 USART串口通信详解:原理与代码!
USART(通用同步/异步收发器)是一种支持全双工通信的串行接口,通过发送/接收数据寄存器和移位寄存器实现数据传输。其结构包含波特率发生器、控制状态模块和GPIO接口,支持8/9位数据帧格式(含起始位、校验位和停止位)。关键特性包括异步/同步模式选择、灵活波特率设定(通过USART_BRR寄存器配置)以及硬件流控制。代码示例展示了STM32的USART初始化及数据发送功能,涵盖字节发送、数组传输、格式化输出(printf重定向)等操作。USART广泛应用于微控制器通信,需注意起始位检测采样和波特率同步以确保
2025-06-18 13:13:01
1011
原创 STM32DMA直接存储器存取简介!
STM32的DMA(直接存储器访问)模块是一种高效数据传输方案,可实现外设与存储器或存储器间直接传输,无需CPU干预。该模块支持四种传输模式:内存间模式、外设到内存模式、内存到外设模式和外设间模式,适用于数据采集、音频处理等场景。初始化过程包括开启时钟、配置参数、选择通道和启动DMA。通过中断机制可实现传输完成通知,典型应用如ADC数据采集后通过串口发送。DMA显著提升系统性能,降低CPU负载,是嵌入式系统优化的关键模块。
2025-06-16 11:35:36
905
原创 leetcode题解538:把二叉搜索树转换为累加树
本文介绍了如何将二叉搜索树转换为累加树的方法。通过递归遍历树结构,从右子树开始处理,利用全局变量pre记录节点值之和,更新当前节点值为原值与pre之和。该方法保持二叉搜索树结构不变,满足每个节点值等于所有大于等于该值的节点值之和的要求。代码采用后序遍历方式,先处理右子树,再更新节点值,最后处理左子树。递归终止条件是遇到空节点时返回NULL。文中通过示例详细说明了递归执行过程,展示了如何将根节点为5、左子节点为3、右子节点为7的树转换为根节点12、左子树10、右子树7的累加树。
2025-06-13 18:26:41
948
原创 leetcode题解669:修剪BST,掌握正确的修剪方式最重要!!!
摘要:本文介绍了如何修剪二叉搜索树(BST),使其所有节点值在给定区间[low, high]内。修剪需保持BST性质,通过递归实现:若节点值大于high则修剪左子树,小于low则修剪右子树,符合区间则保留并递归修剪左右子树。给出了C++解决方案及详细递归过程分析,包括终止条件、回溯逻辑和执行示例。该算法时间复杂度为O(n),空间复杂度为O(h)(树高),能高效完成修剪操作。
2025-06-11 11:07:43
916
原创 leetcode题解450:删除BST中的结点!调整二叉树的结构最难!
本文详细解析了如何在二叉搜索树(BST)中删除一个指定值的节点,并保持树的性质不变。文章首先介绍了题目要求和输入输出格式,随后分析了递归函数deleteNode的逻辑,包括基本情况和递归逻辑。接着,文章阐述了解题要点,重点在于理解二叉搜索树的性质以及删除操作对树结构的影响。代码部分提供了完整的C++实现,并通过详细注释解释了每一步的操作。最后,文章深入探讨了递归和回溯的过程,包括递归的终止条件、回溯时的状态恢复以及递归调用的具体步骤,并通过示例展示了代码的执行过程。通过本文的分析和代码实现,读者可以清晰地理
2025-06-10 23:52:27
839
原创 STM32ADC模数转换器,让你的32可以测量电压!!!
摘要:STM32微控制器的ADC模数转换器模块采用逐次逼近技术,支持12位分辨率、多种转换模式和触发方式。文章详细介绍了ADC的7种工作模式(扫描/非扫描、连续/单次、外部触发、DMA等)及适用场景,并提供了初始化配置、数据读取的代码示例。通过电压测量的实例展示了ADC的实际应用方法,包括GPIO设置、参数配置、校准流程及电压计算公式(Voltage=ADValue/4095×3.3),最终实现OLED实时显示。该模块在传感器采集、音频处理等领域具有重要应用价值。
2025-06-09 10:45:54
929
原创 STM32编码器接口测速,小车类项目你一定用得上!!!
STM32微控制器的编码器接口技术解析 摘要:本文详细介绍了STM32微控制器中的编码器接口技术,主要包含以下内容:1) 编码器接口的基本原理,通过处理正交编码器的A/B两相信号实现位置、方向和速度检测;2) 核心功能包括四倍频技术、方向检测和输入滤波;3) 硬件结构组成,包括GPIO、滤波器和时基单元等模块;4) 具体应用场景如电机控制和机器人技术;5) 完整的初始化步骤和示例代码实现,展示了如何通过中断处理实现旋转方向判断和脉冲计数。该技术能显著提升旋转运动的测量精度和控制性能。
2025-06-07 13:38:58
1056
原创 leetcode题解701:二叉搜索树中的插入操作(其实很简单!!!)
本文介绍了在二叉搜索树(BST)中插入新节点的递归实现方法。当插入新值时,需保持BST的性质:左子树节点值小于当前节点,右子树节点值大于当前节点。核心思路是:若当前节点为空则创建新节点;否则根据值大小递归插入左/右子树,并通过回溯更新子树链接。代码示例展示了该过程,包括终止条件(节点为空时创建)、递归调用(比较值大小选择方向)和回溯处理(更新子节点链接)。这种方法确保插入后仍保持BST特性,时间复杂度为O(h),h为树高。
2025-06-06 12:16:11
1218
原创 leetcode题解235:二叉树的最近公共祖先
题目要求在二叉搜索树(BST)中找出两个指定节点p和q的最近公共祖先(LCA)。解题关键点在于利用BST的性质:对于任意节点,左子树的值都小于该节点,右子树的值都大于该节点。通过递归遍历,当当前节点值同时大于p和q时搜索左子树,同时小于时搜索右子树,否则当前节点即为LCA。该方法时间复杂度为O(h),h为树高,空间复杂度为O(h)递归栈空间。代码简洁高效,充分体现了BST的特性优势。
2025-06-05 11:51:50
865
原创 leetcode题解236:二叉树的最近公共祖先
本题要求找出二叉树中两个节点的最近公共祖先(LCA)。采用递归解法:若当前节点为空或等于p/q则直接返回;否则递归检查左右子树。当左右子树均返回非空时,当前节点即为LCA;若仅一侧非空,则返回该侧结果。时间复杂度O(n),空间复杂度O(h),其中h为树高。关键点在于通过后序遍历自底向上判断节点关系,利用递归天然的回溯特性定位LCA。
2025-06-04 16:07:29
584
原创 leetcode题解98:验证二叉搜索树。(中序遍历!!!BST要点!)
摘要:本文讲解了如何判断二叉树是否为有效的二叉搜索树(BST)。关键方法是利用中序遍历特性,即BST的中序遍历结果应为严格递增序列。通过递归实现:1)检查左子树是否为BST;2)比较当前节点与前驱节点值;3)检查右子树是否为BST。使用辅助变量pre记录前驱节点,若发现pre->val >= root->val即返回false。最终返回左右子树检查结果的逻辑与。该方法时间复杂度O(n),空间复杂度O(h),h为树高。
2025-06-03 16:46:01
722
原创 力扣题解654:最大二叉树
题目要求根据不重复整数数组构建最大二叉树,规则为:根节点为数组最大值,递归构建左子树(最大值左侧子数组)和右子树(右侧子数组)。算法通过递归实现,先处理空数组或单元素数组的边界情况,找到当前数组最大值及索引后创建根节点,再分别递归处理左右子数组。C++代码示例展示了完整的实现过程,包括数组分割和递归调用。以数组[3,2,1,6,0,5]为例,先确定根节点6,再递归处理左子树[3,2,1]和右子树[0,5],最终构建完整的最大二叉树结构。
2025-06-02 13:07:29
676
原创 力扣题解106:从中序与后序遍历序列构造二叉树
本文介绍如何根据二叉树的中序和后序遍历序列重建原二叉树。通过递归方法,利用后序序列的末位元素确定根节点,在中序序列中找到左右子树分界点。算法步骤包括:1)判断空树情况;2)提取根节点;3)划分左右子树;4)递归构建子树。C++实现中,traversal函数处理子树划分和递归构建,buildTree函数作为入口。时间复杂度为O(n),需遍历节点定位根位置。该方法有效解决了二叉树重建问题,关键点在于准确划分遍历序列的左右子树范围。
2025-06-01 10:53:06
1326
原创 leetcode题解513:找树左下角的值(递归中的回溯处理)!
题目要求找到二叉树最底层最左边节点的值。采用深度优先搜索(DFS)方法,通过递归遍历整棵树,记录当前深度和最大深度。当遇到叶子节点时,若当前深度大于最大深度,则更新结果值和最大深度。遍历时优先访问左子树,确保找到同一深度层的最左节点。在递归回溯时需手动调整深度参数。算法时间复杂度为O(n),空间复杂度为O(h),其中n为节点数,h为树高。该方法通过一次遍历即可准确锁定目标节点,兼顾效率与准确性。
2025-05-30 14:31:50
873
原创 让你的STM32变身简易示波器,学会输入捕获就可以!
本文介绍了STM32微控制器输入捕获(Input Capture)功能在PWM信号测量中的应用。通过配置定时器的输入捕获单元,可以精确测量外部信号的频率和占空比。文章详细讲解了测频法和测周法的原理,并提供了完整的代码实现方案,包括初始化定时器、GPIO配置、捕获模式设置等关键步骤。代码展示了如何在STM32F103平台上通过TIM3定时器捕获PWM信号参数,并将结果实时显示在OLED屏幕上。该方案适用于需要精确测量外部信号参数的嵌入式应用场景。
2025-05-29 11:41:27
438
原创 新手项目必备技能:PWM驱动电机、舵机、呼吸灯
PWM是一种通过改变脉冲信号的宽度来控制设备的技术。PWM信号由高电平和低电平组成,通过调整高电平的持续时间(脉冲宽度),可以实现对设备的精确控制。PWM信号的两个重要参数是占空比和频率占空比:高电平时间与整个周期时间的比值,通常用百分比表示。频率:PWM信号的周期性重复速率,单位是赫兹(Hz)。时基单元PSC(预分频器):用来降低计数器的计数速度。比如,如果输入时钟是1MHz,预分频器设置为1000,那么计数器的计数速度就变成了1kHz。
2025-05-28 16:35:27
1114
原创 想要掌握STM32定时器中断?这一篇文章就够了
本文介绍了STM32外部定时器中断的基本原理与应用。定时器通过对时钟信号计数实现精准定时,支持多种工作模式如向上计数、PWM输出等。文章详细讲解了TIM2定时器的初始化代码配置,包括GPIO设置、时钟源选择、时基单元配置及NVIC中断优先级设置。通过实例代码展示了如何使用定时器中断实现计数值累加,并配合OLED显示实时计数状态。中断服务函数中实现计数值更新和标志位清除,主循环则持续显示当前计数值。该实例可作为STM32定时器中断应用的入门参考。
2025-05-27 16:22:27
1074
原创 初学STM32外部中断?小白看这篇就够了!
摘要:嵌入式系统中,外部中断(EXTI)是中断机制的重要类型,由外部信号触发。STM32配置外部中断需执行5个步骤:1)GPIO引脚设为输入模式;2)EXTI控制器设置触发条件;3)SYSCFG/AFIO模块引脚映射;4)NVIC使能中断并设优先级;5)编写中断服务函数(ISR)。代码示例展示了TIM2定时器和GPIOA的配置过程,包括时钟使能、引脚模式设置、NVIC优先级分组等关键操作,实现外部中断触发定时器计数的功能。
2025-05-26 11:22:42
996
原创 leetcode题解:144+145 二叉树的前序、后序遍历(非递归!)
本文介绍了二叉树前序和后序遍历的非递归实现方法。前序遍历利用栈结构,先将根节点入栈,然后依次处理右、左子节点,确保"根-左-右"顺序。后序遍历采用"伪前序+反转"技巧,先按"根-右-左"顺序遍历,最后反转结果得到"左-右-根"的正确顺序。文中提供了详细的C语言实现代码,包括栈结构定义、基础操作函数以及两种遍历算法实现。算法时间复杂度为O(n),空间复杂度为O(h)。关键技巧包括:前序遍历要注意入栈顺序,后序遍历通过反转简化实现。
2025-05-25 13:33:58
410
原创 STL 标准模板库全面解析:容器、算法与迭代器的核心应用
STL(标准模板库)是C++的核心库,提供六大组件:容器(vector、list等)、算法(sort、find等)、迭代器、仿函数、适配器和空间配置器。容器分为序列式(如vector、deque)和关联式(如set、map),通过迭代器连接算法。STL支持泛型编程,提升代码复用性,但需注意迭代器失效问题(如vector扩容时)。性能优化技巧包括预留空间、选择合适容器等。STL广泛应用于数据结构与算法实现,是C++开发的重要工具。
2025-05-25 13:26:35
925
原创 STM32 的 GPIO 多种输入输出模式分不清?本文一站式搞懂!
STM32的GPIO(通用输入输出端口)是连接芯片与外部设备的核心接口,支持多种输入输出模式。输入模式包括浮空、上拉、下拉和模拟输入,分别适用于不同电平检测和模拟信号采集场景。输出模式包含推挽、开漏及复用模式,可用于驱动LED、I2C通信等应用。使用GPIO需先启用时钟,再配置模式(如推挽输出控制LED),最后通过置位/复位引脚控制设备。合理选择GPIO模式能提升系统稳定性和可靠性。
2025-05-25 13:09:15
1133
原创 数据库中表的设计规范
数据库表结构主要由列、行、主键和外键构成,其中列存储单一数据项,行是唯一记录。主键分为业务主键和代理主键,用于唯一标识记录;外键则用于表间关联。关系范式(1NF-3NF)通过约束确保表结构设计合理:1NF要求字段不可再分;2NF要求非主键字段完全依赖主键;3NF消除非主键间的传递依赖。规范化设计能减少冗余、保证数据一致性、简化维护并提高查询效率,但在特定场景下可能采用反范式优化性能。
2025-05-24 19:33:30
521
原创 进阶!归并排序代码实现(C语言)
归并排序是一种采用分治策略的高效排序算法。其核心思想是将数组递归分解为最小单元后有序合并,C语言实现需注意分解、合并和递归调用三个关键环节。算法时间复杂度稳定为O(nlogn),但需要O(n)额外空间。具体步骤包括:分解数组至单个元素、合并两个有序子数组、递归完成整体排序。代码实现展示了分块归并的过程,通过交替使用辅助数组完成排序,最终确保结果存储在原始数组中。该算法性能优越,适合大规模数据排序。
2025-05-22 11:52:57
367
原创 校招面试必考!快速排序(C语言)
快速排序是一种高效的分治排序算法,通过选择基准值将数组划分为左右两部分并递归排序。C语言实现要点包括基准值选择(如三数取中法)、分区操作和递归处理。时间复杂度平均为O(nlogn),最坏情况O(n²)可通过优化避免。具体步骤为:1)选择基准值;2)分区操作交换元素;3)递归排序子数组。文末给出了完整的快速排序C语言实现代码。
2025-05-22 11:23:33
357
原创 几种排序方式的C语言实现(冒泡、选择、插入、希尔等)
定义两个指针, Left Right 左指针右移找到比基准大的数, 右指针左移找到比基准小的数,两个指针交换内容,假设未排序的第一个为最小值,然后遍历未排序的内容,找到真正的最小值,和未排序的第一个位置互换,相邻两个元素比较,若前面一个元素大,就交换位置,一轮进行n-1次比较,一共执行n-1轮。基准:第一个或者最后一个元素, 优化方案:第一个、最后一个,中间元素 ,三个数的中间值。- 其他排序:冒泡、选择、插入、快速、归并、希尔、堆……- OO(n*n):冒泡、选择、插入、希尔...然后十位、百位、、、
2025-05-16 19:19:06
271
原创 C++ 核心知识全面解析:从基础语法到面向对象与 STL
这是因为成员函数的第一个参数是隐式的 this 指针,它指向调用该函数的对象(必须是类类型)。如果类的变量开辟在堆区,然后再用赋值操作,P1=P2则P2的变量和P1的变量指向同一块堆区内存,在析构时就会对同一区域释放两次,造成程序崩溃。,但前向声明只告诉编译器 GoodGay 是一个类,而不会提供其成员函数的声明。这段代码打印时,只有第一次可以正常打印,因为局部变量在释放时,编译器会保留一次,但是第二次就不再保留了。当其他类的对象作为本类成员,构造时,先构造本类的对象,再构造自身, 先构造A,再构造B。
2025-05-10 10:23:01
478
原创 力扣题解:2、两数相加
个人认为,该题目可以看作合并两个链表的变种题,本题与21题不同的是,再处理两个结点时,对比的不是两者的大小,而是两者和是否大于10,加法计算中大于10要进位,所以我们需要声明一个用来标记是否进位的值。3、每次相加后,可能会有进位(即和大于等于10),需要将进位加到下一位的计算中。5、如果遍历完所有节点后仍有进位,需要额外创建一个节点来存储这个进位。2、同时遍历两个链表,将对应位置的数字相加,并考虑前一位的进位。4、如果两个链表长度不同,较短的链表在后续遍历中可以视为。
2025-05-10 10:19:55
472
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅