- 博客(24)
- 收藏
- 关注
原创 代码随想录算法训练营第28天|力扣122、55、45、1005
总结:数组排序,从小到大将其中小于等于0的数字消耗k,变成大于等于0的数字,再进行一次排列,如果此时k仍>0,如果k是偶数则直接返回数组和,如果k是奇数,则将数组第一个数组转为负数,再返回数组和。总结:遍历数组,获取当前位置能跳跃的最远距离cover,cover=max(i+nums[i],cover),然后判断cover是否能跳到终点(cover>=nums.size()-1)总结:和上题一样,统计当前能跳跃的最远距离cover,然后在这些距离中,寻找下一步最远跳跃距离nextcover。
2026-02-12 16:19:31
81
原创 代码随想录算法训练营第27天|力扣455、376、53
总结:result统计遍历过程中的最大子序和,用count来记录当前遍历的子序和,count更新的逻辑是:只要当前的nums[i]+count>=0,将nums[i]加入count中,if(count>result)result=count(注意:不是要求nums[i]>=0),如果当前的nums[i]+count<0了,令count=0。总结:思路:优先把大饼干分发给胃口大的孩子,从而尽可能让更多的孩子吃到饼干。
2026-02-12 16:00:38
100
原创 代码随想录算法训练营第25天|力扣491、46、47
总结:注意这里不能对原始的数组进行排序操作,因为一旦进行排序操作,结果可能与原始数组不一致,而根据题意,我们又需要在同一树层上进行去重操作,这个时候就不能像排列Ⅱ一样,用一个used数组来维护是否访问,因为used数组必须建立在有序数组的基础上;总结:全排列问题需要两个参数:(1)题目给的nums数组(2)used数组用来维护是否访问当前数字;总结:和组合总和Ⅱ以及子集Ⅱ一样,需要用一个used数组来维护,因为全排列问题本身就需要一个used数组,所以不用再额外定义一个了。
2026-02-10 15:31:54
82
原创 代码随想录算法训练营第24天|93,78,90
总结:组合问题,回溯需要三个参数:字符串s、startindex、pointnum(用来确保是否分割出了四个数字),同时在回溯之前要判断合法性判断:(1)当前字符串中只能包含数字;如果当前分割出的数字是合法的,回溯。回溯的终止条件是startindex的超过了所给数组nums的长度,因为不能重复取元素,所以每次回溯时要从startindex+1的位置开始回溯。总结:和组合总和Ⅱ类似的处理流程,同一树层中不能取重复的元素,所以要用一个used数组来判断当前树层中的数字是否使用过,跳过同一树层中的相同元素。
2026-02-10 15:21:14
117
原创 代码随想录算法训练营第23天|力扣39,40,131
总结:题目指明可以有重复的数字,但是不能有重复的组合,这就要求我们要用一个used数组来统计每个数字的使用情况,在回溯递归前先要判断同一层中是否有重复的元素,如果存在,跳过它。总结:分割问题本质上就是组合问题,每次分割完后,都要对分割的字符串进行回文串的判断,如果有一部分不是回文串则跳出循环,不进行回溯操作。总结:由于可以重复取数字,所以回溯递归过程中的i不需要做+1处理。
2026-02-08 21:41:53
84
原创 代码随想录算法训练营第22天|力扣77,216,17
总结:在组合问题中,为了防止重复取数,所以要设置一个startindex变量,让每一次的递归都从下个节点开始,例如在集合[1,2,3,4]取1之后,下一层递归,就要在[2,3,4]中取数了,那么下一层递归如何知道从[2,3,4]中取数呢,靠的就是startIndex。总结:先要建立数字与字母的映射表map,然后将指向的数字转换成int形式,再从map中取出指向数字对应的字符集,回溯处理字符集。总结:和77的区别在于多一个sum,用于累加path数组中的和,并保存进result中。下面给出回溯算法的模板。
2026-02-08 21:29:51
104
原创 代码随想录算法训练营第21天|力扣669,108,538
的时候直接return NULL。108将有序数组转为二叉搜索树。538把二叉搜索树转为累加树。总结:递归处理,然后遇到。669修建二叉搜索树。总结:右中左遍历即可。
2026-02-07 22:25:03
130
原创 代码随想录算法训练营第20天|力扣235,701,450
总结:利用二叉搜索树的性质:如果根节点的值大于两个节点的值,则最近公共祖先在左子树上;如果小于两个节点的值,则在其右子树上;最后如果夹在中间,那最近公共祖先就是根节点,依照这个逻辑,递归左右子树即可。总结:我的思路和给出的题解不太一样,我先将二叉搜索树转为有序数组,在有序数组中删除指定节点,然后利用二分法构造二叉树。总结:利用二叉搜索树的特性即可,没啥难度。235二叉搜索树的最近公共祖先。450删除二叉搜索树中的节点。701二叉搜索树的插入操作。
2026-02-07 22:20:55
95
原创 代码随想录算法训练营第18天|力扣530,501,236
总结:求最小公共祖先,需要从底向上遍历,那么二叉树,只能通过后序遍历(即:回溯)实现从底向上的遍历方式;在回溯的过程中,必然要遍历整棵二叉树,即使已经找到结果了,依然要把其他节点遍历完,因为要使用递归函数的返回值(也就是代码中的left和right)做逻辑判断;总结:也是先转换成有序数组,利用map统计各个值的频率,然后按照频率从大到小排序,输出最大值(可以是一个也可以是多个)总结:把二叉搜索树转为有序数组,遍历有序数组,统计前后项的最小绝对差即可。530二叉搜索树中的最小绝对差。
2026-01-27 21:12:46
32
原创 代码随想录算法训练营第17天|力扣654,617,700,98
总结:和中序后序遍历构造二叉树的思路类似,像遍历数组,找到最大的值,记录当前值的节点位置,将节点左侧分为左区间,右侧分为右区间,递归左右区间创建二叉树即可。总结:因为是二叉搜索树,左子树所有节点的值小于根节点,右节点所有节点的值大于根节点,利用这个特性递归遍历左右子树搜索即可。总结:如果一个有节点,一个没节点,返回有节点的值;都没节点返回nullptr;总结:中序遍历为递增数列的二叉树即是二叉搜索树。700二叉搜索树中的搜素。
2026-01-27 20:59:34
26
原创 代码随想录算法训练营16天|力扣513、112、106
总结:先从后往前遍历后序序列,找到当前的根节点,然后根据该节点在中序序列中的位置,区分出左右子树:在该节点左边的为其左子树,右边的为其右子树。总结:层序遍历到最后一层,输出第一个节点即可。然后递归,接着在左序列以及右序列中切分。106从中序和后序遍历序列构造二叉树。513找树左下角的值。
2026-01-26 19:50:37
28
原创 代码随想录算法训练营第15天|力扣110,257,404,222
总结:核心思想就是判断是不是左叶子,如果树中的一个节点有其左孩子,但其左孩子无左右节点,那么这个节点的左孩子就是左叶子。总结:我抛弃了完全二叉树这一性质,直接求解了二叉树的节点个数。总结:没啥好说的,数据结构学过的基础题目。总结:本质就是回溯算法在二叉树遍历的体现。222完全二叉树的节点个数。257二叉树的所有路径。
2026-01-26 19:35:58
31
原创 代码随想录算法训练营第14天|力扣226,101,104,111
总结:后序遍历,深度从最底开始往上+1,然后去左右子树的最小深度即可。总结:前序遍历,主要是要想清楚对称的几个判断条件。总结:中序遍历,互换左右子树即可。104求二叉树的最大深度。总结:这个就没啥好说的了。101求二叉树的最小深度。
2026-01-25 20:45:19
32
原创 代码随想录算法训练营第10天|力扣150,239,347
总结:思路不复杂,先用map统计各个数字的频数,然后创建小根堆弹出堆顶元素(大根堆应该也行),难点在于写代码(我不知道怎么实现小根堆),看了文章发现是自己基础的语法没学好。总结:碰到符号弹出栈中两个元素进行运算,然后把结果弹回栈中,碰到数字直接入栈。总结:暴力法超时了,没思路直接看文章(其实没太搞明白,明天再看看)150逆波兰表达式求值。239滑动窗口最大值。347前k个高频元素。
2026-01-11 21:24:43
94
原创 代码随想录算法训练营第9天|力扣232,225,20,1047
总结:注意括号对应的顺序即可,判断最后栈中是否还有剩余括号没匹配上。总结:正常遍历,碰到与栈首相同的出栈,否则入栈。1047删除字符串中的所有相邻重复项。总结:常规题,数据结构本科考试考过。
2026-01-11 21:17:14
114
原创 代码随想录算法训练营第八天|力扣151,28,459,右旋转字符
总结:双指针从后往前遍历,n指向每个单词的末尾(注意要先除去空格),m指向每个单词的开头,随后运用substr函数将单词保存到res数组中,如何判断单词的逻辑就是m指针指向空格,那么m+1到n就是单词。在得到一个单词后,更新n指针的位置为当前m的位置,让m指针继续向前遍历。总结:暴力法,内层遍历needle数组,外层遍历haystack数组,这样时间复杂度是O(n²),后来看了文章学习了kmp算法,但是感觉自己实现起来还是比较困难。总结:核心思路:把如果两个s中还能找出一个s的话,那就是重复的子字符串。
2026-01-10 21:54:54
120
原创 代码随想录算法训练营第七天|力扣344,541,替换数字
总结:这道题刚开始误解题目意思了:以为要先互换前k个数字,然后再根据剩余的个数分情况互换,所以ac不了,后来看文章发现自己误解题目意思了,下面是正确做法:每隔2k个字符分情况进行翻转:如果剩余字符小于k个,则剩余字符全部翻转,如果剩余字符大于等于k个小于2k个,则翻转前k个字符。总结:首尾指针遍历互换位置即可。
2026-01-10 21:40:00
123
原创 代码随想录算法训练营第六天|力扣454,383,15,18
总结:自己没想出来,看了文章知道思路了:先遍历前两个数组,统计a+b的和出现的次数;接着遍历后两个数组,判断是否存在和为-(a+b)的值,存在将其次数累加到count,最后返回count。总结:哈希实在不会去重,学习了文章的双指针和去重的思路。总结:有了三数相加双指针的思路,这道题还是很好做的。
2026-01-07 22:11:33
114
原创 代码随想录算法训练营第五天|力扣242,349,202,1
总结:核心思路就是要想明白什么时候会出现循环,出现循环的处理逻辑,这里要保存每次计算的结果,如果接下来有一次的结果和之前的结果相同,那么就是出现循环了,这样就不可能是快乐数了。总结:数组适合于限制范围的统计次数,这里无范围限制,所有考虑用set。总结:由于都是小写字母,定义一个数组统计字母出现的次数即可。242有效的字母异位词。349两个数组的交集。
2026-01-07 22:05:52
132
原创 代码随想录算法训练营第四天|力扣24,19,160,142
总结:判断有没有环简单,快慢指针相遇即可,难点在于如何找到入口,看了文章的公式推导之后明白了:从头节点出发一个指针,再从相遇节点出发一个指针,两个指针每次直走一步,当着两个指针相遇的时候就是入口位置。总结:求出两个链表的长度差len,让长的链表先遍历len个单位,随后两个链表同时遍历找到第一个相同的节点即可。总结:常规题目,正常遍历即可,记得保留删除的前一个节点信息。总结:我是用递归解决的,看了文章学习了迭代的思路。19删除倒数第K个节点。24两两交换链表节点。
2026-01-06 20:52:18
133
原创 代码随想录算法训练营第三天|力扣203,707,206
总结:常规问题,迭代和递归都会。总结:几个函数正常遍历实现即可。总结:常规问题,两种解法都不难。
2026-01-06 20:39:31
121
原创 代码随想录算法训练营第二天|力扣209,59,区间和,开发商购买土地
总结:这道题刚开始的思路比较复杂:第一轮遍历一个元素,第二轮遍历两个元素.....,如果找到一个满足题目的子数组,则是长度最小的子数组;但是代码实现起来比较困难,后来看了文章讲解思路,学习了滑动窗口的算法:不断调节子序列的起始位置和终止位置,如果当前子数组的和大于等于target,则起始位置后移,否则终止位置后移,最后计算子数组长度即可。总结:有了前面前缀和的思路,这道题还是比较好做的,题目说只能横切或者竖切,那就先统计横切的前缀和已经竖切的前缀和,看看哪种情况下代价最小即可。209长度最小的子数组。
2026-01-05 19:18:15
126
原创 代码随想录训练营第一天|力扣704,27,977
总结:最开始用暴力法解决,外层遍历,内层更新,时间复杂度为O(n²),后面看了文章讲解后,明白了双指针的解法:快指针用来寻找目标元素,慢指针来更新目标元素,时间复杂度为O(n)总结:自己做出来了,头尾节点比大小即可。977有序数组的平方。
2026-01-05 19:09:10
117
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅