自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 ACWing19:堆排序

如何手写一个堆?(完全二叉树)1、插入一个数 heap[++size]=x;up(size);2、求集合中最小值 heap[1];3、删除最小值 heap[1]=heap[size];size--;down(1);4、删除任意元素(stl实现不了) heap[k]=heap[size];size--;down(k);up(k);5、修改任意元素(stl实现不了) heap[k]=x;down(k);up(k);

2025-11-06 15:47:54 163

原创 ACWing18:并查集

摘要:本文记录了CSP学习中关于并查集(836和837题)的实现方法。836题介绍了并查集的基本操作:查询(带路径压缩优化)、合并和判断连通性。837题在836基础上增加了维护集合大小的功能。关键点包括:路径压缩优化可提高查询效率,合并时需注意先处理集合大小再合并父节点,避免重复计算。代码实现展示了初始化、查找、合并等核心操作,解决了集合连接判断和统计集合大小的问题。

2025-11-06 10:59:57 411

原创 ACWing17:Trie树

本文介绍了Trie树(字典树)的基本原理与实现方法。Trie树是一种高效存储和查询字符串集合的数据结构,通过共享前缀来优化空间使用。文章详细说明了Trie树的插入和查询操作:插入时从根节点开始,为不存在的字符创建新节点并在字符串结尾处标记;查询时沿字符路径查找,仅当路径完整且存在结尾标记时才判定字符串存在。代码实现使用二维数组son存储子节点,cnt数组记录字符串出现次数,通过idx动态分配节点编号。文末给出了一个支持插入和查询操作的完整C++程序示例。

2025-11-05 21:53:08 170

原创 ACWing16:单调队列-滑动窗口

本文记录了使用单调队列解决滑动窗口问题的算法思路和实现代码。核心思想是维护一个单调递增或递减的双端队列来处理窗口移动时的元素变化:1)判断队首是否超出窗口范围;2)保持队列单调性;3)在窗口达到指定大小时输出队首元素。代码展示了分别求最小值和最大值的实现,通过调整比较条件来切换队列的单调性。该算法时间复杂度为O(n),适用于处理滑动窗口极值问题。

2025-10-26 13:37:25 155

原创 ACWing15:单调栈-最近最小的元素

摘要:本文记录了使用单调栈解决寻找左边第一个较小元素问题的思路。通过反向思考,利用while循环处理栈顶元素:当入栈元素更小时弹出无用大元素,较大时输出栈顶元素作为结果。代码实现包含输入处理、栈操作和输出逻辑,通过维护单调递减栈高效解决问题。核心思想是保持栈内元素的单调性,确保每次都能快速找到最近较小值。

2025-10-26 11:49:23 224

原创 ACWing14:表达式求值

这篇文章介绍了使用双栈法(一个存储数字,一个存储运算符)来实现表达式求值的解题思路。通过哈希表定义运算符优先级,处理括号匹配和运算顺序。核心代码展示了如何从字符串中解析数字和运算符,并按照优先级进行计算,最后输出结果。这种方法能有效处理带括号的四则运算表达式。

2025-10-21 15:42:34 144

原创 ACWing13:数组模拟简单的数据结构

用数组模拟单链表,单链表的数据结构中有,在数组中我们使用表示节点值,表示下一个节点的下标,对于新开的节点我们不能使用new就用idx代替,因为存储的是下标,所以代表新的下标产生,也就等同于创建了新节点。fi:表示next的下标值,初始化为-1,表示next为空,头插法先把新节点值付给idx下标,进行头插首先需要明确一点,第k个插入的数,不是从头遍历第k个数,而是下标为k-1的数,因为idx从0开始。但是删除操作很简单:同理,操作如下,注意第k个插入和下标k-1的关系。

2025-10-21 11:51:59 522

原创 ACWing12:双指针系列模板

本文总结了CSP考试中双指针算法的应用,重点分析了799题(最长连续不重复子序列)和800题(数组元素的目标和)的解题思路。对于799题,使用左右指针法,通过维护一个计数数组来记录元素出现次数,当遇到重复元素时移动左指针,计算最大不重复子序列长度。800题介绍了三种解法:双指针法(从两端向中间查找)、二分查找法(在第二个数组中查找目标值)和哈希表法(存储数组元素及其下标)。文中给出了各题的具体代码实现,展示了双指针算法在优化时间复杂度(从O(n²)到O(n))方面的优势。

2025-10-14 15:26:01 324

原创 ACWing11:离散化

摘要: 本文记录了CSP学习中离散化算法的核心思想与应用。离散化通过将大范围稀疏坐标映射到连续数组下标,节省空间并提升效率。关键步骤包括收集所有坐标、排序去重、建立二分映射关系。文中指出去重的重要性:确保映射唯一性、正确计算前缀和、优化空间利用率。代码实现展示了如何处理插入和查询操作,通过维护前缀和数组快速响应区间求和。典型应用场景为坐标范围大但实际使用点稀疏的问题,如大规模数据下的区间统计。

2025-10-13 14:44:43 353

原创 ACWing10:差分-求某个区间内元素加上c

本文介绍了差分算法的核心思想及其应用。差分是前缀和的逆运算,通过构建差分数组可以高效处理区间或矩阵的批量加减操作。一维差分通过b[l]+c和b[r+1]-iero实现,将区间[l,r]的加法操作优化到Omoral(1)时间复杂度。二维差分则通过四个关键点的加减操作实现矩阵区域的快速更新。文章给出了C++代码实现,展示了如何利用差分技术高效解决区间/矩阵更新问题,相比暴力解法显著提升了算法效率。

2025-10-02 12:25:02 368

原创 ACWing09:前缀和-求某个区间内元素和

本文介绍了前缀和的概念及其在快速计算数组区间和中的应用。前缀和S[i]表示数组前i项的和,通过构建前缀和数组可以高效求解任意区间[l,r]的和,计算公式为S[r]-S[l-1]。文章给出了C++实现代码,包括数据输入、前缀和数组构建以及区间查询处理,并强调了数组下标从1开始以避免边界问题。该算法适用于需要频繁查询数组区间和的场景,时间复杂度为O(n)。

2025-09-30 19:24:36 258

原创 ACWing08:高精度专题

本文记录了高精度加减法的算法实现要点。高精度运算适用于数字长度超过10^6的情况。加法部分通过倒序存储数字、逐位相加并处理进位实现;减法部分需额外处理借位、负数结果及前导0问题。两算法均采用vector存储数字,通过判断大小确保减法操作的正确性,最后逆序输出结果。代码示例展示了完整的实现过程,包括字符串转数字、运算处理和结果输出等关键步骤。

2025-09-29 21:31:35 1024

原创 ACWing07:区间和并

本文介绍了区间合并算法的实现思路和代码。算法首先将区间按左端点排序,然后遍历处理相邻区间:若两区间相交则合并(取右端点最大值),否则保留为独立区间。文章详细说明了5种区间相交情况,并提供了C++代码实现,包括排序、遍历合并和结果存储等关键步骤。最终输出合并后的区间数量。该算法适用于处理大量区间的合并问题,能有效减少区间数量。

2025-09-26 17:45:01 698

原创 ACWing06:数的三次方根

本文记录了使用二分法求解三次方根的算法思路。通过确定初始区间[-100,100],不断取中点进行三次方运算,比较结果与目标值n的大小关系来调整搜索区间。经过100次迭代后,输出左边界作为近似解,保留6位小数。该方法利用二分查找高效逼近立方根,适用于浮点数精度要求的场景。

2025-09-25 12:24:07 203 1

原创 ACWing05:数的范围

这篇文章探讨了二分法在算法中的应用技巧。作者通过实例分析了二分查找中边界条件的处理,指出当使用l=mid时需将mid设为(l+r+1)/2避免死循环,而使用r=mid时应设为(l+r)/2。文章还打破常规认知,指出二分法不一定要在有序数据中使用,关键在于能否确定搜索方向。最后给出了查找元素左右边界的代码实现,强调在处理边界条件和递归终止条件时需要注意的细节。

2025-09-20 17:06:46 839

原创 ACWing04:逆序对的数量

本文介绍了归并排序算法及其在计算逆序对中的应用。归并排序采用分治法思想,将数组递归划分为单个元素后有序合并。在合并过程中,当左半部分元素大于右半部分时,即可统计逆序对数量。文章给出了具体实现代码,通过修改归并排序,在合并阶段累加逆序对数目(当arr[i]>arr[j]时,逆序对数增加mid-i+1)。该算法能高效解决逆序对统计问题,时间复杂度为O(nlogn)。

2025-09-20 16:22:43 208

原创 ACWing03:归并排序

本文介绍了归并排序算法的原理和实现。归并排序采用分治思想,将数组不断二分递归排序,再通过双指针合并有序子数组。文章详细说明了算法步骤:确定分界点、递归排序左右子数组、合并两个有序数组的过程,并给出了具体示例。代码实现部分展示了C++的归并排序函数,包括递归终止条件、双指针合并操作以及临时数组的使用注意事项。特别强调了临时数组数据必须复制回原数组对应位置的重要性,以确保后续递归操作基于正确的有序数据。

2025-09-20 16:09:17 563

原创 ACWing02:第k个数

本文记录了快速排序算法的学习要点。算法采用分治思想:1)选择中间值作为分界点;2)使用双指针从两端向中间扫描,交换不满足条件的元素;3)递归处理左右子数组。特别指出当元素全等时需注意无限递归问题。代码实现包含快速排序函数和主程序,读取输入数组后排序并输出第k小元素。示例采用C++的vector容器,分界点取中间值,通过do-while循环避免数组越界问题。

2025-09-19 21:19:17 271

原创 ACWing01:快速排序

本文记录了快速排序算法的学习要点。快速排序采用分治思想,通过选取基准值将数组分为左右两部分递归排序。关键点包括:1)选择中间值作为基准可避免边界问题;2)使用双指针i、j进行分区操作;3)递归终止条件为l≥r;4)时间复杂度平均为O(nlogn),最坏O(n²);5)递归调用时使用j而非i作为分割点可防止无限递归。文章还给出了具体代码实现,展示了排序过程及注意事项,如处理数组越界和特定情况下的递归优化。

2025-09-15 20:33:13 316

空空如也

空空如也

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

TA关注的人

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