- 博客(54)
- 收藏
- 关注
原创 广度优先搜索详解(BFS)
广度优先搜索(Breadth-First Search,简称BFS),也称为宽度优先搜索,是图与树结构中最基础的遍历算法之一。与深度优先搜索(DFS)的遍历逻辑不同,BFS采用的策略:从起点出发,先遍历所有与起点距离为1的节点,再遍历距离为2的节点,以此类推,逐层向外扩展,直到遍历完所有可达节点。
2026-06-06 17:13:17
337
原创 动态规划——背包问题
背包问题的核心场景非常简单:你有一个容量有限的背包,还有一堆物品,每个物品有重量、价值等属性,你要选一些物品放进背包,在不超过背包容量的前提下,最大化总价值。根据物品的不同限制,背包问题衍生出了非常多的变种,我们一个个来看。dp[i][j]:前 i 件物品,背包容量为 j 时,能获得的最大价值。选或者不选,根据物品的限制调整转移的顺序和条件。学会了这五种最常见的背包,你就已经搞定了 99% 的背包问题,不管是 LeetCode 刷题,还是算法竞赛,都能轻松应对。
2026-05-02 17:08:53
430
原创 关于前缀和
本篇讲解二维前缀和核心用法,配套完整可直接运行的 C++ 模板代码。先读入二维矩阵,提前预处理前缀和数组,利用公式快速算出任意矩形区间总和。单次查询只用 O (1) 时间,适合多组询问、静态矩阵求和题目。代码排版规范、变量清晰,全程开 long long 防溢出,边界写法标准,适合刷题直接套用。
2026-05-02 16:57:14
408
原创 优先队列讲解
本文详细介绍了C++中的优先队列(PriorityQueue),主要内容包括:优先队列的概念与特性(基于二叉堆实现,入队出队时间复杂度O(logn));基本语法与两种常用定义方式(大顶堆和小顶堆);核心操作(push、pop、top等);自定义数据类型的实现方法;经典应用场景(TopK问题、Dijkstra算法等);以及常见使用注意事项(如默认是大顶堆、pop不返回值等)。文章最后给出了一个完整的TopK问题解决方案示例。
2026-05-02 16:11:01
385
原创 快速幂
摘要 快速幂算法通过将幂运算分解为更小的子问题,将时间复杂度从O(n)优化到O(logn)。该算法利用递归和分治思想,当指数为偶数时分解为平方运算,为奇数时转换为偶数情况处理。算法模板包含递归实现和取模操作,后者在计算大数幂时尤为重要,需要在每一步运算后进行模运算以防止溢出。快速幂适用于大指数场景,如b=1000000时的计算优化。
2026-02-06 20:08:45
83
原创 c++唯一分解定理模板
这段C++代码用于对一个整数n进行质因数分解。程序通过循环从2开始测试每个数i是否为n的因数,当找到因数时,将其所有出现次数输出。最后如果n仍大于1,则输出剩余的质因数。该代码适用于解决完全平方数问题和质因数分解问题,核心思想是通过试除法找出所有质因数。代码使用了标准输入输出,时间复杂度约为O(√n)。
2026-02-01 15:44:13
39
原创 结构体排序,双指针,单调栈
本文包含四个算法题解:1. 区间合并:合并有交集或首尾相接的时间段,输出合并后的区间。输入m个[l,r]区间,排序后合并相邻区间,时间复杂度O(nlogn)。2. 活动选择:选择最多不重叠活动。按结束时间排序后贪心选择,时间复杂度O(nlogn)。3. 最长无重复子序列:使用双指针和哈希表维护无重复区间,时间复杂度O(n)。4. 最大矩形广告牌:利用单调栈求每个高度的最大宽度,计算最大面积,时间复杂度O(n)。所有解法都针对大规模数据(n≤10^5)进行了优化。
2026-01-31 22:43:44
78
原创 洛谷 B4452 [GESP202512 四级] 优先购买 题目详解
【代码】洛谷 B4452 [GESP202512 四级] 优先购买 题目详解。
2026-01-24 17:11:59
267
原创 单调栈详解(含题目)
本文介绍了单调栈的原理和应用场景。单调栈主要用于解决寻找元素左右第一个比其大/小的元素的问题,通过维护单调递增或递减的栈结构实现。文章给出了五个典型题目及解法:1)"向左看齐"求左侧最近较小元素位置;2)洛谷P5788模板题求右侧第一个较大元素;3)"Aki的能量防护墙"通过左右单调栈求最大矩形面积;4)洛谷P2422结合单调栈和前缀和求最大舒适度区间;5)洛谷P2947求奶牛仰望对象。这些题目展示了单调栈在不同方向和不同单调性下的应用,时间复杂度均为O(n
2026-01-24 17:03:19
332
2
原创 数据结构有关的题目(栈,队列,set和map)
本文摘要包含6个编程题目及其解决方案: 栈顺序验证:检查给定出栈顺序是否合理,使用栈模拟进出过程; 括号匹配:验证括号字符串是否合法,通过栈结构实现; 约瑟夫环:模拟报数出圈过程,使用队列实现; 数组去重:利用集合自动排序和去重特性; 词频统计:统计单词出现频率,忽略大小写差异; 向左看齐:使用单调栈算法查找左侧最近较小元素位置。所有题目均提供完整C++代码实现,涉及栈、队列、集合、哈希表等数据结构应用。
2026-01-17 16:49:52
236
原创 图的存储
完全图:每两个顶点之间都有一条边连接 边数:n(n-1)/2。完全有向图:每两个顶点之间都有两条边连接 边数:n(n-1)非连通图:从某个顶点出发,至少有一个顶点无法到达。连通图:从某个顶点出发,可以到达其余任意顶点。树的边数:(n-1)
2025-12-20 19:32:53
158
原创 关于欧拉图
本文介绍了欧拉图的基本概念、性质和应用。欧拉图指存在经过每条边恰好一次的回路(欧拉回路)的图,而半欧拉图则指存在欧拉路径但无欧拉回路的图。关键性质包括:连通图中所有顶点度数为偶数(有向图入度等于出度),且可分解为不共边回路的并。文章详细证明了这些性质的等价性,并介绍了构造欧拉回路的Hierholzer算法,其时间复杂度为O(|E|)。此外,还讨论了欧拉图在计算机译码等领域的应用,并提供了C++实现模板。
2025-12-20 18:50:52
746
原创 c++快速幂
本文包含两个算法实现:1)快速幂取余算法,用于高效计算大数幂取模运算;2)输出数组前k大数的程序,使用快速排序降序排列后输出前k个元素。快速幂通过二进制分解指数优化计算,时间复杂度O(logb)。前k大数问题使用快速排序实现,时间复杂度O(nlogn),适用于n<100000的规模。两个算法均给出了完整的C++代码实现,包含输入输出处理。程序通过OJ测试,难度为入门级,适合算法初学者学习基本排序和数论算法。
2025-10-12 11:10:40
108
原创 课堂笔记(25)(指针与链表)
本文介绍了C++指针的基本概念和使用方法。主要内容包括:指针变量的定义方式(int *p),指针与变量地址的关系(p=&a),指针运算符(*p)的使用,以及指针类型必须与所指变量类型一致的原则。同时还讲解了空指针(NULL/nullptr)的概念、指针作为函数参数的用法,以及数组作为函数参数时实际上是传递数组地址的特性。文中通过具体代码示例展示了指针修改数据、指针运算等操作,并指出函数内部获取数组长度通常需要额外参数传递。
2025-08-08 15:18:12
144
原创 vector
C++中的vector是STL提供的动态数组容器,具有自动扩容、高效访问等特点。主要用途包括存储动态数据集合、实现随机访问等。基本用法包括使用push_back添加元素、size获取大小、[]或at访问元素等。常用操作还有pop_back删除末尾、clear清空、begin/end迭代遍历等。vector支持多种初始化方式,如指定大小、填充值或初始化列表,并提供了front/back访问首尾元素、reserve预留空间等实用方法,是C++中最常用的容器之一。
2025-07-31 10:08:16
252
原创 课堂笔记(20)(递归)(约数个数定理)(约数和)
当发现我们要进行循环嵌套,发现每次循环的只有部分代码不一样,就可以使用递归。例如:爬楼梯(只能向上走1~3步),老鼠吃奶酪(二维数组画图)一些递推和递归的题目可以通过画图和找规律解决。
2025-07-29 10:59:50
224
原创 课堂笔记(19)(常用函数)
【摘要】本文介绍求解分数a/b的小数点后第n位数字的算法。通过模拟除法运算过程,在循环中逐位计算小数点后的数字:每次将余数乘以10得到被除数,计算当前位的商作为结果数字,并更新余数继续下一位计算。核心代码仅需6行,时间复杂度O(n)。文中还补充了字符串处理、浮点数格式化输出、数学函数、排序算法等相关C++常用函数的使用说明,包括类型转换、随机数生成等实用技巧,为数值计算和算法实现提供参考。
2025-07-27 08:55:36
149
原创 课堂笔记(18)(复习)
方式一:一样的作用操作字符数组(函数是实现)string(运算符实现)复制/重新赋值s1=s2拼接s1+s2追加s1+=s2比较s1>s2字符数组strlen(s1)string。
2025-07-26 08:43:50
233
原创 课堂笔记(17)(高精度)
本文介绍了高精度算法的实现方法,主要包括加法、减法和乘法运算。高精度加法通过字符串逆序存储、逐位求和并处理进位实现;减法在比较大小后逆序存储、逐位相减并处理借位;乘法分为单精度和高精度两种,通过数组存储和逐位相乘处理进位。所有运算最后都需逆序输出结果,并注意处理前导零问题。这些算法解决了大整数运算的精度问题,适用于超出常规数据类型范围的数值计算。
2025-07-23 18:36:52
283
原创 课堂笔记(16)(进制转换)
本文包含四个编程问题及解答:1.数列求和(1):计算第n项为f(n)=f(n-1)+(n-1)的数列前N项和;2.数列求和(2):求前n项平方和;3.半个回文数:判断十进制非回文数在二进制或十六进制下是否为回文;4.二进制转十进制:将25位以内二进制数转换为十进制。所有问题均给出完整C++代码实现,涉及递归、进制转换和字符串处理等算法。
2025-07-20 20:03:56
206
原创 课堂笔记(15)(递归算法和递推)(结构体)
摘要:本文介绍了递归算法的核心概念,包括递归三要素(终止条件、递归调用、返回结果)及其"递"与"归"两个阶段。通过求和函数演示递归实现,并说明尾递归特性。同时对比递推方法,以汉诺塔问题为例展示递归解法。文章还讲解了结构体的定义和使用方法,包括成员访问和结构体数组排序,重点说明sort函数中自定义比较函数cmp的编写规则,强调结构体排序需明确指定排序依据成员。内容涵盖从递归理论到结构体应用的多个编程知识点。
2025-07-18 18:17:41
479
原创 课堂笔记(14)(递归算法)
本文摘要包含了三个编程知识点:1) 数根计算:通过数字各位相加直到得到个位数;2) 完全数判断:数值等于其所有因子之和;3) 递归应用:包括等差数列和斐波那契数列的实现。每个知识点都配有详细的定义说明和C++代码示例,涉及输入输出处理(scanf/printf)和递归函数设计。内容涵盖数字处理、数学性质验证和递归算法应用,适合编程初学者学习基础算法实现。
2025-07-16 17:48:13
510
原创 纯粹素数(如何连续去掉最高位)(如何计算素数)(计算3000以内四位纯粹素数)
纯粹素数是这样定义的:一个素数,去掉最高位,剩下的数仍为素数,再去掉剩下的数的最高位,余下的数还是素数。这样下去一直到最后剩下的个位数也还是素数。求出所有小于3000的四位的纯粹素数。按从小到大的顺序输出若干个纯粹素数,每行一个。
2025-07-13 20:27:47
364
原创 课堂笔记(13)(自定义函数)(变量作用域)
文章摘要: 第一个程序计算班级n名学生三科平均分,输入n和成绩后输出保留1位小数的平均分。使用二维数组存储成绩,双重循环计算各科总分后求平均。 第二个程序输出杨辉三角前N行,使用二维数组构建三角形,通过判断边界条件赋值1,其他位置为上一行两数之和。 介绍自定义函数的两种类型: 无返回值(void)函数:不带参数直接执行操作 有返回值函数:指定返回类型,通过return返回结果 并说明全局/局部变量区别及函数声明方法。 所有代码均使用标准输入输出,包含必要头文件,遵循C++语法规范。
2025-07-13 20:15:02
894
原创 课堂笔记(12)
摘要:上节课回顾了约瑟夫问题,讲解了n个人围成一圈,数到m的人出列的实现方法,并给出了对应的C++代码。同时介绍了二维数组的定义和使用,包括如何访问特定行数据和遍历整个数组。还简要提及了多维数组的概念,强调数组下标从0开始计算的注意事项。课程内容涵盖经典算法问题和数组数据结构的基础知识。
2025-07-11 17:58:58
603
原创 课堂笔记(11)
摘要: 字符串关系判断:根据长度和字符匹配情况判断两字符串关系,分为4种类型(长度不等、完全匹配、大小写不敏感匹配、完全不匹配)。 魔镜项链问题:通过逆向还原魔镜复制过程,找出原始项链的最小可能长度,采用字符对称性检测方法。 字典序最小字符串:比较N个字符串,输出字典序最小的那个,使用逐字符比较方法。 高频字母统计:统计字符串中各字母出现频率,输出出现次数最多且ASCII码最大的字母,采用数组计数和最大值比较方法。 (共150字)
2025-07-09 18:12:06
436
原创 课堂笔记(10)
我们给出一种最简的的加密方法,对给定的一个字符串,把其中从a-y,A-Y的字母用其后继字母替代,把z和Z用a和A替代,其他非字母字符不变,则可得到一个简单的加密字符串。因为任何字符串最后都有一个看不见的\0,在这之后的东西都不会赋值,假设字符串1=BCDEF,字符串2等于@#s,如果将字符串2复制到字符串1,那么字符串2的3个字符会覆盖到字符串1的前三个,就会变成字符串3=@#s(\0)EF,又因为在\0之后的东西都不会赋值,所以会变成字符串3=@#s。输入一行,包含一个字符串,长度小于80个字符。
2025-07-06 20:05:35
571
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅