- 博客(47)
- 收藏
- 关注
原创 代码随想录八股训练营完结总结
总共将近100道题,C++总结了一万+字,OS和计网总共2W+字,MySQL稍微少点,但是考察的也少。40天的训练营,我总结了自己完整的八股文,后续在面试过程中可以补充。希望接下来的面试可以更加顺利!
2025-04-14 17:40:56
351
原创 代码随想录day49 单调栈2
双指针优化:在计算左边最高和右边最高的时候,有重复计算,考虑开辟两个vector,分别记录位置i的左边最高和右边最高。思路1:暴力,双指针,按列求.发现改列的水=min(左边最高,右边最高)-height【i】,累加。建议是掌握 双指针 和单调栈,因为在面试中 写出单调栈可能 有点难度,但双指针思路更直接一些。计算雨水:当要进来的比栈顶大,记录栈顶x1,弹栈,记录栈顶x2,我要找在当前右边的,第一个大于当前的柱子,形成高低高的凹槽;栈中的元素还是下标。题目:42.接雨水 84.柱状图中最大的矩形。
2025-03-01 09:34:15
179
原创 代码随想录一刷总结篇
回头看看自己写的博客,发现自己真的能坚持下来了。之前总是断断续续,因为一些事情耽误了就再也没有补,这次终于坚持下来了,也算给找实习打了个基础。接下来就是刷hot100,用五部动态规划和回溯三部曲等,做出自己的方法论。
2025-02-06 13:44:59
254
原创 代码随想录day48 单调栈1
题目:需要重做:什么时候用单调栈呢?通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了。时间复杂度为O(n)。那么单调栈的原理是什么呢?为什么时间复杂度是O(n)就可以找到每一个元素的右边第一个比它大的元素位置呢?单调栈的本质是空间换时间,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素高的元素,优点是整个数组只需要遍历一次。更直白来说,就是用一个栈来记录我们遍历过的元素,因为我们遍历数组的时候,我们不知道之前都遍历了哪些元素,以至于遍历一
2025-01-21 17:39:17
350
原创 代码随想录day46 动态规划13
因为是回文子串:他的除了最边上两个,内部一定是回文,所以dp[i][j]:下标为i,j的字串是否是回文子串。当不等的时候,判断加左边的大还是加右边的大:dp[i][j]=max(dp[i+1][j],dp[i][j)2.相邻字母:true;3.因为2中没有对i,j相同的进行判断,所以将i==j的情况初始为1,其他为0。2.当s【i】==s【j】:dp[i][j]=dp[i+1][j-1]+2;1.dp[i][j]:下标为【i,j】的字串是否是回文子串。1.dp[i][j]:【i,j】的最长回文子序列。
2025-01-21 11:52:07
236
原创 代码随想录day45 动态规划12
1.s[i-1]==t[j-1]:可以选择取j-1也可以不取,取的话是dp[i][j]=dp[i-1][j-1],不取的话是dp[i][j]=dp[i-1][j]思路:dp[i][j]:以i-1为结尾的字符串word1,和以j-1位结尾的字符串word2,想要达到相等,所需要删除元素的最少次数。即不等于的话,肯定不使用s的i-1个元素。当word1[i-1]=word2[j-1],dp[i][j]=dp[i-1][j-1]不等:dp[i][j]=max(dp[i-1][j],dp[i][j-1])
2025-01-19 19:37:50
729
原创 代码随想录day44 动态规划11
3.递推用到左边和左上方,所以要初始化第一列和第一行,又因为第一列和第一行的含义都是两个字符串,与空串的长度,所以都为0即可。法1:贪心:res记录,一个tmp累加,遍历:先加等,然后如果大于res,res赋值tmp,如果tmp小于0,tmp=0;1.dp[i][j]:字符串1下标为i-1及其之前的串,字符串2下标为j-1及其之前的串,最长子序列长度。4.由于递推公式要用到左边,上面和左上方的数据,所以只能从左到右,从上到下。1.dp[i][j]:s下标为i-1的串,和t下标为j-1的串的最大匹配长度。
2025-01-19 11:52:53
237
原创 代码随想录day43 动态规划10
注意:为什么要让i,j为下标i-1,j-1:因为我们在循环的时候要用到dp【i-1】【j-1】,这样的话,循环初始值就是1,不用考虑为负数的情况,便于理解。1.dp[i][j]:以下标i-1为结尾的A,和以下标j-1为结尾的B,最长重复子数组长度为dp[i][j]。思路:dp【i】需要一点点推,从前往后,而且需要遍历i之前的每一个,才能确定。什么时候子序列可以加上dp【i】:当num【i】比num【j】大的时候。1.dp[i]:以nums【i】结尾的,最长子序列的长度。需要双层循环,且i在外层。
2025-01-18 17:04:31
364
原创 代码随想录day42 动态规划9
题目:188.买卖股票的最佳时机309.最佳买卖股票时机含冷冻期714.买卖股票含手续费。1.写出状态,一般为两个状态:持有股票和不持有股票;//持有股票:1.今天买,前一天是冷冻;1.dp[i][j]:第i次持有/不持有股票,奇数持有,偶数的是不持有。//第i次持有股票,两种情况,第i-1次持有股票,i-1次不持有股票。注意:最后return的是状态2,3,4的最大值,而不是单一的。//卖出股票:1.前一天持有。思路:两个状态,持有跟不持有,买的时候加上fee就行。
2025-01-18 15:37:16
304
原创 代码随想录day41 动态规划8
题目:121.买卖股票的最佳时机 122.买卖股票的最佳时机II 123.买卖股票的最佳时机III需要重做:全部股票问题是一个动态规划的系列问题,前两题并不难,第三题有难度。121. 买卖股票的最佳时机 法1:贪心:代码:class Solution {public: int maxProfit(vector<int>& prices) { int low=INT_MAX; int result=0;
2025-01-18 11:50:59
413
原创 代码随想录day39 动态规划7
不偷该节点(可以选择左右孩子偷还是不偷,选最大 的)思路:就是从树根节点出发,决定每个节点是偷还是不偷。因为需要左右 的值来决定中间的值,所以选择后序遍历。1.参数,返回值:应该return一个两个元素的数组,分别代表偷当前节点和不偷当前节点的值。2.终止条件:遇到空节点return(0,0),遇到叶子返回(叶子val,0)注意:其中,情况2 和情况3 都包含了情况1,所以情况1在计算中可以忽略。思路:第i个房子偷与不偷,取决于第i-2个房子和第i-1个房子。3.遍历顺序:后序遍历,因为需要左右的值。
2025-01-07 20:56:37
314
原创 代码随想录day38 动态规划6
这篇背包问题总结篇是对背包问题的高度概括,讲最关键的两部:递推公式和遍历顺序,结合力扣上的题目全都抽象出来了。而且每一个点,我都给出了对应的力扣题目。最后如果你想了解多重背包,可以看这篇动态规划:关于多重背包,你该了解这些!,力扣上还没有多重背包的题目,也不是面试考察的重点。
2025-01-07 16:13:00
1141
原创 代码随想录day37 动态规划5
2.如果j》=coins【i】,dp[i][j]=dp[i-1][j]+dp[i][j-coins[i]];先物品后容量只会有(1,5)这样的,而先容量后物品会有(1,5)(5,1)这样的排列。递推:dp[i][j]=max(dp[i-1][j],dp[i][j-weight[i]]+value[i])。且1,2,1和2,1,1不同,所以求的是排列。dp[i][j]:使用下标为【0,i-1】的物品,装容量为j的背包,的最大总价值。注意:j从1开始,i也从1开始,因为j是物品的遍历,物品最少都是1;
2025-01-07 11:06:45
350
原创 代码随想录day36 动态规划4
如果有0,则要在物品i的0列,赋初值为2的t次方,t为在这个及这个之前有几个0.使用 (int) pow(2.0, numZero);通过这道题目,先粗略了解, 01背包,完全背包,多重背包的区别,不过不用细扣,因为后面 对于 完全背包,多重背包 还有单独讲解。0-1背包,将字符串数组里面的字符串看作物品,将0的数量,1的数量看作背包容量。1.dp[i][j]:使用0..i物品,恰好能把总和为j的装满的方法。
2025-01-01 15:04:51
338
原创 代码随想录day35 动态规划3
背包空出物品i的容量后,背包容量为j - weight[i],dp[i - 1][j - weight[i]] 为背包容量为j - weight[i]且不放物品i的最大价值,那么dp[i - 1][j - weight[i]] + value[i] (物品i的价值),就是背包放物品i得到的最大价值。因为一维dp的写法,背包容量一定是要倒序遍历(原因上面已经讲了),如果遍历背包容量放在上一层,那么每个dp[j]就只会放入一个物品,即:背包里只放入了一个物品。4.遍历顺序:只可以先遍历物品,再遍历背包容量。
2025-01-01 10:08:57
1049
原创 代码随想录day34 动态规划2
注意:优化:只使用一维数组,因为需要左边的和上面的,所以可以只用一行,这个元素+=左边的元素即可,代码2即为优化后的。3.初始化:0行0列都是1,如果0行0列中有石头,则:行的话,在石头右边及石头的都为0,列的话石头及石头下面都是0.即C下面(m+n-2)上面(m-1)2.递推:dp[i][j] = dp[i - 1][j] + dp[i][j - 1]2.递推式:dp[i][j]=dp[i-1][j]+dp[i][j-1]1.含义:dp[i][j]:从(0,0)出发到(i,j),有多少条路径。
2024-12-31 19:29:48
586
原创 代码随想录day32 动态规划1
思路:动规有点没思路,先推一下试试。3阶:1+1+1,2+1,1+2;4阶:1+1+1+1,2+1+1,1+2+1,1+1+2,2+2;是前两个的和,即4阶可以拆(2阶+2)+(3阶+1)。思路:题目意思:你要爬到cost最后一个元素的再上面一个才行。2.递推:dp[i]=dp[i-1]+dp[i-2]思路:首先想到递归,但复杂度高。3.初始化:dp【0】=0,dp【1】=1。代码1:优先写这个吧,更能体现动规思想。代码2:优化,只用维护两个数值即可。746. 使用最小花费爬楼梯。509. 斐波那契数。
2024-12-28 10:16:14
422
原创 代码随想录day31 贪心5
(为什么不从上往下:从上往下,根不放摄像头,但是叶子结点是指数级的,如果叶子那一层刚好都不能覆盖到,则要增加指数级的摄像头,而根没覆盖的话只用增加一个)但是有一种情况是4213,这样的时候1赋值为9的话,3就不对了,所以考虑是不是从前往后数,第一个要赋值为9的后面全都赋值为9,没有找到反例,成立。2.因此考虑,如果后面的小于前面的,就把后面的赋值为9,前面的值--。从后向前,i<i-1的话,让i变为9,i-1--递归结束之后,对于头节点,如果为0,res++;Q:1.什么遍历:后序,要从下往上。
2024-12-27 10:55:11
293
原创 代码随想录day30 贪心4
即如果一个区间包含另一个字母的区间,这两个就不能合并,只有后面的start>前面的end才可以。else,cur跟pre可以一起,把cur的结束值设置为min(cur结束,pre结束),保证下一个如果要跟这两个一起射爆,就必须符合前两个都要射爆。如果cur的开始小于pre的结束,则重叠,更新边界,res++(有重叠就移除)思路:跟上题的思路大致一样,感觉要排序,就先按开始值大小排序,如果值一样则按结束值小的排前面。我要做的是去除重复区间,没有别的很好的办法,就想用贪心,只要有重复的,我就去除。
2024-12-26 14:56:09
346
原创 代码随想录day29 贪心3
使用vector是非常费时的,C++中vector(可以理解是一个动态数组,底层是普通数组实现的)如果插入元素大于预先普通数组大小,vector底部会有一个扩容的操作,即申请两倍于原先普通数组的大小,然后把数据拷贝到另一个更大的数组上。这样会遗漏,如1,2,3,3,3,2,1,后面的没有继承前面的变化.所以不可以。注意,这里有继承的思想,右比左大需要从前往后,因为加的是右边,比较左边和右边的时候,右边的比较的是已经计算完前面的candy值。2.先计算右边比左边大,从前往后,如果有符合的,则继承上一个的值。
2024-12-25 14:40:40
467
原创 代码随想录day28 贪心2
2.每走一步就更新一次最大的next下标,如果走到了cur的最大下标(还没有结束循环),就证明这一步走不到目标,还需要再走,所以ans++,同时更新curdistance为nextdistance。如果我的cur是在倒数第二个,那么我在倒数第二步的时候,跳了一步,那么我这一跳只要不为0一定能到达(题目保证了一定能到达);思路:转化为从该步能覆盖的最大范围是多少,for里面的条件是i<=cover,这样就可以持续往后走。如果我要走到最后,如果我的cur是最后一个的下标,那我就又+1了,这一跳时不必要的!
2024-12-24 14:30:07
333
原创 代码随想录day27 贪心1
2.两端低或高中间平:1-2-2-2-1,这时候选择跳过前面的两个2,只记录最后一个2,则条件需要为:prediff0||prediff>=0&&curdiff
2024-12-23 14:38:48
418
原创 代码随想录day25 回溯4
而且对同一父节点下,本层使用过的元素在后面不能再使用,因为同样的值可能是分开的,所以考虑用哈希表记录。3.这个数组不需要回溯,因为for里面的每一层都是横向的,只有纵向(backtracking)后才需要回溯,回溯到没有加入这个元素之前。去重问题:可以重新排序的,用used。不可以的则用哈希表,能确定范围的用数组更快。1.排列问题,不需要startIndex,只需要一个used数组记录是否使用过。映射值=值+100.1.在排列的基础上,去除同一父节点下的重复的。如果是竖着的已经使用过的,continue。
2024-12-21 23:32:20
352
原创 代码随想录day24 回溯3
如果startIndex到i是合法的,则加点,pointnum++,然后递归,然后回溯,否则break(已经不合法了就跳出这个循环)1.选择逗点数量,如果==3,则直接判断最后的是不是合法的,如果是则push。题目:93.复原ip地址 78.子集 90.子集II。跟子集差不多,只是需要在层间去重,就加一个used数组即可。注意:老是容易把used【i】==true写错,应该是=。思路:区别于之前的收集每个叶子结点,这个是收集每个结点。1.开始大于end,false,3.单层:直接push。
2024-12-21 19:35:59
175
原创 代码随想录day23 回溯2
如果这个元素等于上一个元素且这个元素的上一个元素在本轮的横向没有使用过,则continue()每次要判断的是startIndex到i的str是不是回文,如果是则加入,不是则continue。剪枝优化:在for里面提前判断加的下一个是否可行,这样不可的就直接不进行下探了,if里面的大于也可以省略了。3.需要一个判断是否为回文串的函数,用双指针,一前一后,如果不同则false,出循环的则true。2.终止条件:i==s.size()。题目:39.组合总和 40.组合总和II 131.分割回文串。
2024-12-21 16:14:18
229
原创 代码随想录day22 回溯1
3.遍历过程想象为遍历一棵树,for是横向遍历,backtracking是纵向遍历,在横向里面放纵向。逻辑:每一次对该数字对应的字符串进行循环,取每一个,然后backtracking下一个。注意:终止条件里面不需要path.clear,会出现清空后面要用的path。逻辑:从顶往下,先for,再纵向。思路:多设计一个sum,回溯的时候pop然后sum-=就可。回溯法也可以叫做回溯搜索法,它是一种搜索的方式。类型参数:需要startindex,n,k。注意:path回溯的步骤pop_back;
2024-12-18 13:53:04
188
原创 二叉树系列总结--代码随想录摘抄
涉及到二叉树的构造,无论普通二叉树还是二叉搜索树一定前序,都是先构造中节点。求普通二叉树的属性,一般是后序,一般要通过递归函数的返回值做计算。求二叉搜索树的属性,一定是中序了,要不白瞎了有序性了。所以求普通二叉树的属性还是要具体问题具体分析。
2024-12-17 14:41:47
171
原创 代码随想录day21 二叉树8
root-》left=trimBST(root-》left),right同理。//如果当前的小于low,return 当前的right的trimBST。//如果当前的大于high,return 当前的left的trimBST。思路:题目一开始没有读懂按什么顺序进行遍历,读懂后发现就是一个右左中顺序遍历的。//停止:为空返回nullptr。108.将有序数组转换为二叉搜索树。108.将有序数组转换为二叉搜索树。538.把二叉搜索树转换为累加树。538.把二叉搜索树转换为累加树。思路:递归,分割点为mid。
2024-12-17 13:40:19
234
原创 代码随想录day20 二叉树7
注意:这里每个都return,即从上往下找,找到就return;区别于二叉树的最近公共祖先:是从低向上的,所以不是每个都return;思路2:递归:从上往下搜索,最近的公共祖先一定是从上往下,夹在两个中间的情况。把左孩子放到右孩子的最左边,返回根的右孩子。//1.没有待删除结点,到了nullptr,直接return。//3.左孩子为空,右孩子不为空。//4.右孩子为空,左孩子不为空。思路1:迭代,从上往下,在两个中间的就是答案。思路1:迭代,从上往下找要插入的位置就好了。450.删除二叉搜索树中的节点。
2024-12-17 09:30:34
337
原创 代码随想录day18 二叉树6
注意:这里的单层逻辑包含了上述两种情况,因为是自底向上,所以如果他们是在一个节点的两边,则return的是这个节点。如果一个在另一个的下面,则下面的p(假设)返回上来,到目标节点(q)的时候,会直接返回这个,如果返回的是q,就一直往上往上返回。如果count=maxcount,则把当前的数字加入vector,如果大于,则把vector清空,放入当前的数字。且注意,pre=cur必须写在if的外面,因为pre的初始值是nullptr,如果写在里面就会一直不更新。思路2:利用二叉搜索树的性质,使用中序遍历。
2024-12-16 14:13:55
449
原创 代码随想录day17 二叉树5
思路:跟105,106前序中序和后序中序构造二叉树 差不多,把每一步的思路列出来即可,构造的都是前序遍历。注意:本题可以优化,去掉nums为空的判断(给出了一定大于0)。思路1:如果是二叉搜索树,那么他中序遍历的序列一定是有序的。//2.选取最大的一个作为root,如果size==1,return root;思路:二叉搜索树的特性:左边的小于root,右边大于root。//1.如果数组大小为0,return nullptr;//3.root左边为left,右边为right。700.二叉搜索树中的搜索。
2024-12-15 21:11:32
364
原创 代码随想录day16 二叉树4
4.根据分割点,进行左闭右开的分割,分割中序,为left中序和right中序,注意vector分割函数的规则,要跳过分割点,所以+1;类型,参数:不需要返回最后的int,只用对全局变量修改,所以用void。参数,类型:bool,treenode*,count(每次-,最后为0则为true)层序遍历,最简单,只需要记录每层的第一个值,然后一直覆盖到末尾,就是左下角的了。单层循环:如果左边不为空,那么左边递归,如果右边不为空,那么右边递归。如果右边不为空,则右边。思路2:递归,因为要左节点,所以用前序中左右。
2024-12-15 17:40:12
294
原创 代码随想录day15 二叉树3
注意:此题需if(cur==null)就返回,因为不一定是叶子!思路:getHeight函数,如果不平衡,返回-1,否则返回当前左右子树最大值+1;加入path的操作,在是叶子节点,左右节点不为空的时候,都要加入,所以索性写在开头。思路:从上到下,所以选择前序。404.左叶子之和 (优先掌握递归)222.完全二叉树的节点个数(优先掌握递归)左:先int值,如果是左叶子,就把值设为这个。222.完全二叉树的节点个数(优先掌握递归)参数,类型:只需要节点,返回int(累加)404.左叶子之和 (优先掌握递归)
2024-12-15 13:36:00
190
原创 代码随想录day14 二叉树2
题目:226.翻转二叉树 (优先掌握递归)101. 对称二叉树 (优先掌握递归)104.二叉树的最大深度 (优先掌握递归)111.二叉树的最小深度 (优先掌握递归)重做:全部都要226.翻转二叉树 (优先掌握递归)思路:即用前序或者后序的递归遍历法,中间加上一个swap(left,right)即可注意:最后还要return root。不可以用中序的遍历!!101. 对称二叉树 (优先掌握递归)思路:确定遍历方式:后序!只有后序是左右中,才可以把左边和右边的信息一起返回给中间节点。
2024-12-14 20:59:57
280
原创 代码随想录day11 栈和队列2
首先将k个元素添加,接着开始循环,对num【i-k】进行pop,对下一个push,然后push_back(front)思路:首先用map统计每个元素出现的个数,然后使用小顶堆排序,当pri_que的大小超过k,则弹出最小的。push:判断在队尾的比下一个数大还是小,如果小的话则出队,循环,直到为空或者有大的,然后加入这个元素。需要维护队首的是最大的,移动窗口的时候可以变化的。pop:如果这个元素是要被移出滑动窗口的数,我就要pop,否则不pop。
2024-12-13 23:32:01
205
原创 代码随想录day10 栈与队列1
思路1:首先思考什么是正确的:如果从左到右遍历,每遇到一个左括号就压一个对应右括号进栈,接着如果遇到了跟栈顶相同的,则pop,最后栈里应该为空。思路2:每遇到一个左括号就进栈,遇到一个右括号就看栈顶,如果栈顶的元素是对应的,则出栈,否则就return false;注意:判断栈顶元素前,需要判断栈顶是不是空,否则会访问空的,报错。思路:遍历字符串,如果遇到了跟栈顶一样的,则pop,否则继续。第一种情况,字符串里左方向的括号多余了 ,所以不匹配。第三种情况,字符串里右方向的括号多余了,所以不匹配。
2024-12-13 20:21:28
199
原创 代码随想录day9 字符串2
思路:不使用额外空间的话,有以下思路:类似于上题,先整个反转,然后对前面的部分和后面的部分分别反转。151.翻转字符串里的单词 卡码网:55.右旋转字符串 28. 实现 strStr()151.翻转字符串里的单词 卡码网:55.右旋转字符串 28. 实现 strStr()2.反转整个字符串;1.双指针的移除元素的思路(数组移除元素),记得对最前面和最后面有空格的进行判断。459.重复的子字符串 字符串总结 双指针回顾。注意:注意最前面和最后的空格的处理,是不一样的。
2024-12-05 19:08:19
203
原创 代码随想录day8 字符串1
思路:不使用额外的内存空间,使用双指针。定义两个指针,oldIndex和NewIndex,分别指向旧字符串和新字符串的末尾。思路:无需前置判断需要几次的反转,直接在循环里判断就好。reverse可以用库里的,也可以用自己定义的。注意:注意,cout也在最外层的cin>>s的while里面。344.反转字符串 541. 反转字符串II 卡码网:54.替换。其实最外层可以不是while(cin>>s),可以是直接cin>>s;思路:双指针,首尾,swap两个,然后同时收缩。
2024-12-04 14:53:24
226
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅