![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
录鼎记
文章平均质量分 67
宇文辰兴
这个作者很懒,什么都没留下…
展开
-
《录鼎记》——动态规划part03
dp[0],dp[1]的值是无效值,因为他们无法进行拆分为正整数和,所以可以直接对dp[2]进行初始化,dp[2]=1。dp[i] += dp[以j为头结点左子树节点数量] * dp[以j为头结点右子树节点数量]拆分多次:j*dp[i-j],这个代表拆分多次是因为联系到了前面的值,而前面是拆分过的了。所以递推公式:dp[i] += dp[j - 1] * dp[i - j];4、遍历顺序,由于后面的最大值可能取决于前面的最大值,所以应该从前向后遍历。dp[i]是i个节点能组成的组成二叉搜索树的个数。原创 2023-04-24 19:39:46 · 85 阅读 · 0 评论 -
《录鼎记》——贪心算法part06
本体就是要思考多种情况,1、左右节点都有覆盖,此时节点本身是没有覆盖的.2、左右节点至少有一个节点没有覆盖,此时为了保证全覆盖,需要在该节点插入摄像头。3、左右节点至少有一个摄像头,此时该节点是覆盖的4、头节点无覆盖,这个在最后判断根节点,无覆盖则结果加一。如果一直符合递增原则,那么这个题的结果就是输入的数本身,但如果不符合递增就要将前一个数减1,并将后面的值赋值9,以达到满足条件的数,如果前面的数也不符合单调增原则,那么就继续向前,知道第一个数。总结:局部最优转全局最优(狗头保命)原创 2023-04-23 16:48:25 · 75 阅读 · 0 评论 -
《录鼎记》——贪心算法part05(先过需补)
字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。我一开始就说引爆气球很像,其实就是说非交叉区间的数量就是弓箭的数量,只要稍加修改,就是需要移除的区间数量。感觉和昨天的箭的题差不多。435. 无重叠区间。763.划分字母区间。脑子不转了,先过一遍。原创 2023-04-19 21:43:20 · 38 阅读 · 0 评论 -
《录鼎记》——贪心算法part04
这个题要贪的是最少的箭,此时需要的是两种情况,一个是两个气球不挨着的情况下需要加一支箭,那么如何判定两个气球不挨着呢,其实是不能拿下一个气球的起点和前一个气球的终点,为什么呢,因为可能前面的气球穿不了,所以在另一种情况下,我们要动态更新最短的边,也就是最短的终点位置。如果5美元则是正好完成,如果10美元则需要一个5美元来去找零,同时five的数量减少,如果是20美元则有两种情况,一个是一个10美元和一个5美元,另一种情况是需要3个5美元找零,只要对于相应的情况有相应的美元去找零,则返回true。原创 2023-04-19 00:52:46 · 101 阅读 · 0 评论 -
《录鼎记》——贪心算法part02
这个的重点不在于需要跳多少格,应该算覆盖的范围。i+cover是当前位置向后覆盖的位置,cover是之前一个状态能达到的覆盖度,取最大值。这道题的局部最优就是每天的正利润累加,非正利润就跳过。最终获得了最大的利润。给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。122.买卖股票的最佳时机II。判断你是否能够到达最后一个位置。一、买卖股票的最佳时机II。脑子不转了,先照着写一遍。不太看得懂,照着写了一遍。原创 2023-04-17 22:21:05 · 69 阅读 · 0 评论 -
《录鼎记》——贪心算法part01
相反, [1,4,7,2,5] 和 [1,7,4,5,5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。这是一个极其简洁的代码,它的原理是,pre存储累加和,但是如果不是最大值的时候,maxans不会改变,同时如果此时的累加和是负的,说明对于整体的累加和是副作用,所以pre用max函数规避了这个坑。少于两个元素的序列也是摆动序列。结果是报错的,原因是什么,因为我们的index指针是不动的,如果胃口的最小值大于饼干的最小值,那么指针一直不动,导致错误。原创 2023-04-17 20:14:48 · 73 阅读 · 0 评论 -
《录鼎记》——重启之回溯算法part06
代码的基本逻辑还:对于符合条件的节点,即为当前机票的目的地为出发地,且飞过的机场进行记录,以免重复,同时将结果添加到result中,由于要用字母排列,同时一个机场映射多个机场,所以使用unordered_map。需要用到ticketnum记录有多少个航班,这里的返回值用到的bool,原因是这个行程是我们在树型结构中找的唯一一条通向叶子结点的路线。递归的下一层的棋盘一定比上一层的棋盘多一个数,等数填满了棋盘自然就终止(填满当然好了,说明找到结果了),所以不需要终止条件!到了叶子节点的时候,就可以收集结果了。原创 2023-04-16 22:25:54 · 37 阅读 · 0 评论 -
《录鼎记》——重启之回溯part05
其实如果从0开始,深度和广度都是走完数组,所以重复项的产生就在于二者从不同的道路得到了一样的结果,造成这个原因是顺序不同,但我们的数字是无法展现这个问题,那我们要消除重复项的时候其实是可以从深度和广度两个方面进行去重,所以是两种情况。依然是先来了一遍代码,和之前的组合有些不同,她不用找起始位置了,由于每个元素都需要上,所以就从0开始,其次是,为了能够有顺序变化,将取的数做了标记,防止重复取用。本题需要到每一个节点,所以其实可以不需要终止条件,但有收集条件,所以需要将path序列大小大于1的序列返回。原创 2023-04-12 17:25:43 · 67 阅读 · 0 评论 -
《录鼎记》——重启之回溯part04
需用result存放结果,同时函数的参数需要字符串s,开始位startindex,而且因为需要加点,所以应有一个值是记录添加逗点的数量。和之前组合总和III的做法一样,在同一层中取相同的数字需要过滤,在同一树枝上就可以重复取,因为一个树枝上最后形成层的是一个结果。判断数据是否合法排除了开始位大于结尾位的情况,同时排除了0开头和数字不符合的情况。需要path存放单个子集,最后添加到result中,而在函数中需要数组和起始位置。本题题解还给出了set去重的方法,原理是其实是一样的。把求自己抽象成为树形结构。原创 2023-04-12 01:04:59 · 36 阅读 · 0 评论 -
《录鼎记》——重启之回溯part03
这块确实抽象,意思其实就是当取后面的数的时候used[i-1]就是表明回溯的时候是否使用过前面的一个值,如果为true则在path集中是存在前一个数的,反之则不存在。而提前计算的逻辑就是二维布尔数组,i从大到小,j从i开始变大,以保证在i行时,i+行计算完毕,同时在同一行中,每一个结果可以根据前一个结果产生。我自己给写了一段错误代码,这代码的错误在于剪枝减太多了,将组合中有相同元素的情况,比如【1,1,6】的情况减去了。当总和sum大于目标值的时候返回,当等于目标值的时候送到结果集中。原创 2023-04-12 00:13:16 · 72 阅读 · 0 评论 -
《录鼎记》——重启之回溯到算法part02
参数需要目标和、题目中k个数的集合,sum为已经获取的和,startindex为循环起始位置。(放在这里是因为有下面再进入到回溯函数中的时候需要验证sum的值,如果已经大于的时候就不需要再进入回溯函数或者执行其他操作。还有一个地方可以剪枝,和上个题目一样,如果其余的数据的数量已经小于k,就不需要再考虑了。和上道题一样,string类型来储存叶子节点的结果,然后用字符串数组储存字符串。如果达到了k个数目就终止,但如果等于需求的和,则这个结果加入到result中。这里的判断条件就是上述的剪枝。原创 2023-04-08 22:32:56 · 55 阅读 · 0 评论 -
day24《录鼎记》——从回溯法重新开始
今日内容:一、理论基础回溯法解决的问题都可以抽象为树形结构回溯三部曲:1、 回溯函数模板返回值以及参数2、回溯函数终止条件3、回溯搜索的遍历过程回溯模板 二、组合力扣题目链接 (opens new window)回溯三部曲:1、递归函数的返回值以及参数2、终止条件如果path的数量达到了要求的k就停止3、单层过程代码题解中做了剪枝优化,大意是减去那些肯定不够数的,比如说从2开始要4个数,但是一共就是1-4,很明显就是只有【1,2,3,4】这一种情况。所以在里面印出来已经选择的个数有p原创 2023-04-07 22:03:11 · 33 阅读 · 0 评论 -
补稿二——二叉树最后一天
迭代法照着写了一遍,逻辑是看懂了,第一段是如果为空则返回空,第二段是使头节点在区间内,具体方式是,如果在区间左侧则往右子树移动,反之则往左子树移动。当前节点的值小于左边界,应该去找右边的节点(由于是二叉搜索树),如果大于右边界,应该去找左边的子节点,具体实现方式是像创建一个节点去应该去的方向寻找,并返回节点;通过返回值进行修剪(大致思路是将节点加入到递归当中,返回的节点,就是我们需要的符合条件的节点,或者为空节点)如果符合条件,在区间内,就将下一层的结果给到左子树和右子树,最后返回根节点。原创 2023-04-07 21:09:24 · 40 阅读 · 0 评论 -
《录鼎记》——二叉树
迭代法的大致思路是:先找到对应的空节点,然后看其与父节点的关系确定放在左子树还是右子树当中,当然如果头节点为空则是直接作为根节点。可能情况五:左右孩子节点均不为空,则将删除节点左子树头节点放到删除节点右子树最左节点的做孩子上,并返回删除节点右孩子。并且,从上向下遍历,第一次遇到cur节点的数值在区间内内,则cur就是怕,q的公共祖先。可能情况三:删除节点的左孩子为空,右孩子不为空,删除节点,右孩子补位,返回右孩子。可能情况四:删除节点的右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子。原创 2023-04-05 16:29:22 · 27 阅读 · 0 评论 -
《录鼎记》第21章补档——有点晕
这题题解首先给出了最普通的思路,就是如果此题不是二叉搜索树而是一棵普通树,就需要用哈希将元素与其对应的次数统计出来,然后依据频率进行排序(此处是用到了pair,将map中的数据提取出来。大体思路是,依据中序遍历有序的特点,依次遍历,一样的数记录次数,如果等于目前的最大值就记录在结果中,如果大于目前的最大值就清除结果集中的所有内容并将新结果加入。大致思路是先把所有的左侧节点推进栈中,当到头时,从栈中退出最左侧节点,作为最小值,进行比较右侧节点。而本题给出的是二叉搜索树,所以他的中序遍历就是有序的。原创 2023-04-05 14:34:58 · 35 阅读 · 0 评论 -
《录鼎记》——第N章,做一大半心有点乱,不想起标题了
还是自己尝试写了一遍,然后看题解发现太麻烦了,emmmm其实逻辑是一样的,只是我的循环条件是恒成立的,而题解的循环条件我是依据迭代的题解在循环中处理了。这里题解是先设了一个结果变量,将两种i情况的解放在了result中,这样更直观吧,我是直接在两种情况中就直接返回了(其实和题解整体代码的第二版一样)。只要是遇到空节点和所需要的节点,就返回该节点(其实和我上面的逻辑是一样的,只是更优化,逻辑上root为空时返回的也是不存在的空,所以是一种情况)返回的应该是个树的根节点,然后参数是两个未合并的树。原创 2023-04-03 17:43:10 · 44 阅读 · 0 评论 -
《录鼎记》第十六章——得慢慢看,不然看不懂了
思路:以 后序数组的最后一个元素为切割点,先切中序数组,根据中序数组,反过来再切后序数组。本题的目标是找到左下角的值,也就是最底层左边的值,可以说用层级遍历更方便一些。需要两个全局变量result记录最深节点的值,maxdepth,记录最大深度。参数需要有根节点,还有最大深度,所以不需要返回值返回类型为void。由于要遍历整个树,找到所有符合条件的路径,所以递归函数不需要返回值。需要二叉树的根节点,还需要一个计数器,用于计算和是否为目标和。和递归的参数类似,需要存放节点和路径数值总和。原创 2023-04-01 21:37:12 · 33 阅读 · 0 评论 -
《录鼎记》第十五章——二叉树part04
本体输出的时路径不需要返回值,所以类型是void,要输出路径所以参数为节点,路径,和result。本体因为要求是否符合平衡二叉树,平衡二叉树要求高度差不能大于1,所以应用后序遍历的递归。由于返回的是二叉树的高度差,所以返回值应为int型数据。左子树遍历的值为-1,则整个不符合,右子树遍历值为-1,则整个也不符合。这题因为要输出所有的路径,所以需要从叶子节点回溯到前面的节点。当以所遇节点为根节点的树高度为0时说明遇到了空节点,应返回。然后在比较该节点是否二者差的绝对值大于一,若大于1则不符合。原创 2023-03-31 23:44:35 · 44 阅读 · 0 评论 -
《录鼎记》第十三章——有史最长篇
思路一:队列实现,将根节点推入,之后在队列非空时,记录一层中的元素数量,然后遍历将该节点的值记录在vec中,左右子节点送入队列,等待下一次循环,直到队列为空——即层序遍历完毕。因为我们要比较的是根节点的两个子树是否是相互翻转的,进而判断这个树是不是对称树,所以要比较的是两个树,参数自然也是左子树节点和右子树节点。思路:需要把每一层的第一个节点拿出做头节点,最后将最后一个节点指向空,中间为前节点的指针指向现节点,现节点变为了前节点。因为是先前序遍历,所以先进行交换左右孩子节点,然后反转左子树,反转右子树。原创 2023-03-30 00:01:00 · 48 阅读 · 0 评论 -
《录鼎记》第十二章——二叉树
写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。在这里也就会重复调用自己来实现递归的过程。思路,迭代遍历需要用到栈,其中前中后序的遍历的代码还有一定的区别。此处三者比较雷同,会一个就能会三个,此处列出前序遍历。二、二叉树的递归遍历。原创 2023-03-28 18:04:26 · 31 阅读 · 0 评论 -
《录鼎记》第十章——栈挺熟悉的快速过
需要注意的点是当把所有s中的元素遍历完之后。应该将栈中元素重新推入结果字符串,然后,应该将字符串前后颠倒(由于后进先出,先输入result中的是尾部元素)思路:本题的思路就是将左括号对应的右括号输入到栈中,如果栈顶元素与对应的右括号相同,则满足有效的规则,弹出栈顶元素,继续比较,直到栈空。这题还是主 要使用栈的属性,看抓取的元素与栈顶元素是否相同,相同则推出栈顶元素,同时抓取下一元素,如果不相同则将此元素推入栈中。如果遇到操作数的话,推入栈中,如果遇到符号的话,就取出栈顶的两位操作数做相应的操作。原创 2023-03-25 09:21:35 · 32 阅读 · 0 评论 -
《录鼎记》第八章——KMP是上好的安眠药
之前刷到jmp的时候给自己整蒙了,直接看睡着了,希望今天再看一遍能有收获。getnext()代码基本没变,是下面的判定条件发生变化。移动匹配的代码还是比较简单的,今天的重头戏还是kmp。跟着题解学了一遍,有跟着代码梳理了一遍思路写过了。总结总是很重要,带我们回顾写过的代码。主打的就是一个没有思路(全忘了)看完一遍,我有感觉我行了(狗头)28. 实现 strStr()一、实现strStr()459.重复的子字符串。原创 2023-03-23 20:41:55 · 30 阅读 · 0 评论 -
《录鼎记》第七章——字符串轮转
但在这里,为了不让句子末尾的单词需要单拎出来使用参数有变化的reverse函数,在这个值上,下面的if用或运算避免了这种情况,因为if判断语句中,如果前面的运算可以确定此次判断的值(此处i==s.size()时直接为true进入if下面的语句中),是不会再向后进行运算,直接执行或跳过。有两个地方比较难以理解,首先是在removeExtraSpace也就是移除空格的时候,题解里德算法将buslow非零的情况拿出来,在这种情况下是要接一个空格然后接单词的,所以有。虽然用了额外空间了,但是这涉及到字符串轮转。原创 2023-03-22 19:25:29 · 170 阅读 · 0 评论 -
《录鼎记》第六章——哈希表有进步哦。
思路就是遍历找a+b的和记录在map中,再找c+d取相反数在和map中找对应的key,count就加上其value。也算是一遍就过了,思路没问题确实还是蛮快的,但还有一些可以改进的地方,比如目标串大小大于参考串,此时可以直接返回错误,因为完全匹配也满足不了。题目解读:由于是答案中不能包含重复元素,所以如果用哈希可能在剪枝中超时,也自己尝试写了一些,感觉还是挺困难的。题目解读:四数之和和三数之和基本相同,就是剪枝需要更多注意。题目解读:感觉是比较简单的,和昨天第一道题是差不多的。454.四数相加II。原创 2023-03-21 18:12:11 · 300 阅读 · 0 评论 -
《录鼎记》第五章——重启哈希表
题目解读:首先需要一个求它的算法的函数,需要自己写,没有太多困难。之后再把出现的数加入哈希表,重合的数就说明他无限循环了。这题可以暴力解,但是很low,因为涉及到了两个整数、以及他们的下标、所以应该使用map解决此题。题目解读:这道题的大致意思就是看两个单词的组成字母是不是一样的。其实也可以用哈希,但用数组明显感觉亲切一点,感觉就是熟练度不够。常见哈希结构:数组、集合(set)、映射(map)可以用哈希表做,但是用数组应该会更简单一点。这个题是比较简单的哈希应用吧。二、有效的字母异位词。原创 2023-03-20 18:49:49 · 489 阅读 · 0 评论 -
《录鼎记》第四章——写链表逻辑最重要
题目解读:就是和标题一样吧,为了防止投机取巧,还特意点明只能进行节点交换,不能修改内部值,这也就是算法特训的一些本质吧,有些题看着用一些别的方法很简单,但却失去了训练的意义,所以不能投机取巧。题目解读:由于这个题需要删除的结点是倒数第n个,就可以使用双指针形成一个窗口,使得快指针指向最后一个元素时,慢指针指向倒数第n+1个节点(方便指向倒数第n个节点)。深刻认识到了对于链表,逻辑真的很重要。感觉训练营在逐渐加大训练量,也提前看了一下后续的一些题目,感觉数量不少,昨天一天的事请假了,3.19来补卡。原创 2023-03-19 18:09:26 · 582 阅读 · 0 评论 -
《录鼎记》第三章——链表设计给我整疯了
这行代码是将原先顺序的下一个指针head->next的next指向了自己,再把原来的指针断掉,实现了反转。题目解读:这一题就是要完成链表的各种操作,说实话一直是我的弱点,跟着题解联系了好多次,还是会有错误,希望下次能改进吧。这是我自己尝试的第一个版本,虽然有些细节问题,但大体思路是和双指针是一样的。数组阶段结束,进入了链表阶段。题目解读:就简单的删除链表元素,不会有人不会吧!还是有一些缺点的,比如说没有删除没有用的节点。后面的使用栈解决,是利用了栈后进先出的特性。要点:这题是比较难的,也是有很多的解法。原创 2023-03-17 23:04:12 · 660 阅读 · 0 评论 -
刷题体验第二天——《录鼎记》第二章
题目解读:第一个要点是给出的数组是非递减顺序排列的,也就是从小到大排列;遇到了问题是初始设定的长度为零,导致后面计算的时候0一定是最小的;第一遍写的基本算暴力算法吧,就——按部就班,先平方在排序,但其实这种要求不多的题直接用sort并不是很好。初步思路是双循环的暴力算法,但是写到一半感觉太麻烦,没啥前途,逻辑很乱,也会超时,决定看看题解。看了一遍题解写的,主要是变量比较多,大致思路是有的,很多细节还是需要注意。数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II ,总结。一、 有序数组的平方。原创 2023-03-16 18:11:51 · 1024 阅读 · 0 评论 -
刷题体验第一天——《录鼎记》第一章
先来解释为啥用这个标题(除了蹭一点之外呢),第一个字,代表刷题的题目来源是《代码随想录》,而鼎有两种解释,一种是谐音顶(原谅作者现在还是个菜鸟),另一个也是时刻提醒自己,不能眼高手低,要切实的去刷每一道题。我用的是相向双指针法,其实同向的双指针法也很简单,就是快指针在遇到val值时会直接跳过去,单慢指针会走这一点,并将快指针指向的,非val点的值覆盖到上面。但是y1s1,这种方式还是比暴力解法要快的,毕竟省去了重复覆盖的过程,后续的val值也有一些直接跳过了。1、数组的在内存空间中的地址是连续的。原创 2023-03-15 16:14:31 · 1221 阅读 · 1 评论