自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(43)
  • 收藏
  • 关注

原创 代码随想录算法训练营day47

初始化,首先全部初始化为0,dp[0][0]=-prices[i],dp[0][1]直接思考想不出设置为什么合适,所以直接根据递推公式算,经过几次递推后必定为0,dp[0][2]和dp[0][3]也为0;时间复杂度O(n)。递推公式,dp[i][0]=max(dp[i-1][0],dp[i-1][1]-prices[i]-fee),对于交易手续费,我们在买的时候扣除就行了,dp[i][1]=max(dp[i-1][1],dp[i-1][0]+prices[i]);时间复杂度O(n)。时间复杂度O(nk)。

2024-06-24 16:49:50 850

原创 代码随想录算法训练营day46

也有两种情况,如果第i-1天已经不持有,不管是还没买入还是已经卖掉了,dp[i][1]=dp[i-1][1],如果第i-1天已经持有,则说明第i天将股票卖掉,dp[i][1]=dp[i][0]+price[i],dp[i][1]取max;初始化,dp[i][0]=0,dp[0][1]=-prices[0],dp[0][2]=0,表示当天买入后又卖出,dp[0][3]=-prices[i],dp[0][4]=0,其他都初始化为0;第一次不持有,有两种情况,首先是前一天持有,说明第i天卖掉,

2024-06-20 11:16:53 857

原创 代码随想录算法训练营day45

递推公式,首先要考虑是不是房屋n-1,当不是的时候,和上题一样,如果不偷i,则dp[i-1],如果偷i,则dp[i-2]+nums[i],当是i==n-1房屋的时候,这时还要考虑房屋0,如果不偷n-1,则dp[i-1],如果偷n-1,则0不能偷,i-1也不能偷,但这里的dp推导则卡住了,故直接从0开始考虑是考虑不出来的。,如果偷了,则dp[i]=dp[i-1],如果没偷,dp[i]=dp[i-2]+nums[i],注意在计算过程中我们不知道i-1是否被偷了,故取max即可;递推公式,这里需要仔细考虑,

2024-06-13 18:01:37 829

原创 代码随想录算法训练营day44

递推公式,这里就要详细思考一下,因为本题的dp和之前求的方法数等不一样,先装物品i,如果能先装进去,则j-coin[i]的需要最少个数为dp[j-coin[i]],故此时dp[j]=dp[j-coin[i]]+1,由于本题求的是最少个数,故应该使用min;初始化,dp[0]表示空串能否由字典中元素组成,但本题中s非空,故没有空串的情况,根据递推公式,dp[0]必须为true,否则后面全为false,其他值初始化为false;对本题,dp五部曲:dp数组,dp[j]表示容量为j的背包能装的最大价值;

2024-06-13 16:32:35 1181

原创 代码随想录算法训练营day43

dp五部曲:dp数组,dp[j]表示容量为j的背包装满的方法数量(排列数);举例:三个物品,weight={1,3,4},value={15,20,30},背包容量4,dp数组,初始化{0,0,0,0,0},物品0,{0,15,30,45,60},物品1,{0,15,30,45,60},物品2,{0,15,30,45,60}。背包重量为amount,物品weight为面值,value也为面值,需要保证背包恰好装满,求可以装满的方法数,故dp数组需要有所变化,回想目标和那题,但是不同之处是这里是组合数,而。

2024-06-11 11:27:44 775

原创 代码随想录算法训练营day42

遍历顺序,从背包容量大到小遍历;递推公式,和之前一样,当i能装进去的时候,dp[j]=max(dp[j],dp[j-stones[i]]+stones[i]);举例,这种不好想的题目,还是得举例的,nums=[1,1,1,1,1],target=3,x=4,dp初始化为[1,0,0,0,0],当i=0时,dp由递推公式计算的[1,1,0,0,0],i=1时,[1,2,1,0,0],i=2时,[1,3,3,1,0],i=3时,[1,4,6,4,1],i=4时,[1,5,10,10,5],最终答案为5,符合。

2024-06-07 17:30:09 1194

原创 代码随想录算法训练营day41

初始化,只初始化一行,dp[0]肯定为0,其他下标位置,也初始化为0,因为后面递推过程中会逐渐取最大值;然后第二步递推公式,要递推考虑第i个物品,有两种情况,首先是不放i物品,这时候dp[i][j]=dp[i-1][j],与前i-1个物品的结果相同,然后是放i物品,这时候背包还剩下的重量为j-weight[i],然后在这些重量中放置前i-1个物品,dp[i][j]=dp[i-1][j-weight[i]]+value[i],最终递推即在这两个里取最大值,如果物品i本来就放不进去,那么就只有第一种情况;

2024-06-05 21:21:44 1016

原创 代码随想录算法训练营day40

1为头,左子树节点个数为0,右子数节点个数为2,即dp[0]*dp[2],2为头,dp[1]*dp[1],3为头dp[2]*dp[0]。故对dp[i],我们也考虑1到i为头节点的数量相加,dp[i]=dp[0]*dp[i-1]+dp[1]*dp[i-2]+…时间复杂度O(n^2)。(i-2)取最大值,综合讨论一下就是拆成i-j和j,然后比较dp[i-j]*j和(i-j)*j的最大值,这里因为dp[i-j]必须要进行至少拆成两个数,所以没有包含i-j,故我们还需要比较i-j,递推公式就是。

2024-04-23 17:09:00 429 1

原创 代码随想录算法训练营day39

首先dp数组,dp[i][j]表示从[0,0]出发,到达[i,j]路径的数量,我们要求dp[m,n];递归公式,即从dp[i-1][j]往下移动一步,或者dp[i][j-1]往右移动一步,这两者相加,如果i本来就为0,那么dp[i-1][j]就不存在,因为本来就在第一行只可能右移无法下移;初始化,dp[0][0]=1,还可以把第一行和第一列的全部初始化为1;思路:本题多了障碍,还是同样五部曲。在求递归公式的时候,如果没有障碍,递归公式正常进行,一旦遇到障碍点,说明这个地方无法到达,故将其置为0;

2024-04-23 16:20:33 317

原创 代码随想录算法训练营day38

注意求递归算法的时间复杂度,就是看递归调用了多少次,对于斐波那契数,第一层调用1次,第二层2次,第三层4次,加起来就是等比数列求和公式,为O(2^n)。首先思考爬1层楼梯,有1种方法,爬2层楼梯,有2种方法,而爬3层,就是爬第一层,再跨两步,或者爬2层,再跨一步。递归公式,dp[i]=dp[i-1]+dp[i-2],即先爬i-1层加1步或者先爬i-2层加2步;然后是递推公式,可以从dp[i-1]走一步花费cost[i-1],或者从dp[i-2]走两步花费cost[i-2],二者取min;

2024-04-23 15:35:23 455

原创 代码随想录算法训练营day37

判断贪心的方法:如果找出局部最优并可以推出全局最优,就是贪心,如果局部最优都没找出来,就不是贪心,可能是单纯的模拟。做题过程:不用数学证明,只需要手动模拟,举不出反例,就是贪心,面试时能够跑出代码就OK。

2024-04-22 18:02:23 205

原创 代码随想录算法训练营day36

遍历过程即为寻找每一个字母的边界,如果找到之前遍历过的所有字母的最远边界,则找到分割点。首先记录每个字符最后出现位置的下标,然后从头遍历字符,并更新字符的最远出现下标,**如果找到字符最远出现位置下标和当前下标相等了,则找到了分割点。如果目前遍历的左边界小于等于上一个区间的右边界,则算重叠,这时候更新右边界为两个右边界的最大值。从左到右记录非交叉区间的个数,使用end记录每次的区间分割点,当遍历的区间的左边界大于等于end时,此时说明不相交了,result++,同时将end更新为当前区间的右边界。

2024-04-22 17:29:03 341

原创 代码随想录算法训练营day34

*本题的队列不是单独按照身高排的,而是预先按照一个固定顺序排好的队列,然后根据h求出对应的k,再将其打乱即为本题的输入。**本题的排序,需要同时考虑k和h,有两个维度,如果先考虑k,排好后没有一个维护确定下来,故先考虑h,根据身高先从大到小排(因为k是求的前面比自己大于等于的身高数量),如果h相同则将k小的放在前面。bill为5的时候直接收下即可,10的时候,,找零一个5,这两种情况都是固定的。只有遇到20的时候,我们优先使用10来找零,因为5更加万能,只有没有10的时候我们才会找零三张5。

2024-04-22 16:07:24 642

原创 代码随想录算法训练营day33

看解析还有贪心方法二:即rest和累加走一圈,小于0则不行,在累加到i的过程中,一旦遇到小于0,则说明前面的都不能作为开始,只能从i+1开始,即始终确保局部最优。,先考虑右边分数大于左边的情况,首先所有孩子分一个,然后只要右边比左边分高,那么就给右边加一个,这时从左往右遍历;我们从n-1~1再反过来考虑,首先对n-1,min加上rest[n-1],如果此时非负,则说明如果从n-1出发,走一圈的min不会有负数,故4能够完成,如果不行则继续往前考虑3,累加min,一直考虑到1结束(0最开始已经考虑过)。

2024-04-08 16:03:39 641

原创 代码随想录算法训练营day32

考虑两步的覆盖范围,即这一步的最大覆盖范围和下一步的最大覆盖范围,如果这一步怎么都走不到终点,那么就需要开始考虑下一步的覆盖范围了,具体怎么跳我们不用考虑,但我们知道两步一定可以达到这么的最大覆盖范围,如果还没到终点就继续往后,直到覆盖终点为止。思路:本题由于跳跃步数可以自由选,故只要在我们的跳跃范围内,全部都可以跳到,只要一次遍历整个数组,当跳跃范围覆盖到末尾即返回true,如果还没遍历到数组末尾就已经超出了覆盖范围,说明不可能到达末尾,返回false。本题想起来也不难,主要是想到坡度就容易了。

2024-03-08 16:46:58 439

原创 代码随想录算法训练营day31

对本题,首先想对孩子胃口和饼干都从小到大排序,对小胃口,先用小饼干满足,如果小饼干不能满足就换大的饼干,即先用尽可能小的饼干满足尽可能小的孩子,这样能在最节约饼干的基础上满足更多的孩子。第二种情况是数组首尾两端的统计,因为我们统计峰值靠的是两边差值,至少需要三个数才能够计算,这里可以假设左边有一个一样的数,一开始默认result为1;即前面的连续和为负数的时候,直接舍弃,从下一个元素开始计算,因为负数只会拉低连续和。如图,我们只需要删除坡度上的节点,保持峰值尽可能多,这就是局部最优推出全局最优。

2024-03-08 15:45:52 937

原创 代码随想录算法训练营day29

写完后运行发现没有去重处理,但本题的去重和上题集合2不同,不能排序,不是相邻也可能重复,比如[4,4,5,4],会产生3个[4,4],去重方法我一开始没想到。我们继续采用used数组,当for遍历的元素已经用过,则直接continue,否则加入路径。时间复杂度O(n*2^n)。思路:一开始想的就是在上题基础上加一个每层去重,由于排列每次for都要遍历所有元素,不是相邻情况,故每层使用了一个set去重。,注意这个时间复杂度就是所有排列方式的数量A(n,n)乘以生成每一个答案需要的n次push_back。

2024-03-07 17:18:25 393

原创 代码随想录算法训练营day27

这里有一个问题,比如25525511135,如果切割了2,5,5,这时判断最后一个不管怎么切割,都要进入下一层递归,实际上这时候已经不可能完成结果,可以进行剪枝处理。可以根据begin和path大小来剪枝,当path长度为1时,如果剩余长度size-begin>9则剪枝,当path长度为2时,剩余长度size-begin>6则剪枝,当path长度为3时,剩余长度size-begin>3则剪枝。对返回条件,如果路径长度已经为4,则可以判断是否切割完毕,如果已经切割到最后,则可以把path加入结果;

2024-02-29 18:10:43 409

原创 代码随想录算法训练营day26

比如示例中排序后为[1,1,2,5,6,7,10],当遇到连续几个相同的数时,我想到的方法是此时begin无论从哪里开始,第一次都要把这几个数都选进去,比如第一次for循环,begin=1,这里第二个1也要选入path,然后从第三个数(第一个不是1的数)开始递归;当第二次for循环,begin=2的时候,即可正常运行,这样就可以完成去重。时,即说明出现了重复的元素,此时要判断i-1位置的used值,如果为1,则说明已经被选取,是树枝上的元素,可以重复,如果为0,说明为数层上的元素,不能重复选取。

2024-02-28 17:20:22 995

原创 代码随想录算法训练营day25

思路:首先分析过程,在1-9中选择k个数,首先确定选择的第1个数,比如1,然后在2-9中选择剩下的k-1个数,确保选择的k个数递增,这样就不会重复。为方便,我们在递归过程中不断减少总和n的值。for循环用于确认选择的第1个数,如果选择的第一个数比剩下所需的总和n还要大,则不可能选出结果,直接返回;递归用于选择剩下的数,我们将第二个参数减去已经选择的第一个数,即n-i,注意选择完后回溯。看标答还发现我们的代码外层for循环可以去掉,因为本题对digits中的所有数字都要取到对应的字母,和之前的组合问题不同。

2024-02-28 11:16:01 404

原创 代码随想录算法训练营day24

取数的过程可以首先取第一个数,然后在剩下三个数里取出第二个数,得到结果;然后回溯,取第二个数,然后继续类推。故递归参数还需要一个取的第一个数的下标,递归在取的数的数量为k的时候终止。思路:本题一开始想到的肯定是用多层for循环嵌套,但是需要k层,而k是变量,故使用这种暴力方法写不出来,必须使用递归。一开始很容易犯的一个错误是将回溯过程中的递归第二个参数写成k-1,因为看上去是第二次只取k-1个数,回溯三部曲:回溯函数模板返回值以及参数、回溯函数终止条件、回溯搜索的遍历过程。为一条路径还需要取的数的个数。

2024-02-27 23:07:18 547

原创 代码随想录算法训练营day23

思路:本题要改的节点比较多,个人感觉使用迭代法会非常麻烦,故直接考虑递归法。首先是返回条件,当节点为空的时候返回。然后是节点不为空的时候需要分类讨论,首先是root值大于high时,可以直接只保留左子树,然后是root值小于low时,可以直接只保留右子树,最后是root值位于。思路:首先看这道题的计算顺序,是右->中->左,和中序遍历相反。思路:本题要求构造平衡的BST,故我们使用中点分割即可,最后对分割后的两边分别递归,比较容易想到。看完标答发现可以不用指针,直接记录值即可,迭代法pass。

2024-02-27 22:30:30 475

原创 代码随想录算法训练营day22

*最后是要删除的节点cur的左右孩子均存在,这里我们仅考虑上提右孩子替代删除节点,然后考虑cur右孩子的左子树,如果存在,则需要将其挂到cur左孩子的最右边。对BST而言,如果某中间节点是p和q的公共祖先,则该节点的值必定位于[p,q]之间,如果中间节点cur的值大于p和q,则p和q的公共祖先必定都在中间节点的左子树上。可以看到本题的迭代法比较复杂,主要情况比较多,不好处理,看完标答将单独删除一个节点抽象成一个函数,减少了代码量,没有使用flag,而是直接判断值来确定是左右孩子。

2024-02-27 18:09:58 474

原创 代码随想录算法训练营day20

即中序遍历有序,可以直接再遍历过程中操作,和上一题一样,不需要使用额外空间,使用pre指针,在对每个节点遍历的时候记录其出现次数,遍历一遍即可记录最大次数,然后第二次遍历,对最大次数的节点进行输出即为结果。,对根节点root,如果左右孩子都为空,则返回空,如果两个节点仅有一个找到了 ,则直接把这一个往上传递,如果两个都不为空,那么这个节点就是最近公共祖先,直接往上返回,最后的返回结果会传递到根节点。首先是简单情况,一个节点的两个孩子分别为p和q,这时候直接返回p或者q,如果为空,则返回空。

2024-02-17 18:28:14 367 1

原创 代码随想录算法训练营day19

思路:二叉搜索树进行中序遍历,得到的序列递增,这就是我们的判断方法。判断序列递增的时候从头开始遍历,如果有一个不递增则break。思路:首先了解BST,即所有左子树节点小于根节点的值,所有右子树的节点大于根节点的值,且其所有子树都是二叉搜索树。思路:做过根据中序后序数组构建二叉树后,这题比较容易,只需要找到最大值分割,然后递归构造即可。应该在一开始就优先判断返回情况,即两边有空的情况。迭代法:由于BST的搜索路径已经固定好,不需要再使用栈和队列。思路:本题首先想到是正常遍历,采用前序遍历,同时遍历两棵树。

2024-02-16 18:28:49 425 1

原创 代码随想录算法训练营day18

看完标答,可以不需要累加后再判断,直接在递归过程中减少targetSum值,这样比较简单。

2024-02-16 00:24:25 412 1

原创 代码随想录算法训练营day17

思路:本题要从头结点开始遍历,肯定是前序遍历,只是当遇到空节点的时候,需要往前回溯,然后再往后遍历,这就是第一次真正使用回溯法。首先是返回条件,当递归达到叶子节点就需要返回,不能到达空节点,故到达叶子节点就可以增加新答案。然后是递归过程,处理完非叶子节点,然后分别处理左右非空节点,处理完一个节点将path的最后一项删除,即当前处理的节点,这就是回溯的过程。思路:首先要搞清楚高度和深度的区别,深度是从上往下数,应该使用前序遍历的思路,而高度是从下往上数,只能后序遍历,力扣上的深度都是从1开始的。

2024-02-15 22:33:43 402 1

原创 代码随想录算法训练营day16

首先,要利用完全二叉树的特性,分为两种,一种是满二叉树,对于完全二叉树的满二叉树可以根据一直往左遍历和一直往右遍历深度是否相等来判断;思路:上次是用层序遍历的思路做过。这次想一点不一样的思路,对于一个二叉树的最大深度其实即为其两个子树的最大深度+1,所以可以采用递归法解决,结束条件即当root都为空的时候,最大深度即为1。思路:本题一开始最简单的思路就是直接遍历,使用什么方法都可以,然后计数,这对所有普通二叉树都适用。普通方法,一是层次遍历计数,二是类似求深度的写法进行递归,实际上都是遍历方法。

2024-02-14 23:33:52 888 1

原创 代码随想录算法训练营day15

看了解析需要将对比两边子树单独写成一个函数,比较子树对称的时候,需要比较其外侧子树是否对称,还有其内侧子树是否对称。对于结束条件,要想清楚空指针的情况,如果要比较的两个节点两个为空则对称,一个为空一个不为空则不对称,两个都不为空则正常比较。但我在代码实现的时候虽然能够完成遍历,但没想到如何将每一层的所有元素放到一个vector中,看标答后才发现需要记录队列长度即可,即为每一层的长度。思路:递归思想,先考虑根节点,递归返回条件即为根节点为空,或者其左右孩子都为空,然后正常递归即可。时间复杂度O(n)。

2024-02-08 01:31:25 324

原创 代码随想录算法训练营day14

顺序是根->左->右,碰到root节点,首先就将其入栈,然后出栈代表遍历这个节点,对两个子节点,需要先将右节点进栈,然后再将左节点进栈。对所有子树,进栈顺序为中,左,右,注意当中节点出栈后,才能处理右节点。主要问题是在左节点不为空的时候,遍历完左节点后,下次访问栈顶的根节点,还是会又根据左节点不为空继续访问左节点。后序为左->右->中,解决方法类似,注意我们通过栈的处理,一定是先处理的根节点,将后序反过来,就是中->右->左,只需要将前序的左右顺序一调换,然后最后将结果做一个翻转就OK。

2024-02-07 15:12:36 837 1

原创 代码随想录算法训练营day13

思路:我一开始想的是使用一个unordered_map来记录每个元素的频次,然后使用大顶堆,将前k个频次记录下来,但是在寻找具体元素的时候遇到了麻烦,对每个元素都需要在map中遍历一次,时间复杂度较高。看了解析,发现需要使用小顶堆,因为大顶堆的实际上是需要将所有元素做一个排序,而小顶堆只要每次弹出最小元素,最后留下的k个元素就是最大的。由于需要计算最大值,故将窗口中的元素放在一个大顶堆中,当窗口滑动时,逐渐计算最大值,但这样的问题是无法在窗口移动的同时将出窗口的元素剔除出去。cpp中的优先队列,需要。

2024-02-07 01:23:28 336 1

原创 代码随想录算法训练营day11

思路:本题是栈的典型应用,即将左括号一律入栈,然后碰到右括号的时候与栈顶元素比较,如果不一致,则返回false,如果匹配完毕后栈为空,返回true。思路:本题也是栈的应用,主要想清楚碰到不同元素的处理。首先是数字,直接进栈,然后碰到运算符,将两个元素出栈,并计算结果入栈。思路:本题还是用栈,首先从左到右入栈,如果碰到栈顶元素和目前元素相同,则将其出栈,当遍历完成后,再将栈中剩下元素依次出栈形成字符串,最后翻转一下即可。,这个我没有考虑到。然后是左括号时,直接右括号入栈,直接对比是否相等,容易多了。

2024-02-06 01:54:28 361 1

原创 代码随想录算法训练营day10

虽然成功运行,但和标答还有很大差距,首先是在pop()中,我每次while都判断q1.size(),导致时间复杂度变为O(n^2),实际上应该将size先记录,采用size–的方式,此时时间复杂度为O(n)。此时q1就是完全存放了栈中的元素,而q2仅仅是做了一个临时备份的作用,将1和2放入q2中,当pop()完成后,再将q2中元素放回q1即可。对比标答,我的peek()写复杂了,因为peek()需要返回队头元素即pop()出去的结果,可以直接调用pop(),然后再将其塞回去s2。,这是个很重要的习惯。

2024-02-06 00:37:21 352 1

原创 代码随想录算法训练营day09

思路:KMP算法,这个比较复杂,主要是需要理解一个前缀表,即储存模式串needle的最长相等前后缀,注意前缀不包含末尾,后缀不包含开头。我们的第一步就是根据needle,计算出前缀表,这里可以先不用理解为什么,先记住前缀表的求法。然后对于匹配过程,j依旧从0开始遍历模式串,i用于遍历文本串,和求next数组相比,最大的区别就是是文本串的i和模式串的j比较,如果不匹配,依旧根据next[j-1]进行回退,最重要的地方是当j已经遍历到needle末尾的时候,说明完美匹配,直接返回结果。时间复杂度O(m+n)。

2024-02-01 15:09:20 819 1

原创 代码随想录算法训练营day08

时间复杂度O(n)。而我们需要尽量在不用新串的情况下完成,首先肯定要扩充原字符串,改为需要的长度,第一次遍历我们找出数字的个数,然后计算出新串的长度,然后从右往左,使用双指针法逐渐写入字符。时间复杂度O(n)。版本二外面的for循环实际上是以单词为单位遍历,里面的while循环是对每个单词进行赋值处理,如果跳出while,说明单词结束,此时for还会进行一次i++,如果中间没有多余空格,则添加一个空格后继续下一个单词,如果中间还有多余空格,那么不会进入if中,会继续往后遍历直到下一个没有空格的位置。

2024-01-31 21:48:28 325

原创 代码随想录算法训练营day07

对于哈希表,主要有数组、set、map三类,其中数组使用于取值范围固定的情况,set则适用于取值范围不固定,而map则需要记录其他信息,当除了记录key外,还需要记录value的时候,数组和set就不够用了,需要map,但能用前两个尽量别用map,空间占用大。在需要去重,十分麻烦的时候,使用双指针法有时会比哈希法更有效。

2024-01-31 19:11:40 758

原创 代码随想录算法训练营day06

思路:首先是暴力算法,思路是对s,遍历每个字符,对每个字符的出现次数还需要记录,然后再遍历t,一个一个比,时间复杂度O(n^2)。使用哈希表可以记录s中每个字母出现的次数,本题可以使用数组作为哈希表,长度26,即记录a-z每个字符出现的次数,在遍历s的时候完成第一遍记录,然后遍历t,如果出现则讲记录减少,最后检验记录数组(哈希表)是否全为0,时间复杂度O(n)。时间复杂度O(n)。思路:本题数组的元素是不确定的,不像上题最多只有26个,因此使用数组做哈希表并不合适,这题涉及到去重,最适合的数据结构是。

2024-01-30 15:21:33 387 1

原创 代码随想录算法训练营day04

相遇时,p走了x+y,q走了x+y+n(y+z),其中n为q转过的圈数,由于快指针走过的路程是慢指针两倍,有2(x+y)=x+y+n(y+z),需要求x,得到x=(n-1)(y+z)+z,其中n>=1,由图可以看出,再选两个指针r和s分别指向head和相遇节点,同时往后走,最后相遇的节点就是入口节点。思路:我看到的第一思路是首先计算两条链表的长度,然后得到长度差,然后让那条长的指针先走几步,等两个指针平齐的时候,再同时走,直到找到相同节点。和标答比,我的代码将获得长度写成了一个函数,更加简洁。

2024-01-28 16:46:22 351

原创 代码随想录算法训练营day03

对比标答,我额外处理了head为空和只有一个元素的情况,实际上不需要处理,只需要将遍历的前后指针从null和第一个元素开始即可,我采用的是从第一个元素和第二个元素开始,由于第二个元素可能为空,所以我们多加了一个判断,这是多余的。思路:用两个指针p,q遍历相邻两个元素,每次循环,首先用一个中间量保存前节点p,然后将p和q都右移,再将p->next指向前面。思路:设置虚拟头结点方便操作,比较好理解,对于遍历,如果找到需要删除元素,直接把p指向要删除元素的下一个,否则p和q同时后移。

2024-01-26 16:41:25 342 1

原创 代码随想录算法训练营day02

滑动窗口算法:采用两个指针i和j,分别指向窗口头尾,for循环中使用j来遍历nums,对i的确定,可以这么看,由于nums都为正整数,如果目前窗口的和小于target,说明窗口需要扩大,则移动j,如果和大于等于target,说明窗口需要缩小,则移动i。看了解析后发现自己思路其实整体并没多大问题,主要是具体代码实现上,首先变量命名可以使用一点带有意义的单词比如loop,然后本题主要我没写出来的地方是对于每一个loop的遍历,需要分为四个for循环来写,我妄图一个for搞定四次,最后把自己搞混了也没写出来。

2024-01-25 16:32:01 371

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除