- 博客(36)
- 收藏
- 关注
原创 DP回顾 考前必看
总结:一样的思路,只要在遍历边缘的时候遇到石头后面的就是直接break,便都是0(初值为0),在遍历中间的时候,只要遇到石头,那一块就是不可达,然后else正常递推即可。总结:整数拆分首先要明确dp的含义,其次是关于i与j的遍历,i是要遍历从2到n的,因为i是表示被拆解的整数,而j是遍历如何拆解,总结:对比起那么的爬楼梯只是要把数组设为二维的,而且要记住先遍历边缘的,最后再处理中间的。总结:很简单,根据五部曲很容易得到,但有一个边界问题是:dp[i]=dp[i-1]+dp[i-2];
2025-03-20 10:11:28
174
原创 回溯考前总结
3.传参,不能重复分割,所以传i+1。1.组合总数给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。思路:首先要映射,其次就是这里是两个不同集合之间的组合,所以一个要注意终止条件是index==数字的长度(即横向长度),组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。总结:本题相比于上题,数组中可以有重复的数字(题目给的),并且target组合中不能有重复的数字(传参要传i+1)
2025-03-19 11:20:04
137
原创 代码随想录 DP day2
dp[i]=max(dp[i],max((i-j)*j,j*dp[i-j]) 这里是很容易想不清楚的,我的理解是,每次新的最大乘积要要和原来的乘积对比,这个是很好理解的,关键是新的最大乘积是如何得出的呢?其实我们找最大乘积的过程就是在找这个相近的数字,所以我们不知道拆分后是否还需要继续拆分,比如说6 是拆成3 和 3还是3和 3再拆分变成 1 和 2?思路:本题要求相加组合的最大乘积,需要知道一个结论,就是相加组合中数字之间差值越近,相乘越大,所以本题就是不断拆分,不断更新的过程。
2025-03-13 16:44:46
216
原创 代码随想录 DP day2
其次就是遍历条件,在遍历边上的时候当遇到障碍物就直接break。因为第一行和第一列只有一种走法,中间若有障碍物则后面都走不通。思路:对比之前的不同路径多了一个障碍物,首先考虑边界条件:起点或终点有障碍物时,那么无论如何路径都为0。最后是递推公式,只要保证当遇到障碍物的时候continue跳过即可,因为有障碍物的默认为0种路径。总结:在有障碍物的情况下要抽象成0条路径,将其普适化,这样递推公式依旧能够适用。
2025-03-13 14:07:03
106
原创 代码随想录 DP day2
总结:要注意for循环中i的范围,dp的下标要一直到cost.size(),因为dp[i]表示的是一直到i层需要花费的cost最小总和,而顶层则是下标为cost.size()思路:首先注意题目中只可向右和向下,那么递推关系就只需要考虑左边移一步和上面向下一步,所以递推关系就显而易见了,就是左边一步和上面一步的路径和相加。思路:递推公式和爬楼梯类似,都是思考第i层由什么得来的呢?即i-1和i-2加上对应的cost。这题只要递推关系出来了其他的四部曲就比较简单,不再赘述。
2025-03-13 13:21:15
223
原创 代码随想录 DP开始
前言:磨磨蹭蹭的终于来到了DP,科大的校线还没出,一想到很可能出线的那天就是我复试生活结束的那天,还是有些伤感的,但慢慢的就体会到,生活中没有那么多付出——回报的过程,更多的是付出——失败,再起身,等待下次命运的审判^-^,看到身边的人付出有了回报,我真心祝愿他们一直这样意气风发,而那些失意的人,希望幸运就在转角处,多坚持一下下把!首先题目规定了只能走一步或者两步,那么我们思考若计算dp[n],再往前推一次是什么呢,那就是dp[n-1]走一步到n,dp[n-2]走两步到n,这样我们的递推公式就出来了。
2025-03-12 16:18:54
731
原创 代码随想录 贪心
思路:计算每一个站获得,并且到下一个站的差值,即cost[i]-gas[i],将其不断累加到cur,而cur是不同起点的当前总和,若cur<0,即无法到达下一站,则更新startIndex=i+1,并且重置cur=0。为什么更新到i+1?因为一段路,只要从start到i+1无法达到,那么中间任何一个作为起始节点都达不到i+1。而另一个变量sum不会重置,只要sum>0,说明存在一个起点。
2025-03-12 15:52:07
134
原创 代码随想录 贪心
总结:sort的排序逻辑经常出bug,原因是写bool类函数的时候没加上static,而由于迭代器是从前至后,所以要从小到大,a<b即可,直接返回排序逻辑。思路:本题还需要一定的读题能力,读懂了思路并不难,主要是判断是否重合,若重合,怎么判断下一个也是重合的,这时候就要更新最右边界。
2025-03-10 21:56:52
180
原创 代码随想录 贪心^
思路:要保证每一个饼干都分配到最合适的胃口,即保证饼干的大小>=胃口才行,所以我们把两个数组有序排列,并且逐个对比。ps:两个for循环也是可行的,只是会超时。思路:老实说做的时候不太懂这个概念,稀里糊涂的。终于磨蹭磨蹭到了贪心了。
2025-03-08 13:05:42
207
原创 代码随想录 还是回溯 已吐
总结:回溯就是一个巨大的板子,各种情况可以不同组合,不同情况又有其对应的板子,只要板子熟练,这类题目不难。思路:区别上题,本题会有重复元素,但又不能包含重复的子集,所以要做到去重。我总结了去重的二要素,在注释中。主要区别组合问题即可。
2025-03-07 20:09:54
528
原创 代码随想录 回溯
会遍历无效组合,比如说横向分割的时候就不是回文串,纵向时又找到若干组合,但起始就是错的就会出现很多无效组合,所以一定要跳过无效的横向组合。因为只要非空字符串必有一组可以成立的分割组合,而index代表开始分割的位置,当分割到最后一个或大于最后一个,即全部分割完了。当横向遍历,尝试分割更长的字符串时(这里是横向和纵向没了解清楚),横向的时候startIndex是不变的,变得是末端i的位置。纵向:选择了第一次分割的若干情况的一种,然后继续分割剩余的情况。横向:初次分割的位置,剩下的没分割的就交给纵向分割。
2025-03-07 18:26:07
374
原创 代码随想录 回溯 启动!!!
思路:做回溯,逐渐意识到,只要会写组合问题,其他回溯问题只要明白其与组合问题的区别,问题就迎刃而解。思路:比起上题不可以用重复元素,并且组合也不能重复,然而数组中仍可出现重复数字,所以要保证去重(暂时不太懂)2.判断条件是sum==target,而不是index是否等于组合内数字个数。作为void函数,是可以自然的遍历结束,不返回任何值的。,编译器会报错,因为函数必须返回一个。那么问题就很好解决了,再稍作剪枝即可。,函数会自然结束(因为它是。函数中,如果没有执行。函数中,如果没有执行。
2025-03-07 11:33:25
94
原创 代码随想录 回溯
答:设置一个vector<string>,再通过减'0'来将字符串中的数字字符转为真正的数字,再通过设定一个letter记录映射字符串。关于index和i的关系:index是数字字符串中的索引,而i是数字映射的字符串的索引。关于终止条件中的return位置。
2025-03-06 20:42:26
131
原创 代码随想录 回溯
而递归中关于index与i的关系也容易搞混,要明白index是我们后面传参的,而i是在for循环中不断变化的,准确的说是i带动index变化,而要保证递归每次向后,初始时,i就要=startindex,而startindex我们又可以初始传参给他赋值。总结:还是对终结条件半懂不懂,但大概可以理解为,首先要保证组合中个数不能超过规定个数,当等于个数时,判断是否是题目需要的,不需要,return,弹出,再遍历,若需要,插入result,再弹出,继续遍历。例如 【1,2 】【2,1】
2025-03-06 18:33:27
463
原创 代码随想录 层序遍历
ps:这里要知道point->children也可以用.size(),因为children是由vector记录的。思路:多由左右孩子变成N个孩子,只需要多加一个for循环,将所有孩子压入队列。思路:同层序遍历,只要保证每次记录的是一行最后一个即可,即size-1。思路:同样的,只需在遍历每一层的时候设置一个变量记录平均值即可。
2025-03-06 10:12:23
157
原创 代码随想录 层序遍历
思路:使用一个队列,将每一层的元素以从左至右录入,设置一个size,记录每一层的长度,在每次弹出size个元素,并在弹出时将左右孩子push进队列。总结: 本体要求从下至上,那么已保存从上至下的result直接一个reverse,反转数组即可。总结:一定要保证for循环内的size是固定值。
2025-03-05 17:59:46
201
原创 代码随想录 树
树的遍历其实可以直接按根左右这种直接写函数,push即为根,传cur->right即为右,同理left即为左,同时在第一行先加判断语句,这样函数就写完了,直接传参即可。总结:递归需要传参时要明确 是否需要修改?
2025-03-05 16:29:47
318
原创 从0开始准备华五复试 栈和队列
思路:遇到匹配问题栈一般最好解决,首先我们可以先遍历字符串,因为括号匹配中,往往是左边在前,所以当我们遍历字符串时,会先遍历左边的括号,所以每遍历一种括号,我们就将对应类型的右括号压栈中,又因栈符合先进后出,所以最后一个的左括号对应的右括号,一定在栈顶,而第一个就在栈底,所以我们再用一个if判断和栈顶元素是否一致,若一致,则匹配成功,出栈,不一致或是栈已经空了,则匹配失败。ps:经常会犯两个条件的先后问题,比如注释行,应先判断是否为空,然后在用top进行对比。
2025-02-25 19:40:27
165
原创 从0开始准备华五复试 字符串
0即保证不是第一个元素),然后while遍历赋值此单词。bug:最后一部分翻转,i应该是<=s.size(),因为是左闭右闭的翻转,所以每一次翻转是i-1,那么要翻转start到s.size()-1,i就应该等于s.size().首先设置一个start,作为每一个单词的起始位置,再用一个for循环即可,遇到空格则翻转(start,i-1),再用start=i+1,更新每一个start位置。思路:首先将所有空格规范化,将字符串改为规范的形式,再将整个字符串进行翻转,最后将每一个独立的单词再次翻转。
2025-02-23 14:31:09
433
原创 从0开始到华五复试 字符串
思路:问题是在于处理每经过2k要反转前k个字符,若是利用for循环中i+=2*k,即可遍历每次起点,再利用reverse即可。而<2k其实不用判断,因为只要剩余的大于k,那么就翻转前k个即可,若小于k则直接翻转(比如剩余k+1个话,直接就翻转前k个,然后最后一个不用管了,直接return即可,最后一个不算是少于k个的,因为其在遍历的2k个元素内)而还有一个点是,字符串有奇数偶数的情况,我们可以用一个i<s.size()/2,这样奇数最后中间的就遍历不到,而偶数自然就能全部交换。许愿一下,然后继续坚持刷题。
2025-02-19 18:38:33
385
原创 从0开始准备华五复试 哈希表
思路:利用双指针遍历,难点主要在于去重,去重的细节主要在于i的去重和left和right的去重语句的顺序,i需要和前面的对比,rigth和left要在插入时判断。一些debug在注释。
2025-02-18 13:46:24
143
原创 从0开始准备华五复试 哈希表
小知识点: "magazine[i]" 和字符 'a' 进行直接运算(例如相加),那么编程语言会将这两个字符转换为其 ASCII 编码值进行运算。思路:构建数组哈希表,遍历一次增加记录,第二次遍历另一个数组看是否够减,就可以得知是否够构建赎金信。跟字母异位差不多,本题由于只有26个字母,所以可以直接用数组构造哈希表,效率高。
2025-02-16 18:53:34
121
原创 从0开始准备华五复试 哈希表
思路:需要明白map的用法,这里我们需要遍历时不断记录元素,map元素有键和值,要用键,也就是数组的下标来表示已有数字,而数组记录的数字则为值,为下标(这里感觉表述不是很清楚,可能有点问题。思路:四个数组,先遍历两个数组,用map记录两个相加的集合,并且用数组值记录次数,再遍历另外两个,再相减即可,若有,找值,即记录出现次数,直接相加即可。一个bug是return{};必须加,因为是要返回一个vector,若查询不到,也要返回一个vector类型的(不知道对不对)
2025-02-16 09:58:50
103
原创 从0开始准备华五复试 哈希表
思路:还是用哈希表的思路,题目中会出现sum循环出现的情况,所以用unordered_set判断每算出一次sum是否为重复过的,如果为重复的,直接return false。总结:易错点是忘记更新n的值,要有一个遍历的过程。
2025-02-15 20:00:41
205
原创 从0准备华五复试 哈希表
此题较简单,需要注意的点就是如何用数组表示哈希函数的映射,因为a--z的ascii码是连续的,所以可以直接用相对位置,这样就可以用一个26个数字的数组表示所有字母的个数了。总结:有一些语法问题不熟练,1.遍历集合使用for,num应该有类型int。2,返回应该是一个向量,vector,并且起始位置和末尾位置的集合必须保证是同一个。思路:主要是set数据结构的应用,unordered_set可以保证去重,并且效率最高。ps:哈希表的数据结果不熟,二刷要多看看。
2025-02-15 17:24:57
271
原创 从0开始准备华五复试
答:这涉及到一个数学推导,我看的是b站代码随想录的视频,结论就是,快慢指针相遇的位置,设置index1,头节点位置设置index2,当两个节点都向后遍历,相遇的地方即使入口节点。总结:有一个bug是fast的while 判断,应该是判断fast->next,而不是fast->next->next,因为不能保证fast->next存在,所以会出现bug。答:将指针遍历,只要一直没有null,就有环。1.首先如何判断链表是带环的?2.如何求出入口节点的位置?
2025-02-14 17:31:58
183
原创 从0开始准备华五复试之链表终章
思路:主要是明白本质是指针判断相等,如果两条链表存在相交节点,那么从此节点之后肯定都是一样的(包括数字,链表元素个数)。所以应该将索引指针移动到相同的起始位置,保证从此节点后的数量一致。这样才有检查的必要,不然连数量都不一样,一定是不存在相交节点的。总结:有一个小问题是,若没查询到应返回nullptr,而不是建一个初始为0的链表元素。磨磨蹭蹭终于是要把链表结束了!
2025-02-14 13:55:35
184
原创 从0开始准备华五复试
思路二(快慢指针):已知要找倒数n个节点,那么要删掉他就要找倒数n+1的节点,所以设置两个指针一个是虚拟头节点一个是先走n+1的节点,逐个向后遍历,当fast节点指向到nullptr,那么也就找到了倒数第n+1个节点;这里要注意一下sum是不带虚拟节点的节点总数,num是相对于真正头节点的位置,比如num=0就是头节点,num=1就是头节点下一个节点;思路一(暴力):直接算出链表长度,找出要删除的前一个节点,删除。链表这边的题都挺简单,就不赘述了,大多都是要用到虚拟头节点的。
2025-02-12 17:43:04
171
原创 从0开始准备华五复试day6
这是没有搞清楚原链表和更新的先后顺序,tmp记录的才是原先的链表元素,所以若是cur=cur->next再经过pre更新后,只会不断指向一个元素。1.是若为头节点,则需要单独讨论(因为头节点没有前一个结点),所以我们本科时会学到虚拟头节点vhead,这个头节点不记录任何信息,而真正的头节点作为vhead->next;思路:移除元素大家都很熟悉,无非是xx节点的->next=xx->next->next;思路:利用双指针思想,一个在前一个在后,这里贴一个图像链接,模拟了双指针的过程看起来直观一些。
2025-02-08 20:06:23
389
原创 从0开始准备华五复试day5
前缀和即在输入数组的时候,就将每一个以数组下标0为起点,终点为当前输入下标,这区间的数进行加和,将其保存在数组p。所以计算某一个区间就可以将数组p中的sum相减,即为所求,例如求【2,3】,则用p[3]-p[1](ps:p[2]包含下标为2的数,所以应该是减1)总结:又重温了一遍语法,scanf和printf都有些生疏了,学习到了cin的用法,scanf直接输入了,无需再等于,dev c++中不新建项目会出现同名的bug (ps:这点在本地调试的时候要注意!随后的输入为需要计算总和的区间,直至文件结束。
2025-02-06 16:43:00
247
原创 从0开始准备计算机复试 leetcode59.螺旋矩阵
思路:整体思路比较简单,其实就是定义一个二元数组,将数字填充进去,难点就是一些边界条件要弄清楚,就是在四条边遍历的时候,是全部都遍历呢,还是有一头不遍历,我认为这跟二分,以及二分查找树都是差不多的,核心就是保持一个规则,不然自己会把自己弄混。顺便再次请教一个问题:在复试上机的时候,怎么在本地进行调试呢,比如我在本地用dev c++调试leetcode代码就会爆很多语法错,也有头文件名和int main(),真是有些苦恼。ps:最近有些怠惰了,明天开始要每天A5道以上,再要把c++的基础语法好好学一下。
2025-02-05 21:20:26
202
原创 代码随想录数组
二重循环的思路是将所有情况遍历,而滑动窗口则是固定尾部,去移动首部,从而遍历出最小的长度。这里有一个思考的难点是,滑动窗口比起二重循环少了哪些冗余判断呢?答案是:少的是中间判断,题目要求的是连续数组元素,而滑动窗口若在首部移动时不满足sum>=target,则当前循环的尾部直接跳出,不在移动首部,而二重循环还会遍历这个部分。总结:一个犯的小错误是一开始没保证result是最大值,所以会出现bug。总结:补充了三元条件判断的语法,滑动窗口还是有些不透彻,日后需要再次练习。二重循环,遍历所有组合。
2025-02-04 17:31:27
151
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人