- 博客(31)
- 收藏
- 关注
原创 代码随想录C++算法训练,day30(贪心算法)
方法思路:排序气球:将气球数组按照气球的起始坐标进行升序排列遍历气球数组:从第二个气球开始,比较它与它前一个气球的位置关系:如果当前气球的起始坐标大于前一个气球的结束坐标,说明它们不重叠,需要增加一支箭。如果它们重叠,则更新当前气球的结束坐标为两者结束坐标的较小值(即寻找重叠区域的最小右边界),以便后续气球能尽可能多地与这个重叠区域相交。部分数据结构的说明:如果重叠,更新右边界的作用:算法思路:我们将集合按照左边界进行升序排序在遍历过程中我们需要维护当前不重叠区间的结束位置。
2025-05-22 21:18:08
859
原创 代码随想录C++算法训练,day29(贪心算法)
我们找一个起始加油站,需要确保两点:如果所有加油站得汽油总量小于所有路程的消耗量,那么无法完成环形路线,直接返回-1在总汽油量足够的情况下,也要确保在行驶过程不会在某个点汽油耗尽,意味着我们要从某一个起始点开始,累计的汽油量在任何时候都不为负初始化变量遍历所有加油站:对于每个加油站i,计算gas[i] - cost[i],即在该加油站获得的汽油与到下一站的消耗的差值,将该差值加到curSum和totalSum中。
2025-05-21 19:21:41
626
原创 代码随想录C++算法训练,day28(贪心算法)
由贪心算法的核心:通过每一部分都取到局部最优,从而推到总体最优这道题的贪心策略为:只要今天的价格比昨天高,就卖出赚取差价,因为可以无限次交易。我们可以将总利润分解成所有相邻正利润的和。因此收集每天的正利润。求得最大利润我们根据题意可以将这个题目转化为,我们每一步能跳跃到的范围,最终会不会覆盖到终点。每一步都取最大的跳跃步数(定义好能覆盖到的范围)最终判断整体最大的覆盖范围能不能覆盖终点。
2025-04-23 19:57:24
993
原创 代码随想录C++算法训练,day27(贪心算法)
贪心的本质是选择每一阶段的局部最优,从而达到全局最优。因此这道题我们使用贪心算法来解决。我们的目标是尽可能地满足孩子的胃口,思路为:将孩子胃口和饼干尺寸排序后,进行贪心排序,贪心排序前,初始化指针,随后从最大的胃口开始遍历匹配,随后返回结果排序后贪心排序:如果最大的饼干能满足最大的胃口,那么这样分配一定是最优的(因为如果不这样分配,这块大饼干可能无法满足更大的孩子)。如果不能满足,则跳过这个孩子(因为剩下的饼干更小,无法满足当前孩子)。根据题目描述,我们需要做到局部最优。
2025-04-15 20:05:51
1009
原创 代码随想录C++算法训练,day25(回溯算法)
给你一个整数数组 ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。示例 1:输入:nums = [4,6,7,7]输出:[[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]]示例 2:输入:nums = [4,4,3,2,1]输出:[[4,4]]题解:总结与思考: 这道题是求自
2025-04-15 15:34:58
745
原创 代码随想录C++算法训练,day24(回溯算法)
这道题依旧是一道切割问题,在这里我们需要多添加一个变量pointNum用来添加符号 '.' ,用来记录添加逗号的数量,依旧采用回溯搜索法递归回溯的三个要点:递归函数的参数和返回值:给出的字符串s,控制for循环起点的startIndex,以及记录逗号数量的pointNum,不需要返回值,类型为void递归函数的结束条件:这道题明确要求需要将字符串s分割为四段,因此当pointNum为3时,就已经将字符串分割为了4段,即可作为递归的结束条件。
2025-04-14 18:41:20
943
原创 代码随想录算法训练C++,回溯算法(day23)
因为这道题没有组合的数量要求,仅仅是总和的限制,因此这道题的递归深度是没有限制的,当sum等于目标target或大于targer时,就返回递归回溯的三要素:递归函数的参数和返回值:除了题目中给出的两个参数,使用sum记录path的总和,再用startIndex用来控制循环的起始位置,不需要返回值,类型为void递归函数的结束条件:只有两个情况结束递归,当sum > target时,直接返回,当sum == target时,将当前path的结果存放到result中,然后返回。
2025-04-14 15:35:56
836
原创 代码随想录C++算法训练,回溯算法(day22)
我们可以将回溯法抽象成N叉树的形状来解决问题,for循环控制N叉树的宽度,递归来控制N叉树的深度递归三要素:递归函数的参数与返回值:因为是集合n里取k个数,因此参数有n与k,同时需要一个参数startIndex来控制递归遍历的起始位置递归函数的结束条件:当我们遍历到抽象出来的N叉树的叶子节点时,就是递归结束之时,在题目中的体现就是当path这个数组的大小取到k时,就说明我们已经找到了一个子集大小为k的组合了,就可以结束递归。此时再用二维数组result将path保存起来。
2025-04-10 15:34:38
1159
原创 代码随想录C++算法训练,二叉树(day21)
修剪二叉搜索树的过程就是移除不在范围区间内的节点的过程使用递归法来解决此题,递归的三要素:递归函数的参数和返回值:有返回值的递归函数可以根据返回值来移除节点,参数为root和区间上下限low, high递归函数的结束条件:当遍历到空节点时,结束递归递归函数的单层递归逻辑:如果root(当前节点)的元素是小于low时,那么我们应该递归右子树,并返回右子树符合条件的头节点,如果root(当前节点)的元素是大于high时,那么我们应该递归左子树,并返回左子树符合条件的头节点。
2025-04-09 18:31:08
810
原创 代码随想录C++算法训练二叉树(day20)
解决此题我们需要利用二叉搜索树的性质,需要明白一个既定事实:当我们从上向下去递归遍历,第一次遇到 cur节点是数值在[q, p]区间中,那么cur就是 q和p的最近公共祖先。而关于递归遍历顺序,因为此题不涉及到“中”逻辑的处理,因此使用什么递归遍历顺序都无所谓,所以我们默认使用前序遍历的顺序来做题解递归的三要素:递归函数的参数和返回值:需要记录当前节点和目标q,p,所以参数为cur,q,p返回值是要返回最近公共祖先,所以类型为TreeNode*
2025-04-09 16:12:25
944
原创 代码随想录C++算法训练,二叉树(day18)
此题与验证二叉搜索树逻辑相似,对应力扣98题,我们可以将给出的二叉搜索树转化为有序数组后,再进行最小绝对差的计算,或者可以直接在二叉搜索树中进行操作,我们这里直接选择在二叉搜索树中进行操作。递归要注意的三个重点:递归函数的参数和返回值:cur作为当前正在处理的树节点,因为该函数不需要直接返回计算结果,而是通过修改类的成员变量result和pre来记录状态,因此不需要返回值,类型为void递归函数的结束条件:当递归到空节点时,说明遍历结束,退出递归。
2025-04-02 20:48:59
641
原创 代码随想录C++算法训练,二叉树(day17)
此题需要我们理解题意中构建二叉树的顺序与规则是什么,随后按部就班构建要求的最大二叉树构建二叉树一般采用前序遍历,优先构建中间节点,随后再递归构建左右节点。递归要注意的三个要点:递归函数的参数和返回值:参数传入的是存放元素的数组,返回的是该数组构建成二叉树后的头节点,返回类型为指向节点的指针类型递归函数的结束条件:当我们遍历到叶子节点时,应该构建一个新节点,并把数组的数值赋予给这个节点,随后返回这个节点。表示这个数组大小为1的时候,构建了一个新的节点并返回。
2025-04-01 18:13:53
1048
原创 代码随想录C++算法训练,二叉树(day16)
此题我们使用迭代层序遍历来解决。依旧使用层序遍历的模板来解题在遍历过程中只需要记录最后一行第一个节点的数值就可以了。根据题意我们此题使用深度优先遍历的方式,递归回溯来解决此题确定递归三要素:确定递归函数的参数和返回值:我们需要二叉树的根节点,并且需要一个计数器,计数器用来计算二叉树的一条边之和是否正好是目标和,计数器为int型。同时因为递归的路线不需要整棵树,而且递归函数需要返回值,因此我们将返回值类型设置为bool型。
2025-03-31 20:26:24
1011
原创 代码随想录C++算法训练,day15(二叉树)
递归题解是简化代码后的极简版递归题解,完整版逻辑为:private:// 左// 右// 中public:迭代层序遍历依旧是按照模板解题,遍历时记录每一层的节点数量此题解使用递归法解题,使用递归法需要注意三个要点:递归函数的参数和返回值:参数是当前传入的节点,返回值是以当前节点为根节点树的高度递归函数的递归结束条件:递归的过程遇到空节点则结束递归,表示当前节点为根节点的树高度为0。
2025-03-27 19:54:00
820
原创 代码随想录C++算法训练,day14(二叉树)
解决翻转二叉树的问题时,递归的方法比较简单。使用递归法时,我们需要注意三个点确定递归函数的参数和返回值: TreeNode* invertTree(TreeNode* root)确定递归的终止条件:if(root == nullptr)确定单层递归的逻辑:因为是前序遍历,所以先进行交换左右孩子节点,然后反转左子树,反转右子树。题解二使用层序遍历翻转二叉树,依旧是按照层序遍历的模板解题,不需要记录局部或整体节点,因此只需要考虑翻转和遍历逻辑,最后返回根节点。
2025-03-26 17:38:06
933
原创 代码随想录C++算法训练,day13(二叉树的层序遍历专项训练)
初始化时队列que用来按层级顺序存储待访问的节点。数组result是返回结果的二维数组,每个子数组代表一层的值外层循环时,用来处理每一层的数据。size = que.size()固定当前层的节点数量,vec临时存储当前层的节点值,处理后放入result内部循环时,用来处理当前层的所有节点。步骤为:取出队首节点,存入当前层的数组,子节点入队(如果存在左右子节点),将vec存入result中固定size的重要性i < size;i++)确保只处理当前层的节点,不受新加入的子节点影响。
2025-03-25 20:33:26
860
原创 代码随想录算法训练C++,day13(二叉树前中后序的递归与迭代遍历)
在preorderTraversal函数的外部定义一个traversal作为递归辅助函数,来遍历二叉树。参数解释:TreeNode* cur 作为当前正在访问的节点,vector<int> &vec 作为存储遍历结果的向量递归终止条件:如果当前节点cur是NULL,直接返回,不再继续递归中:将当前的节点值cur->val存入向量vec中,对应前序遍历中的访问根节点左:递归调用traversal(cur->left, vec),遍历当前节点的左子树。
2025-03-24 20:28:59
985
原创 代码随想录C++算法训练,栈与队列(day11)
此题思路可以参考力扣1047题,不同处是此题是相邻数做运算,不是消除。此题大体思路:遍历到数字则入栈,遍历到运算符则拿出栈顶两个操作数进行运算,并将结果压回栈中遍历给出的tokens字符串数组遇到运算符时,将此刻的两个栈顶元素作为nums1和nums2,随后根据运算符进行运算,并将运算结果压回栈顶。若遇到操作数时,将操作数转换为long long数据类型,并将其压入栈顶。
2025-03-23 21:48:32
909
原创 代码随想录C++算法训练,栈与队列(day10)
此题重点在于模拟用入栈与出栈两个栈来模拟队列的行为,属于模拟题目。我们需要注意入栈与出栈的关系模拟队列的行为时,在push数据时,直接将元素放入到输入栈就好,在pop数据时,如果输出栈为空,我们就需要将输入栈中的所有元素放入到输出栈中,随后再从输出栈弹出数据,如果输出栈不为空,则直接从输出栈弹出。在进行判空行为时,核心逻辑就是同时判断输入栈与输出栈是否为空。在实现peek函数。
2025-03-23 17:03:45
976
原创 代码随想录C++算法训练, 字符串(day9)
解决此题我们不使用辅助空间,因此需要在原字符串中做功夫大体思路:去除字符串中的多余空格将整个字符串全部反转将每个单词进行反转以测试用例一为例,步骤为:源字符串为:"the sky is blue "移除多余空格 : "the sky is blue"字符串反转:"eulb si yks eht"单词反转:"blue is sky the"随后进行思路的实现:字符串反转的逻辑reverse,实现比较简单,详见代码开头。
2025-03-22 11:30:21
620
原创 代码随想录C++算法训练,字符串(day8)
此题没有难度,只需要读懂题意,使用i,j两个指针(索引下标)从字符串左右两边同时向中间移动,并进行交换操作。交换操作使用swap函数就可实现。题目中的反转规则十分复杂,将它采用分支的方法实现,使用for循环遍历时,控制i每次移动2*k的距离,再在这次遍历中判断是否符合题目要求的反转规则着重理解(i + k)与s.size()的比较逻辑,然后根据结果进行反转逻辑的实现反转逻辑使用reverse函数实现。
2025-03-19 18:15:35
758
原创 ACM模式训练,奇怪的信
题目思路解析:如何读取每个整数的每一位数字?如何判定每一位数字是否为偶数?如何将是偶数的数字累加到一起?答:使用循环逐行提取每一位数字判断当前数字是否为偶数如果是偶数,累加到结果中注意细节:sum这个值需要定义在第一个while里面,确定它的作用域,最后输出结果时,cout<<sum<<endl;这一行也需要在第一个while循环的范围内。
2025-03-18 20:39:28
347
原创 ACM模式训练,摆平积木
此题根据题意理解,我们需要求出每个大于平均积木数量的积木堆,与平均积木数量的差值,并将此差值结果累加给结果result,并按题目要求返回结果。思路:根据题目要求,先输入n,代表一共有n堆积木,随后为计算出平均积木数,需统计积木总量和积木堆(n),因此在第一个for循环中在输入积木堆数据的同时,将积木总数统计出来赋值给sum,并以此计算出average平均积木数。最后只需要计算出大于积木平均数的积木堆与平均积木数的差值,并将差值累加后即可得题目要求答案。
2025-03-18 20:09:09
401
原创 ACM模式训练,平均绩点
解此题需要清晰理解题意,定义sum用来记录总分,用count记录有效数据的个数(作平均的分母),用flag作为数据是否有效的标志学习理解getline函数的应用:getline是 C++ 中用于从输入流中读取一行字符串的函数,它从标准输入流cin中读取一行字符串,并将其存储到字符串变量s中,当需要读取包含空格的字符串时,getline比cin更合适,因为cin会在空格处停止读取。
2025-03-18 19:26:59
358
原创 代码随想录C++算法训练,哈希表(day7)
此题目描述中强调说明是求四个独立的数组之和为0的情况,并不需要考虑四个重复元素之和为0的情况,因此我们可以想到将四个数组分成二二两组,一组用来记录a+b之和与其出现的次数,并将其保存到map中。令一组用来查找0 - (c + d)的值是否在map中出现过,如果找到了目标值,就将其出现的次数(对应map中的value)赋值给count,这样我们就可以找出有多少个四个数组之和为0的情况此题用到了哈希数据结构map,为什么会想到用它?
2025-03-18 19:07:21
715
原创 ACM模式训练,两数之和
此题先指定一组有N行数据,并且每N行有M个数据输入,需要求出此行M个数据的和指定了每一组中M个数据的和之间需要输出一行空格外层while循环控制N行数据,内层while循环控制M个数据,内层while循环结束后,输出M个数据的和,并且判断是否需要输出空格外层while循环结束后,返回结果0需要注意。
2025-03-17 19:53:00
504
原创 代码随想录C++算法训练,哈希表(day6)
此题难度不大,设计到哈希表的知识,数组其实就是一个简单的哈希表,这道题中设计到的字符串全是小写字符,那么我们就可以使用一个数组来记录字符串s中字符出现的次数此题中核心思考如何把字符映射到数组也就是哈希表的索引下标上在映射过程中,我们不需要求出字母的ACSII值,只需要求出一个相对值就足够了此题需要使用哈希表中的set来定义结果集,当题目不要求对结果数据进行排序,并且要求结果数据不能重复时,我们可以使用读写效率较高的set这个结构体。
2025-03-17 19:37:52
1162
原创 代码随想录C++算法训练,链表篇(day4)
此题重点在于要清楚交换节点时的模拟过程,需要清晰交换步骤时候的顺序,同时交换时需要有意识的去保存会丢失的第一个和第三个节点,然后按部就班重新进行指针的指向此题使用虚拟头节点的方式,统一操作过程,最终返回结果时也使用虚拟头节点找到新链表的头节点循环时,注意循环条件,防止进行操作空指针的违规操作此题难度不高,使用快慢双指针法解决问题,并使用定义虚拟头节点的方式统一操作核心思路为,让快指针先提前走n+1步,后面进行快慢指针同步移动时,方便慢指针定位到删除节点的上一个节点位置,方便进行删除操作。
2025-03-17 14:56:52
770
原创 代码随想录C++算法训练,链表篇(day3)
移除链表元素有两种解题,分别为在原链表中操作和设置虚拟头节点再操作,此题解使用后者移除链表考察对链表的基本操作,注意:C++中需要手动释放指针,保护内存返回结果时要注意返回的头节点,不能直接返回head(可能被移除)此题的考点总结:获取链表第index个节点的数值在链表的最前面插入一个节点在链表的最后面插入一个节点在链表第index个节点前面插入一个节点删除链表的第index个节点此题考察对链表的各项基本操作,掌握此题可大大加强对链表操作的理解并锻炼基础能力。
2025-03-15 19:07:49
848
原创 代码随想录 C++算法训练,数组篇(day2)
此题解使用了滑动窗口解题的思想,滑动窗口是一种用于解决数组或字符串中子区间(子数组或子字符串)问题的算法思想。它的核心是通过维护一个动态的窗口(通常是一个连续的子区间),并根据问题的条件动态调整窗口的起始位置和结束位置,从而高效地解决问题。收缩的本质就是不断的在符合要求的情况下去除掉不需要的多余元素,此题同时也符合单调性,即:左右指针只会往一个方向走,并且不会回头。因此在这道题中,我们可以固定右指针的位置,同时用判断条件左指针缩小窗口,右指针再不停的遍历这整个过程,直到找到最短子数组的长度。
2025-03-15 15:24:27
1145
原创 代码随想录 C++算法训练,数组篇(day1)
两个for循环解题,外层for循环用来遍历数组元素,里层for循环用来更新数组元素,但性能一般通过快指针和慢指针在一个for循环下完成两个for循环的操作。这道题中的快指针作用是用来遍历原数组元素,寻找新数组元素,新数组就是不包含目标val的数组。这道题慢指针作用是指向更新新数组下标的位置数组其实是有序的,只不过负数平方之后可能成为最大数了。那么数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。此时可以考虑双指针法了,i指向起始位置,j指向终止位置。
2025-03-12 16:36:01
700
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅