自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 代码随想录算法训练营第38天|leetcode322.零钱兑换、leetcode279.完全平方数、leetcode139.单词拆分

这道题和上面的题类似,几乎一样。但是由于上题的初始化有点晕,所以如果是求最小数量,就初始化成INT_MAX,然后遍历。依然是完全背包的经典应用,本题并不强调集合是组合还是排列。

2025-04-05 21:17:32 204

原创 代码随想录算法训练营第37天|完全背包理论基础、leetcode518.零钱兑换2️⃣、leetcode377.组合总和5️⃣、爬楼梯进阶

如果把遍历nums(物品)放在外循环,遍历target的作为内循环的话,举一个例子:计算dp[4]的时候,结果集只有 {1,3} 这样的集合,不会有{3,1}这样的集合,因为nums遍历放在外层,3只能出现在1后面!那么就是先把1加入计算,然后再把5加入计算,得到的方法数量只有{1, 5}这种情况。而不会出现{5, 1}的情况。第i件物品的重量是weight[i],得到的价值是value[i]。假设:coins[0] = 1,coins[1] = 5。这道题没什么难的,但是遍历方式的变化有点儿别扭。

2025-04-03 20:55:34 332

原创 代码随想录算法训练营第36天|leetcode1049.最后一块石头的重量、leetcode494.目标和、leetcode474.一和零

只不过物品的重量有了两个维度而已。物品就是strs里的字符串,背包容量就是题目描述中的m和n。应该担心计算的过程中向下取整有没有影响。例如sum是5,target是2 的话其实就是无解的。这里的x,就是bagSize,也就是我们后面要求的背包容量。类似,但是那道题求的是背包是否装满,这道题求的是背包最多可以装多少。没做出来,好像用回溯法或者动态规划都可以做出来。这道题给我的感觉和昨天的。

2025-04-02 22:31:13 127

原创 代码随想录算法训练营第35天|背包问题、leetcode.416分割等和子集

所谓滚动数组,就是把上一行的数据压缩到一起。方法一:回溯法,但是会。

2025-04-01 20:15:12 184

原创 代码随想录算法训练营第34天|leetcode62.不同路径、leetcode63.不同路径2️⃣、leetcode343.整数拆分、leetcode96。不同的二叉搜索树

根据上述代码可以发现,dp[i-1][j]只依赖于上一行状态的代码。所以可以优化成一位数组。首先初始化代码,因为第一行都是1;思路2:下面的代码和上面的,就是递归方程变了一下,不过下面的相当于把上面的dp[i]*dp[i-j]拆开了。需要举例,画图,分析,才能找到递推的关系...复杂。思路1:动态规划--》二维数组。

2025-03-31 21:49:15 220

原创 代码随想录算法训练营第32天|leetcode

思路:首先定义dp数组含义,然后初始化,然后构造递推方程。思路2:优化,仅开辟两个数组空间就够了。

2025-03-29 16:14:42 169

原创 代码随想录算法训练营第31天|leetcode56.合并区间、leetocode738.单调递增的数字

思路:合并区间或者区间重叠类问题貌似是一样的呢。也就是设置左右指针,然后遍历下去,如果。,那么就取他俩的最大值作为新边界,循环往复,最后压入数组当中。但是对于最后一组数,strNum[i - 1]--,然后strNum[i]给为9。,所以最后还需要单独压一遍~

2025-03-28 21:35:30 231

原创 代码随想录算法训练营第30天|leetcode452.用最少数量的箭引爆气球、leetcode435.无重叠区间、leetcode763.划分字母区间

其实重叠算法就是说:已有的右边界与新的边界的左边界相比,如果没有重叠,就更新right,否则(发生重叠),right = min(right,intervals[i][1]),取最小其实还是贪心。这道贪心我是有思路的,也就是说首先统计每个元素的最远到达的地方。贪心题目有时候就是这样,看起来很简单,思路很直接,但是一写代码就感觉贼复杂无从下手。首先遍历整个字符串s,设置左右指针,右指针是为了找到之后与索引做差,从而或者分割点之间的距离的。思路:这道题运用双指针,如果left>right,就计数。

2025-03-27 16:25:07 312

原创 代码随想录第29天|leetcode134.加油站、leetcode135.分发糖果、leetcode860.柠檬水找零、leetcode406.根据身高重建队列

从头开始遍历,设置cursum,然后开始累加,如果cursum<0,证明所有从前面来的出发的车开到这里都会没油,所以这个时候cursum = 0,同时从这个的后一个加油站作为起始点(start)接着遍历。外面的for模拟开始的加油站,如果有余,那就以那个为起点,遍历一圈,如果转一圈依旧有余,那么返回i,否则返回-1.然后再插入到数组当中。思路:这道题目一定是要确定一边之后,再确定另一边,例如比较每一个孩子的左边,然后再比较右边,这样从局部最优推出了全局最优,即:相邻的孩子中,评分高的孩子获得更多的糖果。

2025-03-26 21:08:53 350

原创 代码随想录算法训练营第28天|leetcode122.买卖股票的最佳时机2️⃣、leetcode55.跳跃游戏、leetcode45.跳跃游戏2️⃣、leetcode1005.K次取反后最大化的数组和

优化:由于题干已经说肯定能到达最后那个位置,所以如果可以到nums.size()-2下标对应的位置的话,如果i==cur,那么意味着还差一步就可以到达终点,ans++;=cur,那么意味着本来就可以到达终点。只要遇到了大于0的数,判断k的奇偶性,如果k为奇数,就把那个正数取相反数。如果移动下标达到了当前这一步的最大覆盖最远距离了,还没有到终点的话,那么就必须再走一步来增加覆盖范围,直到覆盖范围覆盖了终点。排完序之后=> [-8,-5,-5,-3,-2,3] => [8,5,5,3,2,-3]

2025-03-25 21:57:52 304

原创 代码随想录算法训练营第27天|leetcode455.分发饼干、leetcode376.摆动序列、leetcode53.最大子序和

不赘述,思路很简单了。但是我下面写复杂了....这么简单的题写的这么复杂...没有保持循环不变量。饼干和胃口同时变了,得固定一个。比如说 1 -2 3. 3比-1大的话,sum直接就🟰3.然后每次这个局部最优的sum与全局的res去比较。所以下面固定了胃口,用饼干去循环,如果s[i]>=g[idx],再移动到下一个孩子的胃口。从局部最优转向全局最优。

2025-03-24 21:53:06 330

原创 代码随想录算法训练营第25天|leetcode

1.思路:如下优化方法:使用数组替换哈希表。2.3.。nums[i] == nums[i-1] 且 used[i-1]==1:说明同一树枝上有重复元素,可以重复选取nums[i] == nums[i-1] 且 used[i-1]==0:说明同一树层上有重复元素,不可以重复选取。

2025-03-22 11:53:41 364

原创 代码随想录算法训练营第24天|leetcode93.复原IP地址、leetcode78.子集、leetcode90.子集2️⃣

erase(pos,len)和substr(pos,len)思路:这道题不是很难,但是细节问题出了好多错误。思路1:就是和第二题的思路多一个。isIP函数中的非法IP的控制。把所有节点都记录下来。

2025-03-21 15:59:08 188

原创 代码随想录算法训练营第23天|leetcode39.组合总和、leetcode40.组合2️⃣、leetcode131.分割回文串

我放在了没层for循环的的结尾,如果该层的candidates[i]与下层对应的candidates[i+1]相等,那就i++;因为如下图所示,排序后的数组连续的两个1连一起会造成数组的重复。但是有个点:最开始我看没有重复元素,所以我没有设置start那一项,发现就没法去重了。和3,2,2是一个,所以我发现得到的结果要单调递增,这样才能去重。思路:但是我去重打逻辑和代码随想录里的不太一样,我加了下面这行代码。⚠️:这个for循环后半部分的剪枝,要求初始数组是递增的。但是上述代码是可以优化的,如下所示。

2025-03-20 20:10:33 385

原创 代码随想录算法训练营第22天|leetcode77.组合、leetcode216.组合2️⃣、leetcode17.电话号码的字母组合

图中每一个节点(图中为矩形),就代表本层的一个for循环,那么每一层的for循环从第二个数开始遍历的话,都没有意义,都是无效遍历。思路:首先确定函数的返回值和参数(一般是void,遇到回溯的时候考虑其他类型返回值)中从startIndex开始遍历的。因为本题每一个数字代表的是不同集合,也就是。思路:与上题类似,都是组合类问题。主要点就是递归与回溯。思路:注意这里for循环,可不像是在。除此之外还要考虑到特殊情况,比如。不足我们需要的元素个数。求不同集合之间的组合。求同一个集合中的组合。

2025-03-19 19:43:14 260

原创 代码随想录算法训练营第21天|leetcode669.修剪二叉搜索树、leetcode108.将有序数组转换为二叉搜索树、leetcode538.把二叉搜索树转换为累加树

思路2:迭代法,也就是首先找到第一个节点,因为二叉搜索树的根节点属于有序数组中的中间位置。然后找到第一个节点之后,就开始向左迭代和右迭代。左右迭代的时候,首先判断是不是空指针,如果不是的话判断其cur->left(right)与val的关系,然后向left的方向迭代。思路:其实没有那么复杂,我第一次做的时候,我就考虑到删除节点,然后重构二叉树。但是很复杂,甚至联想到了昨天的那道删除二叉树的那个题目。比如3的左孩子是2,右孩子是5.但是5如果没有迭代到,也别怕遍历不到,因为已经有指针指向了5的头节点的了。

2025-03-18 22:30:11 156

原创 代码随想录算法训练营第20天|leetcode235.二叉搜索树的最近公共祖先、leetcode701.二叉搜索树中的插入操作、leetcode450.删除二叉搜索树中的节点

设置快慢指针,快指针先走,并不断比较判断cur的值和val的值。如果cur大那就左移,反之右移。查找目标区间,遇到目标区间内的节点,直接返回。思路:这道题好繁琐啊,判断条件太多了。不用使用回溯,二叉搜索树。

2025-03-17 19:53:39 206

原创 代码随想录算法训练营第18天|leetcode530.二叉搜索树的最小绝对差、leetocode501.二叉搜索树中的众数、leetcode236.二叉树的最近公共祖先

思路1:既然是二叉搜索树,所以中序遍历的结果是单调递增的。所以索性转换成有序vector数组,然后再数组中寻找最小差值;首先考虑递归函数返回值和参数,其次考虑终止条件。如果遍历到null或者遍历到目标节点了,就。思路:这道题没有做出来...首先想的是从下向上遍历,所以考虑到。思路2:不用哈希表,这个时候就用。|(遇到if终止条件)FUNC2(深层递归)

2025-03-15 19:15:44 353

原创 代码随想录第17天|leetcode654.最大二叉树、leetcode617.合并二叉树、leetcode700.二叉搜索树中的搜索、leetcode98.验证二叉搜索树

思路1:层次遍历法。最开始想开一个vector,然后把结果存入的。返回node就可以返回他下面所有的孩子节点了。思路:这道题第一次写的时候,没有观察到。node其实相当于头节点。时间和空间复杂度较高。思路:这道题超级简单。

2025-03-15 14:46:18 252

原创 代码随想录第16天|leetcode513.找树左下角的值、leetcodee112.路径总和、leetocde106.从中序与后序遍历序列构造二叉树

思路2:递归法,首先设定一个阈值max_depth。注意首先遍历root->left,所以首先到达左下。:使用了全局变量,coding的时候就在想如何判断true之后,后面就算遍历到false的话,也要是true。思路2:也就是让代码更加简洁,原代码要判断res与targetsum的大小,所以我们可以减少一个变量的引入,即。思路与上面的题类似,不再赘述~上面的不会,下面的就ac了哈哈哈😂。(如何打日志有时候也是个技术活),不要脑动模拟,回溯&&递归不分家,有回溯就有递归。要遍历整个树,找到所有路径,

2025-03-14 15:46:37 428

原创 代码随想录第15天|leetcode222.完全二叉树的节点个数、leetcode110.平衡二叉树、leetcode257.二叉树的所有路径、leetcode404.左叶子之和

我第一次做的时候保存中间遍历的节点的时候,我没有建立字符串类型的栈,我定义的是个字符串,然后想着回溯的过程中对字符串进行加减操作,但是后来我慢慢的发现这个东西第一次循环之后好像无法传递结果....所以这里我看完答案之后,然后递归isBalanced函数求深度,最开始isBalanced没有递归,只是单纯的求了左右子树的高度,⚠️:传值的时候记得传引用,因为不传引用的话,相当于传副本。,即本层递归中,path + 该节点数值,但该层递归结束,上一层path的数值并不会受到任何影响,所以类似于栈。

2025-03-13 13:02:03 404

原创 代码随想录第14天|leetcode226.翻转二叉树、leetcode101.对称二叉树、leetcode.104.二叉树的最大深度、leetcode111.二叉树的最小深度

每个节点遍历之后,交换其左右孩子节点,随后将其左右孩子节点入栈。(这个不用遍历每一层,是因为这个不像是层次遍历,这个任何一个节点的左右孩子都要交换)思路1:我的思路类似于层次遍历,然后空节点依旧入队列。然后遍历的时候检查节点是否为空节点,vec就push(101),反之就push本来的数值。首先left->left,right->right(外侧),再left->right,right->left(内侧)思路3:迭代法,思路与上面类似,但是与层次遍历不太相同。2.思路2:递归法,下面用的是后序遍历(

2025-03-12 18:42:55 339

原创 代码随想录算法训练营第13天|leetcode144.二叉树的前序遍历、leetcode94.二叉树的中序遍历、leetcode145.二叉树的后序遍历、二叉树的层次遍历

思路1:递归遍历思路2:迭代遍历但是右节点先入栈,左节点后入栈。因为左边这样就可以先弹出来。思路1:递归遍历思路2:迭代遍历这里结合栈去理解,思路1:递归遍历思路2:迭代遍历前序遍历顺序:中左右。后序遍历的顺序:左右中。所以借鉴前序遍历的代码,遍历顺序:中右左。然后再把结果数组,就得到了。

2025-03-10 21:33:59 397

原创 KMP之leetcode28.找出字符串中第一个匹配项都下标、leetcode.459重复的子字符串&&字符串总结&&双指针总结 2025.3.9

库函数如果库函数仅仅是 解题过程中的一小部分,并且你已经很清楚这个库函数的内部实现原理的话,可以考虑使用库函数。双指针344. 反转字符串 - 力扣(LeetCode)27. 移除元素 - 力扣(LeetCode)双指针法在数组,链表和字符串中很常用。其实很多数组填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。反转系列 诶。。。蛮考验技巧的541. 反转字符串 II - 力扣(LeetCode)151. 反转字符串中的单词 - 力扣(LeetCode)

2025-03-09 20:48:57 816

原创 代码随想录算法训练营第11天|leetcode150.逆波兰表达式求值、leetcode239. 滑动窗口最大值、leetcode347. 前 K 个高频元素

1.这道题难度不大,但是对于而言有些细节地方没有处理好...我第一次写的时候,下面判断那里,用的switch-case,频频报错...后来我发现,第二呢,就是字符串转换成整数那里等函数不清楚。第三点其实很基础...""表示字符串,‘’表示字符但是这道题是有移除风险的,所以stack最好是2.这道题算是二刷,去年用优先队列做的,但我现在已经不知道我当时咋做的了😭。但是我认为优先队列可能更好理解思路如下:1、3、-11、3、-1、-3、5、3、6、71、3、-1、-3、5、3、6、7。

2025-03-08 22:18:28 759

原创 代码随想录算法训练营第十天|leetcode232.用栈实现队列、leetcode225.用队列实现栈、leetcode20.有效的括号、leetcode1047.删除字符串中的所有相邻重复项

和栈相关的题都不算太绕。第一眼看的时候想用string来解决这个题,就是遍历,然后判断str[n]和str[n-1]的关系。其中从下面代码可以看到peek()的实现,直接用了pop()的操作,要不然判空的操作要再写一遍。在项目比较大的时候,由于参数多,全局变量等等,使用递归很容易判断不充分return的条件,非常容易无限递归(或者递归层级过深),,也就是说:首先用i去遍历整个字符串,一直入栈,如果top()元素与当前字符相同,那就弹出栈。,另外注意,如果栈是空的,stack.top()没意义。

2025-03-07 21:37:03 284

原创 代码随想录算法训练营第九天|leetcode151.反转字符串中的单词、右旋字符串

为了优化这个问题,我们可以将移除多余空格这个函数,用双指针来优化。如下所示,slow是慢指针,i就是快指针。这个过程就是:快指针向前走,指到单词的时候,就把原字符串里的内容。思路1:这道题如果另外开辟一个数组的话,就没意思了,还是要在一个数组里做事情。所以我们不妨先整体反转,再局部反转。这道题是反转单词,比昨天单纯的反转字符串有一点难度。类似,只不过那个是移除元素,这个是移除空格。思路2:那么如果先局部反转后整体反转呢。,然后这个双指针去掉空格的思路,与。思路一:O(n^2)

2025-03-06 22:55:41 329

原创 代码随想录算法训练营第八天|leetcode344.反转字符串、leetcode541.反转字符串2️⃣、替换数字 与STL之string

然后一个指针指向原来数组存储末尾,即presize-1。另一个指针指向新存储空间末尾。string 与c-string的区别:string字符串没有‘\0’结尾,但是后者类型为 const char *,以“\0”结尾。2.从第一个不相同的字符进行比较,如果被比较的字符值较小,或者其他字符都匹配,比较字符串的个数较多,则返回-1。1.从第一个不相同的字符进行比较,如果被比较的字符值较大,或者其他字符都匹配,比较字符串的个数较少,则返回1。因为要找的也就是每2 * k 区间的起点,这样写,程序会高效很多。

2025-03-05 20:47:56 337

原创 代码随想录算法训练营第七天|leetcode454.四数相加2️⃣、leetcode383.赎金信、leetcode15.三数之和、leetcode18.四数之和

首先定位a的位置,也就是for循环的i,然后下面分别将指针指向i+1和最后一个元素,如果a+b+c>0,那么c--;,这个阶段是保持a不变了,然后当b,c两指针重合,a就移动到下一个位置。思路:这道题很基础,就说把magazine的字符构成存入哈希表中,然后用ransom中的字符对应去减,出现一个就减一个,直到遍历结束。然后遍历后两个数组的时候,求出0和c+d的差值,然后看在map中是否可以找见,如果可以找见,cnt+=map->Second。但有个棘手的问题,也就是说去重的问题。

2025-03-04 19:57:43 344

原创 代码随想录算法训练营第六天|leetcode242.有效的字母异位词、leetcode349.两个数组的交集、leetcode202.快乐数、leetcode1.两数之和

思路:这道题首先把nums1的数以哈希表的形式存入nums_set当中,然后遍历nums2,判断nums2中的元素在nums1能否找见,如果可以找见,就把所对应的元素存入结果数组当中。思路:这道题很简单,比如eae,aee这两个词,eae把对应字母出现的次数存入数组中,然后把aee每个字母出现的次数减下去,最后查看26位的数组对应值是否为0.当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。本题,我们不仅要知道元素有没有遍历过,还要知道这个元素对应的下标,

2025-03-03 21:28:34 707 2

原创 代码随想录算法训练营第四天|leetcode24.两两交换链表中的节点、leetcode19.删除链表的倒数第N个节点、面试题02.07.l链表相交、leetcode142.环形链表2️⃣

x+y+n(z+y)=2(x+y) => x = n(y+z)-y => 当n等于1的时候,x==z。curA和curB是否相同,如果不相同,同时向后移动curA和curB,如果遇到curA == curB,则找到交点。链表的一大问题就是操作当前节点必须要找前一个节点才能操作。这就造成了,头结点的尴尬,因为头结点没有前一个节点了。快指针走的距离:x+y+n(z+y)。慢指针走的距离:x+y。还有下面的代码有个缺陷哈~虚拟头节点最后应该delete掉。删除链表的第index个节点的数值。

2025-03-02 19:44:59 580

原创 代码随想录算法训练营第三天|leetcode203.移除链表元素、leetcode707设计链表、leetcode反转链表

设置快慢两个指针,快指针先走,慢指针后走,然后定义个tmp指针存储下一个更新对象。最后fast指向nullptr,慢指针指向最后一个元素。(这道题不用定义虚拟头节点)这道题以前做过,算是二刷了,做的很顺利,但是我发现递归还是想不出来。但是如果先写出双指针法的代码,就可以根据上面的代码把递归写出来,很神奇呢~。但是这道题如果直接让我把递归写出来的话,就很费劲了呢。这道题没有难度,就是常规的增删改查。不过对我而言有个易错点:删除或者增加节点个数的时候,最开始size忘更新了。总而言之这道题还是蛮简单的。

2025-02-28 19:39:55 194

原创 数组+vector部分总结篇~~~(代码随想录)

通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。考察简单,注意⚠️边界问题。左闭右闭&&左闭右开。窗口大小的,从而得出长度最小的符合条件的长度。滑动窗口的精妙之处在于。数组的元素不能删除但是vector是动态数组可以删除。他的下标都是从0开始的,并且他的存储空间是连续的。主要要理解滑动窗口如何移动 窗口起始位置,达到。,所以我们在删除或者添加元素的时候,就难免要。如上图所示,对于一维数组而言,不断调节子序列的起始位置。

2025-02-27 21:34:16 334

原创 代码随想录算法训练营第二天|leetcode209.长度最小的子数组、leetcode59.螺旋矩阵、区间和问题

长度j-i+1(不要总因为加不加1的问题,而一直纠结。),然后当时做的时候res的初始值随便🫤设置的,,导师后面返回的时候出现了错误。最开始做这道题的时候没有仔细审题....,没看到是子序列,然后先对数组排序然后动态规划做了....简单问题复杂化了。注意⚠️,时间复杂度是O(n),因为主要是看每个元素被操作的次数。简而言之,就是不断调节子序列的起始位置和终止位置,从而得到我们想要的结果。比如1 2 3 4 5。或者求下标1和3之间的元素。

2025-02-27 20:53:18 357

原创 代码随想录算法训练营第一天|leetcode704.二分查找、leetcode27.移除元素、leetcode977.有序数组的平方

思路:二分查找的前提要是有序数组,同时题目中还强调是没有重复元素。因为如果有重复元素,那么使用二分查找返回的下标就不唯一了。注意边界条件,一般有两种写法,

2025-02-26 20:16:07 265

空空如也

空空如也

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

TA关注的人

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