- 博客(30)
- 收藏
- 关注
原创 最后一块石头的重量问题解析与实现
摘要:本文解决"最后一块石头的重量"问题,给出基于排序和迭代的C++实现方案。算法通过降序排序确保每次获取最大两块石头,碰撞后处理差值或直接移除,并重复排序直至剩余≤1块石头。代码包含详细注释,处理了边界情况,时间复杂度为O(n²logn)。虽然效率不及堆结构,但实现简洁易懂,适合初学者学习基础数组操作和排序应用。测试用例验证了算法的正确性,包括常规、全部粉碎和单块石头等场景。
2025-09-03 17:56:09
390
原创 贪心算法解决固定长度区间覆盖问题:最少区间数计算
摘要:本文介绍了一种使用贪心算法解决固定长度区间覆盖问题的方案。算法首先对点坐标排序,然后从左到右遍历,每次尽可能用最少的区间覆盖更多点。核心步骤包括排序预处理、初始化区间、遍历判断覆盖情况,并证明了该方法的正确性和最优性。文章提供了完整的C++代码实现、测试案例和复杂度分析(O(nlogn)时间复杂度),适用于n≤10000的规模。该算法思想可推广至其他区间覆盖类问题。
2025-09-01 18:33:15
1109
原创 跳跃游戏(二):DFS 求解最少跳跃次数与最优路径
本文提出了一种基于深度优先搜索(DFS)的算法,用于求解非负整数数组的最少跳跃次数问题。算法从起始位置出发,递归探索所有可能的跳跃路径,记录当前跳跃次数和路径。当到达终点时,若当前跳跃次数更优,则更新最少跳跃次数和对应路径。通过回溯机制确保所有路径被完整探索。代码实现包括全局变量存储最优解、DFS递归函数和主函数读取输入输出结果。虽然时间复杂度在最坏情况下为O(2^n),但可通过剪枝优化提升效率。示例展示了算法正确计算最少跳跃次数2次和最优路径0->1->4的过程。
2025-09-01 17:41:33
340
原创 贪心算法解决钱币找零问题(二)
本文介绍了使用贪心算法解决钱币找零问题的方法。贪心算法通过每次选择最大面额来最小化钱币数量,适用于面额满足特定倍数关系的货币系统(如人民币)。文章详细解析了代码实现,包括面额排序、贪心选择过程以及异常处理,并提供了多个测试案例。同时指出贪心算法的局限性:当面额不满足特定条件时可能无法得到最优解,此时需改用动态规划算法。该方案为常规货币系统提供了高效简洁的找零解决方案。
2025-09-01 16:44:31
483
原创 回溯法解决最大连续子数组和问题
这篇文章介绍了使用回溯法解决最大连续子数组和问题的完整方案。文章首先阐述了问题定义和回溯法的适用性,重点解释了如何通过双重循环(外层确定起点、内层回溯扩展)保证子数组连续性。随后提供了完整的C++代码实现,详细解析了全局变量、实时更新机制等关键设计点,并通过测试案例验证算法正确性。文章还分析了O(n²)的时间复杂度,对比了动态规划等其他解法,强调回溯法在输出具体子数组方面的优势。最后针对引用传递、多解输出等问题给出解决方案,并建议通过剪枝优化效率。整体内容系统全面,适合算法学习者理解回溯法的应用场景和实现细
2025-09-01 16:19:24
854
原创 贪心算法解决活动选择问题:最多不重叠活动数量求解
活动选择问题是贪心算法的典型应用,核心在于 “优先选择最早结束的活动” 这一局部最优策略。本文的实现通过清晰的数据组织、严格的输入校验和高效的排序筛选逻辑,确保了代码的正确性和可读性。该解法不仅适用于经典的活动选择场景,还可扩展到类似问题(如会议安排、任务调度等),只需将 “活动” 替换为对应的场景实体(如会议、任务),逻辑完全复用。
2025-08-30 18:15:36
736
原创 最长递增子序列(LIS)的 DFS 解法详解与实现
本文介绍了使用深度优先搜索(DFS)求解最长递增子序列(LIS)问题的方法。给定数组,通过递归遍历所有可能的子序列组合,记录满足严格递增条件的最大长度。核心参数包括当前索引、上一个选中元素值和当前子序列长度。该方法时间复杂度为O(2^n),空间复杂度O(n),适用于小规模数据,但存在效率瓶颈。文章提供了完整代码实现和测试案例,并建议对大规模数据可采用动态规划或贪心+二分查找等优化方案。
2025-08-30 17:25:12
648
原创 回溯法解决跳跃游戏 II:详细思路与代码实现
本文介绍了使用回溯法解决跳跃游戏II问题的完整方案。算法通过递归遍历所有可能的跳跃路径,记录最少跳跃次数。文章包含问题分析、算法设计、代码实现及测试用例,展示了从数组第0位出发到终点的最少跳跃次数计算过程。虽然回溯法时间复杂度较高(O(2^n)),但能确保找到最优解,适合理解问题本质。文中还提及可通过剪枝优化或改用贪心算法提升效率。
2025-08-27 17:50:11
933
原创 矩阵链相乘的最少乘法次数(动态规划解法)
矩阵链相乘问题是动态规划的经典应用,旨在寻找最优的矩阵相乘顺序以最小化乘法运算次数。通过分析不同分割点的情况,利用最优子结构性质建立状态转移方程:dp[i][j] = min{dp[i][k] + dp[k+1][j] + nums[i]*nums[j+1]*nums[k+1]}。采用自底向上的递推方法,先计算短链的最优解,再逐步扩展到整个矩阵链。典型实现的时间复杂度为O(n³),空间复杂度为O(n²),能高效解决问题。
2025-08-16 15:46:17
941
原创 数字三角形,从 “纠结状态定义” 到 “理清转移逻辑”:那些绕了弯路的思考
本文分享了解决数字三角形问题时的动态规划思考过程。作者最初错误地将dp[i][j]定义为"第i行的最大和",导致无法处理路径连续性要求。通过多次尝试和错误,发现正确的状态定义应为"到达(i,j)位置的最大路径和",这样才能确保路径连续性。文章详细对比了错误定义与正确定义的区别,并通过具体示例展示了正确定义下的正确计算过程。最后强调动态规划中状态定义的重要性,指出合理的状态应包含所有必要信息,才能推导出正确的转移方程。
2025-08-14 18:05:13
788
原创 数字三角形最大路径和:从思路到动态规划实现
数字三角形最大路径和问题揭示了贪心算法的局限性:局部最优不等于全局最优。文章通过具体案例说明,贪心策略可能错过后续更大的收益。动态规划通过记录每个位置的最大和(dp[i][j]),从顶部到底部逐步计算,最终得到全局最优解。算法采用二维数组存储中间状态,区分边界情况处理,时间复杂度O(n²)。典型的测试用例验证了方案的正确性,3→8→7路径得到最大和18。动态规划的优势在于能综合考虑所有可能路径,适用于需要记录中间状态的决策问题。
2025-08-14 18:01:20
916
原创 逆序对问题的暴力解法实现与解析(入门)
本文介绍了求解序列中逆序对数量的暴力解法。逆序对定义为序列中前大后小的元素对(ai>aj且i<j)。算法采用双重循环遍历数组:外层循环选定基准元素,内层循环比较后续所有元素,统计满足条件的逆序对数目。该方法时间复杂度为O(n²),空间复杂度O(n),适合小规模数据。文中提供了完整的C++实现代码,并指出对于大规模数据应采用更高效的归并排序解法(O(nlogn))。该解法直观易懂,是理解逆序对问题的基础。
2025-08-13 16:22:04
249
原创 汉诺塔问题的递归解法:从 n=2 开始理解
汉诺塔问题解析:递归思想的经典实践 汉诺塔问题作为递归算法的经典案例,展现了如何通过分治思想解决复杂问题。其核心思路是将n个盘子的移动分解为三个步骤:先将上方n-1个盘子移至辅助柱,移动最底层的盘子到目标柱,最后将n-1个盘子从辅助柱移到目标柱。这种分而治之的策略体现了递归的精髓——将大问题分解为相似的小问题。通过n=2的具体实例分析,可以清晰地观察到递归调用的执行流程:函数会不断分解问题直至基准情况(n=1),然后逐步回溯完成整个移动过程。理解汉诺塔算法有助于培养递归思维,为学习更复杂的回溯算法奠定基础。
2025-08-12 18:20:04
545
原创 贪心算法解决找零钱问题:从思路到代码实现
本文介绍了使用贪心算法解决人民币找零问题的思路。通过分析人民币面值(100,50,20,10,5,2,1)的特性,证明了贪心选择性质成立:每次优先使用最大面额纸币可得到最少张数的解。文章详细说明了算法实现步骤,包括从大到小遍历面值、计算当前面值使用张数、更新剩余金额和总张数,并给出了格式化输出的方法。代码示例展示了如何用C++实现该算法,并通过输入6和1000的案例验证了算法的正确性。最后指出,虽然贪心算法不适用于所有面值组合,但对于标准人民币面值,该方法是高效且最优的解决方案。
2025-08-11 18:31:26
795
原创 回溯法求解子集和问题:从思路到代码实现
回溯法是一种试探性搜索方法,通过逐步构建解并剪枝无效路径来解决问题。文章以子集和问题为例,详细讲解了回溯法的核心思想:从数组第一个元素开始,逐个考虑;包含或不包含当前元素,通过递归探索所有可能路径,当和等于目标值时记录结果,超过时剪枝。文章提供了回溯法的通用代码模板,包含选择、递归、撤销三个关键步骤,并给出了子集和问题的具体实现代码。最后指出回溯法虽复杂度高但思路直观,建议初学者先掌握模板再逐步深入理解算法思想。作者以学习者的视角分享了算法学习心得,强调通过实践积累经验的重要性。
2025-08-10 21:37:27
967
原创 子集和问题(基于生成子集的扩展):从小白到高手的思路分析梳理与蜕变
本文探讨了寻找数组中所有和为target的子集的问题。首先分析了初始思路(连续子序列累加)的缺陷,发现其无法处理非连续子集。随后介绍了两种改进方法:回溯法通过"尝试-回溯"机制探索所有可能子集;动态规划法借鉴0-1背包思想,构建result数组存储各和值的子集,通过result[j] = result[j-num]+num的关系递推求解。重点讲解了动态规划的实现细节,包括数组排序、逆序遍历避免重复、三维数组结构等。通过示例演示了动态规划表的构建过程,强调了对问题分析、算法选择以及排序预处
2025-08-09 13:35:03
968
原创 最优装载问题:贪心算法求解
本文提出一个贪心算法解决卡车装载问题:在载重限制n下,求最多能装载m个货物(每个货物重量≤50)的数量。核心思路是将货物按重量升序排序,优先装载最轻的货物,直到无法继续装载。算法步骤包括:1)排序货物;2)顺序尝试装载,统计可装载数量并更新剩余载重。该方案通过O(m log m)排序和O(m)遍历实现高效求解,适合大规模数据(t≤10⁴,n,m≤10⁴)。代码实现采用vector存储并处理多组测试用例,体现了贪心算法"局部最优选择带来全局最优"的特性。
2025-08-06 18:20:34
758
原创 0-1 背包问题:从思路到代码的完整梳理
本文介绍了0-1背包问题的动态规划解法。问题要求在不超过背包承重b的前提下,从n个物品(每个物品有重量和价值)中选择物品组合,使总价值最大化。作者通过拆解问题,设计状态dp[i][j]表示考虑前i个物品时容量j的最大价值。关键推导包括:当物品重量超过容量时继承前状态;否则比较选择与不选该物品的价值,取最大值。文章详细阐述了状态转移方程,修正了初始代码中的常见错误,并通过示例验证了正确性。最终强调动态规划的核心是通过子问题最优解构建当前问题解,dp数组充当"备忘录"记录中间结果。
2025-08-05 17:04:37
713
原创 【id:146】【10分】E. 二叉树后序线索(DS树)时间限制1s内存限制128MB
后序遍历:postOrder 函数进行后序遍历,并记录每个节点的值和在后序遍历结果中的索引。每个测试实例输出2行,每行输出指定结点在后序遍历的前驱结点和后继结点,用单个空格隔开。若指定结点不存在则输出ERROR,若结点的前驱或后继结点不存在则输出-1。// 后序遍历并记录每个节点的后序遍历序列。
2024-11-04 15:30:32
835
原创 【id:62】【20分】C. DS二叉树--左叶子数量
/ 计算左叶子数量并输出。// 遇到 '0',返回空节点,并向下一个字符移动。// 空节点,返回 0。// 读取先序遍历结果。// 如果是左叶子节点,返回 1。// 递归计算左子树和右子树中的左叶子数量。// 读取测试数据个数。// 递归构建左子树。// 递归构建右子树。// 定义二叉树的节点结构。// 计算左叶子节点的数量。
2024-10-24 20:23:13
875
原创 第1关:列表实训说明(此实训用于说明实训过程,只需要大家阅读程序,理解后点击评测即可通过!)
测试结果为:['a','b','c','tom','jack','山东','北京', 56, 63, 70, 77, 84, 91, 98]print(ls3[ : : -1]) #切片选择,start为空,end为空,step=-1,表示逆序打印所有元素。测试数据:[12, 33, 12, 44, 76, 54, 33, 55, 76, 88, 90, 76]ls.extend(['tom','jack','山东','北京']) # 追加元素到列表末尾。
2024-09-09 21:35:20
720
1
原创 问题 C: DS顺序表–合并操作
第1行先输入n表示有n个数据,接着输入n个数据,表示第1个序列,要求数据递增互不等。第2行先输入m表示有m个数据,接着输入m个数据,表示第2个序列,要求数据递增互不等。已知两个递增序列,把两个序列的数据合并到顺序表中,并使得顺序表的数据递增有序。// 元素已存在,返回ok。// 数组已满,无法插入。// 检查元素是否已存在,如果存在,则不插入。
2024-09-09 21:18:24
389
原创 【id:185】【25分】B. 矩阵(运算符重载)
你想想,要把A的数据复制到B上,是不是得先保证B原有的数据已经清空了,就像“扫干净屋子再请客”一个道理,我们得先把B原有的数据清空,所以就有 for (int i = 0;时,我们先是进行行的遍历,再进行列的遍历,从而精确到每个元素,[]是下标符号,在进行行的遍历时我们依靠的是指针data来索引,所以归根结底[]是靠指针索引的,,把B的所有东西都清空。清空之后,我们得有位置存放A的数据,所以要先有适合A大小的位置: n = other.n;}的语句,如果B和A在赋值前已经相等,那直接返回B,不做任何处理。
2024-06-19 21:31:00
744
原创 【id:301】【25分】A. 拯救小明(多继承+友元)
小明同学有着严重的拖延症,每次老师布置的作业都要到快要截止的时候才会开始动手完成,因此现在有着许许多多的作业完成。你是小明的好朋友,请帮小明找出最紧急的作业(即最早截止的作业)。// 判断作业w1的时间是否早于作业w2的时间。3.以Date类和Time类为基类,创建一个作业类Work,包括新增成员:int id;//说明w1的要更早交。输入若干作业,每个作业占一行(作业id 年 月 日 时 分 秒)
2024-06-19 12:10:41
700
原创 【id:192】【20分】E. 最贵的书(重载+友元+引用)
定义友元函数find(CBook *book, int n, int &max1index,int &max2index)查找n本书中售价最高、次高的两本书,并通过引用返回其下标。定义CBook,属性包含书名(string),编者(string)、售价(double),出版社(string)。方法有:重载输入、输出。清空输入缓冲区,为了确保下次输入的数据不会受到上次输入数据的影响而改变了位置,避免影响到逗号的读取。输入n,输入n本书的信息,调用上述友元函数,求价格最高的两本书下标,并按样例格式输出书信息。
2024-06-18 18:07:44
363
原创 [蓝桥杯2023初赛] 子串简写
对于一个字符串,只保留首尾字符,将首尾字符之间的所有字符用这部分的长度代替。在本题中,我们规定长度大于等于 K 的字符串都可以采用这种简写方法。对于 100% 的数据,2 ≤ K ≤ |S| ≤ 5 × 105。对于 20% 的数据,2 ≤ K ≤ |S| ≤ 10000。第二行包含一个字符串 S 和两个字符c1 和c2。c1 和 c2 都是小写字母。给定一个字符串 S 和两个字符 c1 和 c2。长度小于 K 的字符串不允许使用这种简写。|S| 代表字符串S 的长度。第一行包含一个整数 K。
2024-05-25 19:51:33
410
原创 蓝桥杯2023初赛] 接龙数列
现在给定一个长度为 N 的数列A1, A2, ... , AN,请你计算最少从中删除多少个数,可以使剩下的序列是接龙序列?12, 23, 34, 56 不是接龙数列,因为 56 的首位数字不等于 34 的末位数字。当且仅当 Ai 的首位数字恰好等于 Ai−1 的末位数字(2 ≤ i ≤ K)。对于 100% 的数据,1 ≤ N ≤ 105,1 ≤ Ai ≤ 109。例如:12, 23, 35, 56, 61, 11 是接龙数列;第二行包含 N 个整数 A1, A2, ... , AN。
2024-05-22 20:35:14
383
1
原创 B. 数组循环右移 (指针)
其中a[]是用户传入的数组;n是数组的大小;m是右移的位数。函数ArrayShift须将循环右移后的数组仍然存在a[]中。输出见样例样例查看模式正常显示查看格式输入样例1<-复制6 2输出样例1int main()int i;for (i = 0;i < n;i < n;return 0;i < m;i++)//向右移m次//每次都把最后一个数字保存。
2024-05-17 16:09:05
525
原创 三维空间的点(继承)
定义一个平面上的点C2D类,它含有一个getDistance()的成员函数,计算该点到原点的距离;从C2D类派生出三维空间的点C3D类,它的getDistance()成员函数计算该点到原点的距离。试分别生成一个C2D和C3D的对象,计算它们到原点的距离。第四行三维坐标点位置2赋值给二维坐标点变量后,二维坐标点到原点的距离。第二行三维坐标点位置1到原点的距离。第三行三维坐标点位置2到原点的距离。第一行二维坐标点位置到原点的距离。第二行三维坐标点位置1。第三行三维坐标点位置2。第一行二维坐标点位置。
2024-05-09 19:29:11
355
原创 向量4(类复合)
为向量1题目中实现的CVector类增加成员函数float Average(),计算n维向量的平均值并返回。(1)添加构造函数,用虚参name1、n1、数组a1初始化CStudent类对象。(2)添加输出函数,按样例格式输出CStudent对象值。输入多行,每行格式为:学生姓名 科目n n个成绩。学生姓名 n个成绩 成绩的平均值(保留2位小数)CVector score;主函数输入数据,测试CStudent对象。
2024-04-26 18:06:35
491
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅