- 博客(65)
- 收藏
- 关注
原创 代码随想录刷题Day58
2. 对最后顺序结果有要求,比如求子序列,子序列中的元素顺序必须和原始给定的nums中元素顺序一致的时候,则不能sort打乱原始的nums顺序,而应该是借助一个额外的used变量记录已经使用过的元素,已经使用过的元素又可以分为元素的值(这个是更常见的情况),和元素的位置(全排列)。对于全排列这个操作,nums中的每一个元素都要出现一次,这本质上是对nums中的index全排列,而去重操作是在处理回溯中同一层(在最后结果上体现为序列的某一个位置上的数值)数据多个相同的元素只处理一次。
2025-09-18 13:02:06
451
原创 代码随想录刷题Day57
这道题,最开始直接想着怎么按照非递减的思路去找齐所有的子序列,会觉得很乱,很难找到思路。但是如果先把所有子序列找出来,然后筛选掉出现递减情况的序列,就回到了正题:回溯 + 剪枝。这道题一开始还是琢磨了一下,这样“无序”的递归要怎么执行,这一类原来可以直接脱离掉使用startIndex参数的使用,算是回溯题的另一大类的题了。原来是我写的代码只能对相邻的相同的值进行去重,但是对于这样的例子还是不能去重。这次AC了,但是时间耗时较多,不过没关系,说明自己的思路是可行的。2. 排除含有递减序列的情况。
2025-09-18 00:09:46
327
原创 代码随想录刷题Day56
写这一题代码的时候,我在for循环中使用continue,以为continue是直接从if跳到循环条件判断的地方,所以在continue前还加上了i++,导致我的代码过了给出的测试但没有AC。也就是先找零个元素的子集,再找一个元素的子集,再找两个元素的子集...一直到找N个元素的集合为止。这道题和之前的回溯不一样的地方在于,所有的树节点都是答案的一种情况,而之前的答案都是在叶子节点也就是满足终止条件的时候。的做法,发现原来可以不用这样划分子集的长度。我的第一想法是对找k个元素的集合这个过程使用回溯的方法。
2025-09-12 21:31:32
443
原创 代码随想录刷题Day54
我的代码在耗时和内存消耗上,不是很理想,但这个代码感觉从回溯角度上,优化不了太多,我看代码随想录是用动态规划的方法优化回文子串的判断,我就先不试了。按照如图树从上往下的过程,每层相当于回溯中for循环要处理的当前函数的部分,而下一层是递归调用函数处理的部分。这道题,先自己笔算一遍,确定找出答案序列的规律,然后再使用回溯算法来解决会好做些。
2025-09-12 14:42:16
386
原创 代码随想录刷题Day53
我以为会是我用while循环,它用for循环导致,也效仿使用for循环,运行结果确实好了些(执行用时击败41.66%,消耗内存击败11.20%),就有点迷了,不是很清楚,为什么我写的代码会低效那么多,我甚至还没有clear()函数的预处理操作,少了点操作竟然比模版代码慢。这道题相比之前的题,棘手的点在于给定的candidate中就可能存在相同的值,比如示例1,按照一般的做题思路,会得出两个1 2 5和两个1 7。因此,枚举过程中的去重是个关键。
2025-09-09 10:53:08
197
原创 代码随想录刷题Day52
这道题,和之前的优化角度不一样,前面的回溯题优化主要是在研究如何剪枝,这一道题,没有太多可以剪枝的部分,就在函数调用次数尽可能少方面下功夫。如题,这道题的回溯三要素比较直接,循环遍历时候剪枝不会太复杂。提前在函数调用前判断是否需要递归调用,从而省去调用函数的消耗。
2025-09-09 10:15:36
223
原创 代码随想录刷题Day51
其次,string取下标得到的是字符,如果强制类型转换int(),得到的是ascii码值,所以需要记得减去'0',才是int类型的数值。这道题相比前面做过的两道回溯题,不需要剪枝操作,而是按照要求把数字对应的字母一一枚举就好。这里需要点技巧可能是数字和字符串之间的映射关系了,用一个string数组存储这个映射关系。
2025-09-07 01:01:31
287
原创 代码随想录刷题Day50
我自己的方法和代码随想录的做法比较,还是比较消耗内存的。比对了一下,主要时在剪枝方面,我的剪枝范围判断每次都要调用一下函数le,这样消耗多。这道题,先尝试自己手写罗列出答案的各种情况,递增地枚举值容易发现规律。如上的例子,假如第一个值取2,那么剩下两层需要凑10。以需要达到的高度先查看当前值如果按最小的情况叠加是否会超过需要凑的值。这道题能够套用回溯模板完成,并且用上剪枝,我对回溯理解更近一步了。而我的剪枝方法可以视为是这两个剪枝的融合,反而增多了消耗负担。所以第一层取了2的情况下,第二层遍历到4就好。
2025-09-07 00:16:48
366
原创 代码随想录刷题Day49
比如已知现在v还要取t个数就达到有k个数的要求,那么当前这一轮循环m就不用遍历到n,而是遍历到m-t,因为最极限的做法,剩下t个我取[n-t+1,n-t+2,...,n]这t个数的话,m在这样的情况下,应该是最大最大也就是取到n-t,m再往后取,就会出现v还要t个数达到k,但是不够t个数中取t个数。对于该代码,进一步优化的话,剪枝,主要在循环遍历的时候,m不必循环到n,而是可以根据当前数组中已有数的个数来确定最大取到什么位置。回溯虽然有模板算法可以套用,但目前还是比较难自己直接想明白,后面多做题再总结吧。
2025-09-04 22:21:05
518
原创 代码随想录刷题Day48
这个方法是指使用一个和遍历树节点同步的栈来记录其他信息,这个方法也可以使用回溯的方法来替代解决,但是回溯比较繁琐,目前主要还是优先使用这种思路。这种求树的路径信息,应该可以第一反应,使用额外栈的方式解决,这道题是用于记录深度遍历过程中从根节点到当前节点的路径上的节点和。这在高度计算,层的平均值,层的最大值,右视图,next指针在每一层中添加,这些题目中优先考虑使用队列层序遍历。如果使用迭代的方法,要注意节点入栈顺序和遍历顺序相反,比如,先序遍历,入栈顺序是右左中。二叉树,要处理整个树,一般少不了遍历。
2025-09-03 22:42:55
649
原创 代码随想录刷题Day47
关于这道题目的累加概念的理解,如上图我的标记,处理的顺序是按照右-中-左的遍历顺序来执行的,本质考察的是二叉搜索树的中序遍历,只不过不是左中右,而是右中左了。平衡二叉树,要求是左右子树的层数之差不能超过1,为了保证这个条件,可以让序列的中间位置的值作为根节点,这样左右子树就数量大致一样(不一样,也是相差1个节点)。二叉搜索树的特征是左子树节点 < 根节点 < 右子树节点 ,由于序列是升序的,这个特征自然是可以保证的;这道题目,看到返回值是构建好的平衡二叉搜索树的指针,很容易可以联想到使用递归的方法。
2025-09-02 00:02:58
514
原创 代码随想录刷题Day45
我上面那样写代码其实还是不规范的,没有对删除的节点进行delete操作释放空间。这道题花了比较多的时间思考,感觉自己想的话,细节会比较多,最后还是向。
2025-08-30 00:22:17
259
原创 代码随想录刷题Day44
这道题,可以沿用二叉树的最近公共祖先的求法进行求解,也就是root判断-左右子树递归求LCA-根据左右子树的LCA结果返回值这一套。这两题,都是用到二叉搜索树的“有序”特性,和之前中序遍历验证的思路不一样,这里是使用二叉搜索树的有序性来指引递归的方向。插入新节点,先找到新节点在树中的位置:val比节点小,则在左子树中找;但是这里要注意的是,root是空树的情况,我第一边写,就忘了树可能为空,导致只有8个测试例子过了。
2025-08-27 21:04:55
205
原创 代码随想录刷题Day43
如上,先从根节点往叶子节点扩展递归,然后是从找到的节点开始往根节点回溯找到的答案,直到某个节点的左右子树都找到了p和q,返回结果。LCA问题是比较经典的题目了,但是自己还是一时间忘记怎么做了。之前学数据结构的时候,学习的方法是。这道题,感觉搜索二叉树的中序遍历递增的性质没能用上,只好当普通的二叉树求众数来求解。这和之前使用递归进行先序遍历、中序遍历、后序遍历的用法很类似。这里的递归,我发现递归的return主要有两个部分,一个是用来。但是这种方法时空消耗较多,查看代码随想录的参考思路,知道了。
2025-08-27 20:06:56
377
原创 代码随想录刷题Day42
这个例子被卡住,是因为5的右子树上的节点3比根节点5小,虽然在左节点-根节点-右节点这样的结构上,满足定义要求,但是从整体上看,只满足三节点的严格递增关系的子树组成的二叉树并不满足要求。在比较大小上,只比较根节点还不够,但是自己又想不出细节。这两道题,一句话总结,即,二叉搜索树的验证或者关于值的处理可以使用中序遍历来解决。原来使用中序遍历就行了,中序遍历之后查看获得的序列是否是严格递增的就好。
2025-08-27 11:28:44
254
原创 代码随线录刷题Day39
,遍历到叶子节点,先查看该节点的深度是否是当前所有遍历过的节点里最深的,如果是,就记录下该节点(后续如果叶子节点还是这样的高度,无需记录,做了这几道题,大致可以感受出来,对于这样的分析从根节点到当前节点的题目,可以使用一个额外的栈,和遍历使用的栈对应起来,记录对应节点的信息。这道题,找树左下角的值,受到前一天做过的,找所有从根节点到叶子节点路径的启发,这里可以除了使用一个栈结构辅助深度遍历,还需要使用一个。的含义,是最底层(深度最深)的情况下,然后才是最左的叶子节点,而不是最左的叶子节点中的最深的那个。
2025-08-21 22:20:33
379
原创 代码随想录刷题Day38
的同时,遇到叶子节点就把从根节点开始到叶子节点的路径放入答案向量中,但是我想着如何使用一个字符数组来存放当前的结果,从而导致自己的思维陷入复杂的情况。这道题,相比上一道题,对于深度优先遍历的顺序没有那么严格的要求,也就是入栈时候右孩子先入栈这样的规矩,一般是需要对。这题需要计算所有左叶子之和,可以使用深度优先遍历,遍历到左叶子时候,把左叶子的值加上。这个代码在写的时候,我按照先序遍历的顺序,左孩子入栈,接着右孩子入栈,结果导致最后的结果出错,因为,,使用栈迭代处理树的问题时,一定要注意!
2025-08-21 11:09:27
309
原创 代码随想录刷题Day37
完全二叉树看成是由满二叉树组成的(如下1树可以由2满二叉树 + 6满二叉树 +14满二叉树作为递归终点),这样做,可以节省一些,像层序遍历那样,挨个节点数的过程。这道题如果使用层序遍历的方法,也是可以求出节点数目的,但是那样就没有用上完全二叉树的性质,这个性质会有所浪费。我自己尝试思考,还是没能想出来,最后还是看了代码随想录的解题思路。
2025-08-19 21:47:15
160
原创 代码随想录刷题Day36
之前层序遍历系列中做个这样的题目,这里尝试使用递归的方式来求解这个题目。但是如果是想要仿照上面的思路来解答的话,并不是简单把max改为min,因为那样的话,最小深度的那条计算路径可能不包含叶子节点(如下值为8的节点,最小深度不是右孩子深度0+1,而是2)。这道题,受对称树、相同树的题目启发,可以在遍历树的同时,尝试比较树的不同节点作为根节点的树,是否和给出的子树结构和值均相同。总之,还是旧心得,递归题目的重点是要明确递归函数的三要素,尤其是递归函数的功能和递归函数层的实现逻辑。
2025-08-18 23:57:16
437
原创 代码随想录刷题Day35
关键还是得先发现可以递归下去的规律,也就是这里的“对称”是如何去比较的,先是自身节点是否为空的比较,再是如果都非空,则比较值,如果自身节点比较相同,则开始处理外侧节点和内侧节点,是的,这里的外侧节点和内侧节点这个概念,我觉得是这道题要发现规律的重点。原因是,这一题没有说每个树节点的值是不一样的,而我先序遍历和中序遍历的话,其实是在利用序列结果来间接反映树的结构信息,而这里如果树存在相同的值,则会对这种方法产生干扰。但是这个代码相比递归的方法,代码运行过程中消耗的空间多了很多,是额外使用栈的数据结构带来的。
2025-08-18 00:23:40
417
原创 代码随想录刷题Day34
接着是粗略参考代码随想录的标准答案,看到可以用后序遍历+递归的思路,于是我还没想清楚就直接写代码,写代码是对左子树进行左右中的后序遍历,对右子树进行右左中的后序遍历,然后对得到的左子树的遍历序列和右子树的遍历序列进行比较,如果不一致则说明不是对称的,但是这样的做法,显然是没有考虑到题目给出的第二个样例的情况。,定义一个比较函数,用于比较左右两棵子树是否对称,具体的比较过程,先是左右子树根节点是否一致,接着是对子树的外侧和内侧接节点的比较,如此迭代下去。最后,还是得认真参考。
2025-08-17 11:27:15
212
原创 代码随想录刷题Day33
这次刷题的主题依旧是关于树的层级遍历问题。这道题套用树的层序遍历模板,每一层中找出每一层的最大值。这道题是在树的纵向结构的基础上,添加横向的指针连接起来,如果想到使用层级遍历的话,这道题思路可以很快有。这道题继续使用层级遍历的方法,逐层遍历树,直到在某一层遇到第一个叶子节点就停止继续遍历,其中叶子节点的特点是左孩子和右孩子均为空。
2025-08-15 23:48:32
338
原创 代码随想录刷题Day32
这道题的右视图,是从每一层取出最右节点。这道题使用一个队列来存储每一层的节点信息,上一层节点的出队伴随着下一层节点的入队,层与层之间的划分是依照每一层节点入队之前队列长度来维护。总的来说,这几道题都是处理树中的层级属性,这类题可以优先考虑使用队列来完成树的层级遍历。
2025-08-14 13:04:47
302
原创 代码随想录刷题Day30
这道题需要使用的是优先队列/堆的数据结构,因为它是要不断地记录一串数据序列中的最大值,像这样的问题,堆可以自动维护堆顶元素是序列里的最大值/最小值。写代码发现,这里使用一个比直接在循环遍历时候直接让会少花不少时间。这道题在有了上面这题的基础上,继续做的话,会很容易想到思路,这里也是使用优先队列的方式。
2025-08-13 15:25:20
457
原创 代码随想录刷题Day28
这道题和上一道题原理几乎一致,不过这道题在做的时候,想起栈这样的结构,可以直接使用天然的数组来模拟,而不是直接使用stack,因为直接使用stack消耗的时间可能会更多。如果使用数组来模拟一个栈结构,我们只需要维护一个关于栈顶元素位置的指针就好,而这正好可以使用数组长度来间接维护,也就是说string[length-1]就是栈顶的元素,只是还需要额外判断栈是否是空栈。遇到左括号入栈,遇到右括号,先查看栈顶元素是否是对应的右括号,如果是,则出栈(出栈要小心非空栈才能出栈),否则返回false;
2025-08-12 13:25:29
230
原创 代码随想录刷题Day27
栈模拟队列时候,最重要的就是对查看元素/pop机制的“模仿”,也就是在查看/弹出元素时候,把“队列头”的元素放置到栈顶位置弹出,具体做法是,把栈中的元素,挨个取出,最后一个取出来的就是栈底元素,如果放在队列中,那就是队头元素。这道题类似上文的思路,在用队列模拟栈的时候,主要也是在查看元素和pop时候,需要把队列元素挨个从队列头部取出,直到最后一个元素,就是队列底部的元素,也就是进入容器的最后的元素,是出栈时候的元素。在刷题之前,看到代码随想录关于。
2025-08-10 00:11:56
254
原创 代码随想录刷题Day26
接着是再重新用两个步调一致的指针,也就是都是一步一个节点的指针,一个从链表头开始,一个指针从相遇点开始,直到两个指针相遇的地方,就是入环口位置。:这道题双指针是用在链表的next指针方向反转上,这里其实涉及到三个指针,但是next指针就像swap时候的temp变量的作用,只是暂存一个值而已,主要还是curr指针和pre指针,分别用来指向next指针方向反转的两个节点信息。:这两个题都是使用双指针来减少一层的嵌套,双指针移动是根据和的大小和target值的大小比较来确定的,以及在移动过程中,要注意去重。
2025-08-08 23:58:24
491
原创 代码随想录刷题Day25
这个系列的字符串题目几乎都可以直接使用朴素的做法完成,也就是把字符串视为特殊的数组看待。:一个头指针用于从前往后遍历,一个尾指针用于从后往前遍历,每次循环都交换头指针和尾指针的值,直到两个指针在数组的中间相遇停止循环,这样和反转指针效果相同。的结构,第一个if均是匹配成功,指针自增,else-if是应对值为0的情况,赋值就好,else-else是用来迭代到next[i]位置进行比较。:先统计出最后的答案字符串的大小,接着从后往前修改原始数组,一个指针用于遍历原始的数组信息,一个指针用于维护最后的结果数组。
2025-08-08 00:12:01
794
原创 代码随想录刷题Day24
也就是说,如果在字符串匹配时,s和t匹配到第i个字符,匹配失败,无需直接从头开始进行下一轮匹配,而是试试s字符串未匹配上的字符,可否与t字符串next[i]处的字符匹配上,因为s字符串的最近next[i]-1个字符串可以和t的最近next[i]-1个字符串匹配上,根据next数组的定义,s字符串的这最近next[i]-1个字符串也可以与t字符串的开头的next[i]-1个字符串匹配上,从而省去一部分没必要的匹配。为了能让匹配过的字符串记忆可以发挥作用,因此需要在开始匹配之前,对匹配的字符串t进行分析。
2025-08-07 12:07:15
347
原创 代码随想录刷题Day23
这道题,我是直接按照题目的意思去做。也就是不断地试探从字符串开头到第i个字符之间的字符串可不可能是字符串的重复子串。当然这个试探也不是完全逐个试探,还是得先排除一些不可能的子串。比如字符串开头是重复子串的开头,以及重复子串的长度不能长于字符串的一半长度。我这题如此暴力求解肯定不是最优的解法,优化的解法,我后续再试试~
2025-08-03 22:53:19
188
原创 代码随想录刷题Day23
从一个给定的字符串中找目标字符串,并返回出现的下标。我是直接按照字面意思,去查找。还没有去回顾使用KMP算法如何去设计这个算法。如果原地操作的话,可以使用reverse函数对字符串三次逆转操作:整个字符数组的字符逆转、两段字符数组的逆转。这道题是比较常规的对字符串的复制操作,找到右旋部分的分界点是关键。今天有些疲惫,做的简单字符串操作题,没有太多思考,后续补上。
2025-08-02 22:53:33
262
原创 代码随想录刷题Day22
更省事的方法是使用string.h中的关于字符串处理的split函数,直接以空格作为分隔符返回划分后的第一个首字母,这样迭代提取单词,然后把单词倒序排列。这道题的重点,我觉得是如何以空格为划分界线,把单词这样一个区域划分出来。这道题比较简单,遇到字母就copy到新的字符数组,如果是遇到数字,就在新字符数组中加入number的字符串。我这个做法是常规的,申请一个新数组来存放替换后的结果。这道题目在代码随想录中推荐使用的是,原地单词逆转,这里暂时先不看了😜。
2025-08-01 22:35:57
334
原创 代码随想录刷题Day21
四数之和II分析对象是四个数组,计算四个数组有多少种取值搭配可以使得四个数和为0,由于分析的是四个数组,不涉及到去重操作,以及答案是关于方案的次数,而不是具体的值,可以把原本四层循环遍历求值的题简化为两次的两层循环遍历,依次求出(a+b)并存储下来,求出-(c+d)并查找是否有(a+b) == -(c+d),从而进行统计达到要求的次数。三数之和,是对a逐一遍历,使用双指针来确定b和c的指针,只是要注意,a,b,c的值不能重复,也就是在移动的时候,得是移动到下一个。接下来开启字符串类型的题目刷题。
2025-07-31 22:55:05
961
原创 代码随想录刷题Day20
这一题相比前面的题目,细节方面要考虑的确实多了很多,自己最后写出来的代码,自我认为也还不是最好的代码,我这个代码在时间消耗和空间占用方面都没有优势。但是已经足够了,花了挺多时间在这道题目上的。这道题,我的最初想法是类比昨天的三数之和,使用两层遍历加上一个双指针遍历。但是自己代码实现起来还是会被一些测试用例卡住。尤其是因为数的范围边界,如数组中有的数刚好是边界值。,四个这样的值不能直接相加,在这里卡了很久,最后还是一次次提交,看卡住的例子,然后一点点给代码打补丁。
2025-07-31 00:38:32
272
空空如也
DevC++平台连接MYSQL
2023-02-08
C代码引用mysql.h
2023-02-04
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅