自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(39)
  • 收藏
  • 关注

原创 latex如何批注对比前后文修改

本文介绍了使用latexdiff工具比较两个LaTeX文档版本(old.tex和new.tex)的方法。首先需要安装latexdiff环境并验证安装成功,然后通过命令行生成修订版diff.tex。当文档中存在文献修改时,生成的tex文件可能出现空白序号问题,可通过删除相关划线部分解决。该方法适用于追踪LaTeX文档的修改记录。

2025-11-26 17:36:40 176

原创 LeetCode 53 最大子数字和(动态规划)

摘要:本文介绍使用动态规划解决最大子数组和问题。通过定义dp[i]为以nums[i]结尾的最大子数组和,建立状态转移方程dp[i] = max(dp[i-1]+nums[i], nums[i])。初始化dp[0]=nums[0],遍历数组时维护最大值ans。最终返回ans即为所求结果。该方法时间复杂度O(n),空间复杂度O(n),能高效求解该问题。

2025-09-28 17:28:09 367

原创 leetcode 560 和为k的子数组

该代码实现了查找数组中所有和为k的连续子数组数量。使用哈希表存储前缀和及其出现次数,通过计算当前前缀和与目标值k的差值来快速查找符合条件的子数组。时间复杂度为O(n),空间复杂度为O(n)。核心思想是利用前缀和差值匹配,避免重复计算。

2025-09-28 11:49:28 135

原创 leetcode 438 找到字符串中所有的字母异位词

本文介绍了一种使用滑动窗口法在字符串s中查找p的所有字母异位词的方法。通过维护一个26位数组记录p中各字母出现次数,滑动窗口遍历s时动态更新数组:右边界扩展则对应字母计数减1,当某字母计数小于0时左边界右移并恢复对应字母计数。当窗口长度等于p长度时,记录左边界。该方法高效地找到所有符合条件的子串起始位置。

2025-09-27 15:45:59 155

原创 leetcode 3 无重复字符的最长子串

本文介绍了一种使用滑动窗口法求解最长无重复字符子串的算法。通过维护一个哈希表记录字符出现次数,当遇到重复字符时移动左边界直至消除重复,同时不断更新最大窗口长度。该算法时间复杂度为O(n),空间复杂度为O(字符集大小),能有效解决问题。实现时需注意边界条件的处理,如空字符串或全相同字符的特殊情况。

2025-09-27 14:45:44 197

原创 LeetCode 21 合并两个有序链表

该算法实现两个有序链表的合并。创建一个虚拟头节点list3,比较两个链表当前节点的值,将较小值接入list3,并移动对应指针。当任一链表遍历完后,将剩余链表直接接入list3。时间复杂度O(n+m),空间复杂度O(n+m)。关键在于逐个比较节点值并按序连接,最后处理剩余节点。

2025-09-19 17:07:13 204

原创 LeetCode 912 排序数组

2、然后根据该基准数P,不断比较左侧和右侧的数,若是左侧小于P,那就L++,要是右侧大于P,那就R--,直到,找到左侧大于P右侧小于P的下标,然后交换两个下标,记录当前R的位置。3、然后更新基准数的位置到R,再根据这个基准数的位置分为左右两侧,再在左右两侧分别重复2的操作,直到全部完成排序。写这题主要是为了学习快速排序算法。1、先随机找一个基准数;

2025-09-19 11:34:15 189

原创 LeetCode 746 使用最小花费爬楼梯

本文介绍了解决动态规划问题的五步方法论,并以爬楼梯最小成本问题为例进行实践。解题步骤包括:定义dp数组及其含义、确定递推公式、初始化数组、明确遍历顺序及手动推导验证。具体实现中,dp[i]表示到达第i阶的最小成本,初始条件为dp[0]=dp[1]=0,递推时比较前两阶的转移成本(dp[i-1]+cost[i-1]和dp[i-2]+cost[i-2]),取最小值更新当前状态。最终返回dp数组末尾值即为最优解。该解法时间复杂度O(n),空间复杂度O(n),清晰体现了动态规划自底向上的求解思想。

2025-09-18 15:19:20 238

原创 leetcode 349 两个数组的交集

该代码实现了求两个数组的交集。使用unordered_set存储nums1的元素实现去重,然后遍历nums2,将存在于nums1的元素存入结果集。最终将结果集转为vector返回。关键点:1)利用set特性自动去重;2)find()查找元素,未找到时返回end()迭代器;3)时间复杂度O(m+n),空间复杂度O(m)。(99字)

2025-09-17 22:10:08 167

原创 LeetCode 242 有效的字母异位词

这题类似于快速查找,我们可以用一个数组来存每个字母出现的次数,因为一共有26个字母,我们可以定义一个26大小的数组来存储每个字母出现的次数。然后再另一个字符中减去对应的字母,若是最后全部为0,便说明是字母异位词。

2025-09-17 21:09:20 256

原创 LeetCode 27 移除元素

这道题的主要目的是为了移除数组中出现的目标元素,并且由于不用管后续的其余元素,所以我们可以使用双指针法来进行实现。

2025-09-17 20:54:47 147

原创 区间和计算(模拟笔试)

练习该题主要是为了熟系ACM的输入输出模式,因为之前笔试时遇到根本写不出来(痛苦)需要自己写头文件还有输入输出,面试、笔试必备技能。

2025-09-04 11:26:49 229

原创 LeetCode 59 螺旋矩阵二

这篇文章介绍了一种生成螺旋矩阵的算法。通过定义矩阵边界(left,right,up,down)并不断循环填充数字,每次循环后缩小边界范围。当n为奇数时,单独处理中心元素。时间复杂度为O(n²),空间复杂度为O(n²)。算法采用层层递进的方式填充数字,每次循环完成一圈后更新边界和起始位置,直到填满整个矩阵。

2025-09-03 20:21:29 175

原创 LeetCode 209 长度最小的子数组

摘要:本文介绍了一种使用滑动窗口法求解最小长度子数组的算法。通过维护左右边界指针,在单次遍历中动态调整窗口大小,当子数组和达到目标值时更新最小长度。相比暴力解法的O(n²)复杂度,该方法将时间复杂度优化至O(n)。关键步骤包括:累加右边界元素、满足条件时收缩左边界、实时更新最小长度。最后处理未找到解的情况返回0。该方法有效解决了连续子数组求和问题。

2025-09-03 17:18:12 159

原创 梯度消失和爆炸的原因、如何解决

1、深层网络里,反向传播时梯度连乘,若激活函数导数<1(如sigmoid、tanh),会指数级衰减;1、激活函数:用ReLU、Leaky ReLU代替sigmoid/tanh;解决消失要换激活、加残差、正则化;解决爆炸要裁剪梯度、调学习率、正则化。3、结构改进:残差网络(ResNet)、LSTM/GRU缓解长序列衰减;1、反向传播时,若导数>1,会指数级放大;2、权值初始化过小,梯度传播时不断缩小;2、初始化:Xavier/He初始化;2、权值初始化过大,或学习率设置过大;3、深层网络、RNN容易出现、

2025-08-29 17:18:11 649

原创 如何排查内存泄露

监控工具:Linux下 top/htop/ps ,查看进程内存是否持续增长;使用RALL(内存获取即初始化),如C++ smart pointer(unique_ptr,shared_ptr)日志打印/手动追踪:在 malloc/new 和 free/delete 处加载日志,记录调用栈或指针地址;代码审查:常见遗漏点:异常路径没释放、循环内反复分配、忘记delete[]、容器内存未释放。内存泄露就是申请的堆内存没有被释放,长期运行会导致内存耗尽甚至崩溃。养成规范:谁申请谁释放,异常分支要注意释放资源。

2025-08-29 11:44:46 239

原创 TCP中粘包、拆包如何解决

(最常用):在消息前面加上一个固定长度的字段(如4字节int),表示后面的消息长度;接收方先读长度字段,再读指定长度的数据。常见与二进制协议(Protobuf、Thrift)问题背景:TCP的流式协议,没有边界,发送方发送了两次数据,接收方可能一次收到(粘包),也可能只收到一半(拆包);所以应用层必须自己定义消息边界。:在每条消息后加一个特殊标识符,例如\n、\r\n;常见与文本协议(HTTP、SMTP)注意:需要确保在数据本身中不会出现分割符。:每条消息固定长度,比如1024,不足补0;

2025-08-29 11:22:21 183

原创 内存管理之--内存页(Page)、页表(Page Table)、TLB(Translation Lookaside Buffer)

协同本质:内存页提供资源划分标准,页表充当映射权威目录,TLB作为目录的热点缓存----三者以空间换时间(多级页表省内存)、以缓存补延迟(TLB加速访问),共同支撑虚拟内存的安全隔离与高性能访问。

2025-08-28 20:13:08 349

原创 僵尸进程和孤儿进程

1、父进程未处理子进程退出状态:子进程通过exit()终止时,会向父进程发送SIGCHLD信号,若父进程未注册信号处理函数或未调用wait()系列函数读取子进程退出状态,子进程的PCB无法释放,成为僵尸进程;2、父进程信号处理不当:父进程虽注册了SIGCHLD信号处理函数,但函数中未使用循环调用waitpid(-1,NULL,WNOHANG)处理终止所有流程,导致部分子进程遗漏回收;1、父进程意外终止:父进程因段错误、为处理信号或系统崩溃而退出,子进程仍在运行,此时操作系统将子进程的父进程重置为init;

2025-08-28 17:35:02 145

原创 每日八股之--C++中的智能指针

实际开发中遵循能用unique_ptr则不要shared_ptr的原则,优先用make_unique/make_shared创建以保证异常安全,同时结合自定义删除器管理非内存资源。这套机制不仅提升代码健壮性,还能显著降低内存泄露的风险,是现代C++资源管理的核心范式。,通过对象的生命周期自动释放资源,彻底解决手动管理内存时的泄露和悬空指针问题。(多个指针共享同一对象,计数归零时释放),(禁止拷贝、支持移动);

2025-08-28 16:45:09 139

原创 如何理解ARM架构

这是嵌入式领域的核心,针对微控制器设计,主要特点为中断响应快、功耗极低、成本非常便宜,主要运行FreeRTOS等实时系统或直接用于裸机开发。其次,由于ARM不自己生产芯片,而是通过授权IP核(如Cortex-M系列)或指令集给其他公司,催生了现在诸多公司不同的ARM芯片;RISC(ARM):像标准的扳手和螺丝刀,每个工具只能做一件事,但组合起来效率高,且本身非常轻巧。最后,在我看来,ARM和X86是两种不同的设计产物,没有绝对的优劣。理念的处理器架构,它的设计目的主要是为了。

2025-08-26 16:22:46 145

原创 C++中编译的四个步骤

C++编译过程分为4个阶段:预处理处理宏和头文件生成.i文件;编译检查语法生成.s汇编代码;汇编转换二进制生成.o目标文件;链接组合目标文件和库文件生成可执行程序。各阶段可能产生不同错误,如语法错误在编译阶段,未定义引用在链接阶段。预处理执行#指令,编译优化代码结构,汇编生成机器码,链接分为静态和动态两种方式。

2025-08-26 15:38:14 141

原创 LeetCode 28 找出字符串中第一个匹配项的下标

该算法实现了字符串匹配功能,返回needle在haystack中首次出现的索引。处理边界条件:needle为空返回0,haystack长度不足返回-1。通过遍历haystack,在剩余长度足够时进行字符匹配,利用双指针比较字符,当完全匹配时返回起始位置,否则返回-1。时间复杂度优化体现在仅遍历可能的匹配起始点。

2025-08-20 16:10:28 174

原创 LeetCode 151 反转字符串中的单词

本文介绍了一种使用双指针法反转字符串中单词顺序的算法。首先通过快慢指针去除多余空格,保留单词间单空格;然后整体反转字符串;最后逐个反转每个单词。算法分为三步:1)去除多余空格;2)整体反转字符串;3)逐个反转单词。时间复杂度为O(n),空间复杂度为O(1)。该解法高效地实现了字符串中单词顺序的反转,同时优化了空间复杂度。

2025-08-20 15:48:39 112

原创 LeetCode 541 反转字符串2

本文总结了字符串反转问题的解题思路。关键在于将题目条件简化为两种情况:当剩余字符≥k时反转前k个,不足k时则全部反转。通过每次移动2k步长,判断剩余字符数量来决定反转范围,避免复杂分类。核心解法是循环遍历字符串,以2k为间隔,反转每个区间的前k个字符,剩余不足k时整体反转。这种方法将看似复杂的条件简化为清晰的两步判断,提高了代码的可读性和执行效率。

2025-08-19 21:45:06 540

原创 LeetCode 1047 删除字符串中所有相邻重复项

看到这种删除重复项,马上想到栈,因为可以先入栈,然后判断下一个是否相等,再进行删除操作,最后没删除的就是没有重复的。

2025-08-19 21:41:06 189

原创 LeetCode 150 逆波兰表达式求值--栈实现

由题意可知每遇到一次运算符就将前两个数字拿出来计算,那边便可以用栈来存储数字,当遇到运算符时,将栈顶的两个数字退出来,然后进行运算再压入栈内,(这里使用栈的原因是栈的特性是后入先出)

2025-08-03 15:24:00 166

原创 LeetCode 20 判断有效的括号--栈实现

本文介绍了一种利用栈结构解决括号匹配问题的算法。算法首先检查字符串长度是否为奇数,若是则直接返回false。然后遍历字符串,遇到左括号时将其对应的右括号压入栈中,遇到右括号时检查是否与栈顶元素匹配。若栈空或栈顶不匹配则返回false,否则弹出栈顶元素。最终当字符串遍历完且栈为空时返回true,表示所有括号都正确匹配。该方法高效利用了栈的后入先出特性,时间复杂度为O(n),空间复杂度为O(n)。

2025-07-31 22:34:26 183

原创 LeetCode 225 用队列实现栈

摘要:本文展示了如何用两个队列实现栈的功能。由于队列的先进先出特性,不能像栈那样直接反转顺序。核心思路是:在pop操作时,将主队列que1的前n-1个元素转移到辅助队列que2,剩下的最后一个元素即为栈顶元素。类似地,top操作也需要转移元素但保留原队列顺序。该方法也可通过循环移动单个队列中的元素来实现。代码示例中的MyStack类完整实现了栈的push、pop、top和empty操作。

2025-07-31 21:54:03 245

原创 LeetCode 232 用栈实现队列

栈的思想是先进后出,而队列是先进线出,这里可以看到是相反的,所以在本题中,我们可以先将stIn中的元素push到stOut中,这样便实现了顺序反转,然后再按照要求操作stOut内的元素便是对应对列的顺序了。

2025-07-31 21:19:44 228

原创 TCP和UPD的区别

TCP和UDP是两种主要的传输层协议。TCP是面向连接的可靠协议,通过三次握手建立连接,提供数据确认、重传机制和流量控制,保证数据完整有序,但传输效率较低。UDP是无连接的不可靠协议,无需建立连接,直接发送数据报,不保证数据可靠性和顺序性,但传输效率更高。TCP没有固定数据包大小限制,UDP每个数据报限制为65535字节。TCP适用于要求可靠传输的场景,UDP更适合实时性要求高的应用。

2025-07-31 11:46:40 229

原创 PID算法

摘要:PID控制是自动化系统中常用的反馈控制算法,由比例(P)、积分(I)、微分(D)三部分组成,分别实现快速响应、消除稳态误差和预测系统变化的功能。比例项根据误差大小调节输出,积分项通过累积误差实现补偿,微分项则抑制系统振荡。三者协同工作,使系统输出快速平稳地达到目标值。

2025-07-30 23:19:51 209

原创 操作系统--进程间的通信方式

共享内存:不同进程间可以通过访问同一块物理内存实现数据共享。命名管道:适用于没有亲缘关系的进程,通过特殊文件实现通信。套接字:通用的进程间通信机制,可以实现不同主机间的通信。消息队列:通过消息队列来发送和接收消息,实现异步通信。管道:适用于有亲缘关系的进程,是一种单向的通信方式。文件:通过操作文件实现进程间的通信和数据交换。信号量:用于进程间的同步和互斥操作。

2025-07-29 16:41:33 132

原创 LeetCode 19 删除链表的倒数第N个结点

摘要:本文介绍了一种使用快慢指针删除链表倒数第n个节点的方法。算法首先让快指针移动n位,然后快慢指针同时移动直至快指针到达链表末尾,此时慢指针指向要删除节点的前驱节点。通过调整指针即可完成删除操作。使用虚拟头节点处理边界情况,确保删除头节点时也能正确操作。该方法避免了计算链表长度,时间复杂度为O(n),空间复杂度为O(1)。

2025-07-29 15:37:18 143

原创 每日八股之——strcpy和strncpy的区别

摘要:strcpy可能导致缓冲区溢出,不安全;strncpy限制拷贝长度但不保证'\0'结尾,易产生野指针。建议手动补'\0'(如dst[sizeof(dst)-1]='\0'),或使用更安全的strlcpy/snprintf函数替代。strcpy遇到'\0'停止拷贝,而strncpy在src≥n时不会自动补终止符,存在风险。

2025-07-29 11:38:25 129

原创 LeetCode 24 两两交换链表中的节点

该代码实现了链表中相邻节点两两交换的功能。通过创建虚拟头节点(dummyHead)简化操作,使用循环依次处理每对相邻节点。在循环中,使用临时指针保存节点引用,调整节点间的next指针完成交换,然后将当前指针(cur)前进两位继续处理后续节点。最后返回处理后的链表头节点并释放虚拟头节点内存。算法时间复杂度为O(n),空间复杂度为O(1)。

2025-07-29 11:08:18 243

原创 LeetCode 206 反转链表

该摘要总结了链表反转的实现方法:通过遍历链表,每次将当前节点(cur)的next指针指向前一个节点(pre),完成方向反转。然后pre和cur分别前移一位,直到遍历完整个链表。关键操作是cur->next=pre,配合临时变量temp保存下一节点地址。最终返回的pre指向新链表的头节点。

2025-07-29 10:24:14 210

原创 LeetCode 203题 移除链表元素

本文介绍了链表删除节点的基本操作。针对删除特定值节点的问题,文章指出需要区分头节点和非头节点两种情况:对于头节点,需直接移动头指针;对于非头节点,则通过修改前驱节点的next指针实现删除。文中提供了C++代码示例,演示了如何处理这两种情况,并确保正确释放被删除节点的内存。该方法有效地遍历链表并删除所有匹配节点,最终返回更新后的链表头指针。

2025-07-28 22:23:24 133

原创 LeetCode 59螺旋矩阵 C++解法

本文介绍了构造螺旋矩阵的算法思路。首先定义二维数组存储数据,然后按照右、下、左、上的顺序依次填充数字。关键点包括:当横向或纵向填充到边界时改变方向;注意循环次数为n/2次;当n为奇数时需单独处理中心元素。该算法通过方向变换和边界判断实现螺旋填充,适用于生成任意尺寸的螺旋矩阵。

2025-07-28 17:26:56 237

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除