自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 代码随想录算法训练营第34天| 62.不同路径、 63. 不同路径 II 、343. 整数拆分、96.不同的二叉搜索树

这里的1到n指的实际上其实是值大小的顺序。所以递推公式是dp[i]+=dp[j]*dp[i-1-j],使用for循环不断累加。关于递推公式,一个数 i 可以拆成 j 和 i - j,此时乘积为 i * ( i - j )。遍历顺序是i从1到n,不断更新dp[n],遍历结束后得到的就是最大乘积了。思路:只能往下走或者往右走 初始化第一行和第一列 想要到达剩下的每一个格子,必须从上面或者左面到达,所以递推公式:dp[这个格子]=dp[上面的格子]+dp[左边的格子],遍历顺序:按行遍历或者按列遍历都可以。

2024-07-25 19:16:41 233

原创 代码随想录算法训练营第33天| 509. 斐波那契数、 70. 爬楼梯 、746. 使用最小花费爬楼梯

1). 确定dp数组下标及其含义;746. 使用最小花费爬楼梯。2). 确定递推公式;5). 打印dp数组;509. 斐波那契数。

2024-07-25 00:58:24 131

原创 代码随想录算法训练营第32天| 56. 合并区间、 738.单调递增的数字、968.监控二叉树

思路:将元素按照数组中第一个元素的大小进行排序,然后存入新的vector<vector<int>>中,将原来数组的第一个元素放入新的数组中,然后比较下一个元素和新数组中最后一个元素是否重叠,旧数组中当前元素的第一个数字如果小于新数组中最后一个元素的第二个数字,则发生重叠。更新新数组中该元素的第二个数字为两个数组中第二个数字的最大值。思路:设置一个flag大小为当前数字的长度。如果这一位数字的大小大于前一位,则把这一位改为这一位减去1。遍历结束后,把flag往后的所有数字都改为9即可。

2024-07-24 00:55:28 206

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

至于判断下一个气球是否和前两个重叠的方法,便是将当前元素的第二位数字改为该元素的第二位数字和前一个元素的第二位数字的最小值,之后进行正常比较即可。对重叠次数进行统计,最后返回重叠次数。然后再次遍历字符串,当访问到一个元素时,看他的最大下标是否大于当前存储的区间末尾的最大下标,如果大于则替换末尾的最大下标(这里末尾最大下标指的是该区间到什么位置结束),最后当i等于当前的最大下标时,存储这个区间,然后继续向后遍历,直到结束。思路:统计重叠区间次数,重叠区间次数的和需要移除的区间数量相等,具体思路和前一题相同。

2024-07-23 03:06:01 161

原创 代码随想录算法训练营第29天|134. 加油站、135. 分发糖果、860.柠檬水找零、406.根据身高重建队列

首先把所有下表对应的值都设置1,从左往右遍历,如果右边的孩子分数大于左边的孩子,则右边孩子糖果数=左边孩子糖果数+1;所以下面要做的就是让每个孩子和他左边的孩子之间的糖果差异也符合条件,此时从右往左遍历,如果左边的值大于右边,则我们取当前已存储的值和右边的值+1中的最大值,这样我们也满足了第二个维度的要求。思路:从当前节点开始对差值开始做累加,如果碰到一个节点导致累加的值变成负的了,则前面的节点都不能成为能够出发的节点,从下一个节点重新开始找,同时把start的值改为这个节点。406.根据身高重建队列。

2024-07-21 00:13:50 199

原创 代码随想录算法训练营第28天|122.买卖股票的最佳时机II、55. 跳跃游戏、45.跳跃游戏II、1005.K次取反后最大化的数组和

思路:记录当前遍历可以覆盖的最大范围,如果当前覆盖范围小于数组大小,则遍历到当前可以访问的最大下标时,计数增加1次。在进行遍历时,不断计算当前下标的可以跳跃最远距离,如果大于当前的覆盖范围,则做一次记录,在到达原本的可访问最大下标时,我们使用存储的新计算的覆盖范围替换原有的覆盖范围,继续向后遍历。思路:从位置为下标0的元素开始,按照当前下标所记录的跳跃值进行for循环,遍历到num[i]+i为止。思路:求最大化的数组和,只需要把负数争取全部变为正的即可,如果k有富余,则一直反转绝对值最小的那个数。

2024-07-20 00:53:27 158

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

思想:本质上是找极值的过程,每当发现当前值是局部峰值的时候,就可以进行计数。当只有两个元素时,要分开讨论元素相同和元素不相同的情况。大于两个元素时,要考虑平坡的情况,即前后两个值大小相等,分为单调有平坡和上下有平坡。思想:先对两个数组按从小到大排序,遍历饼干数组,每当当前孩子饥饿值小于等于饼干值时就做一个计数,如果计数等于孩子数量就停止循环。如果sum小于零了则从下一位开始从0重新开始记录sum,继续然后更新最大和即可,这样局部最优就是全局最优了。leetcode 53. 最大子序和。

2024-07-19 00:33:29 117

原创 代码随想录算法训练营第26天|491.递增子序列、46.全排列、47.全排列 II

除此之外,另一个边界条件则是保证开始储存时在这一层push进的元素大小不相等,因为如果有相等的情况,那么遍历第二个大小相同的值的情况已经被第一次的值包括了,即需要做树层去重。这道题是树枝去重,即下一层待加入的元素不会包含已经使用过的元素,要做到这一点我们可以使用bool类型的数组,把访问过的元素下标设置为true即可。思想:因为这次相比于全排列,包含了重复数字,所以我们要保证在全排列的基础上去除每一个树层包含两个相等值的情况,具体可以参考491和46的逻辑,既做树枝去重又做树层去重。

2024-07-18 02:18:00 251

原创 代码随想录算法训练营第25天|93.复原IP地址、 78.子集、90.子集II

思想:常规回溯模板,这次插入的元素是长度为1-3的字符串,而且第一位必须从输入字符串的第一个开始,所以针对每个分出来的字符串要做合理性判断,如果满足条件,则push进path,path中字符串个数为4并且已访问完最后一个元素时则push进result。思想:先排序,当该字符串的开头和他下标的前一位相等时,跳过该下标对应的值,因为他所产生的结果已经被前一位包括了,把每次访问的结果都push进去。思想:要把每一次访问的结果都push进去。

2024-07-16 23:29:12 180

原创 代码随想录算法训练营第23天|39. 组合总和、 40.组合总和II、131.分割回文串

如果是在同一层(即同一个for循环)中访问到的,那么前一个1所获得的数组已经包含了当前1可获得的所有情况,甚至还包含了这个1本身,所以应该跳过当前的1.但如果是在下一层循环中遇到了当前的1,说明这两个1是在同一个组合中出现的,这并不冲突,比如说[1,1],该情况是合法的,不需要跳过。为了区分这两种情况,我们可以在回溯中设置一个bool类型的数组来储存当前的访问情况,如果位置i和位置i-1的值相同,而且位置i对应的bool为1,说明i-1这个值被访问过了,为树枝遍历,可以继续。其他地方也是直接套模板就可以。

2024-07-14 18:01:15 197

原创 代码随想录算法训练营第22天|77.组合、216.组合总和III、17.电话号码的字母组合

遇到的困难:对于for循环的边界条件不是很理解,i < letter[digits[startindex] - '0'].size()的意思是对于每个数字,只循环它对应字符串的大小进行处理就可以,比如说3对应‘abc’,则for循环3次。思想:回溯本质上是把for循环一层一层的包装起来,把数组当作全局变量比较方便。一层一层访问并添加,满足条件之后将值push进答案数组,然后向上一层回溯(把这一层push的元素pop掉之后结束这一层的遍历即可)。17.电话号码的字母组合。216.组合总和III。

2024-07-14 00:00:38 206

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

除此之外,采用先序遍历也可以,如果当前节点不符合条件,就对他的左子树或者右子树中符合条件的节点进行相同的处理,然后返回给上一层节点。思想:因为是平衡二叉搜索树所以要左右子树的元素个数相差不可以超过1,找到数组中最终间的元素并将其作为根节点,通过元素下标将原数组分为左右两个部分,对两个新数组分别进行上面相同的操作,并将结果向上一层返回。思想:右根左进行遍历,设置一个sum记录总和,当访问到一个结点的时候,更新sum=sum+当前val,然后把新的值赋给当前节点。538 .把二叉搜索树转换为累加树。

2024-07-13 01:24:38 206

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

思想:二叉搜索树的最近公共祖先,要想这个结点是两个结点的公共祖先,首先这个结点的值就应该介于两个结点之间,才能满足两个结点分别位于公共祖先结点两侧。除此之外如果继续向下遍历,则会错过查找到两个结点中其中一个的机会,所以答案应该返回第一个满足条件的结点。3. 左右子树都不为空:(1)找到右子树的最左侧结点,将左子树接入,然后返回右子树的根节点,即可跳过跳过要删除的结点;(2)找到左子树的最右侧结点,将右子树接入,然后返回左子树的根节点。4. 左子树为空右子树不为空:返回右子树。然后递归即可,根左右。

2024-07-11 23:08:49 132

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

思想:想要判断某个节点是不是两个节点的公共祖先,首先要满足他的孩子里含有符合条件的节点,所以想要知道这个节点符不符合,就要先访问孩子,再把孩子的情况向上返回给父节点,此时父节点的值设置为true, 把满足条件的节点返回给父节点的父节点,直到两个子树都为true,则满足条件。思想:中序遍历,因为中序遍历二叉搜索树得出的值的顺序是有序的,所以提前设置一个指针指向当前的结点,当root到下一个结点时,计算这两个结点的值的差,若小于已经存储的最小值,则对最小值进行替换,否则继续遍历。501.二叉搜索树中的众数。

2024-07-11 01:13:31 102

原创 代码随想录算法训练营第18天| 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

思想:遍历一下这个数组找到最大值,根据该值的下标将数组分为两部分:左侧数组组成的左子树和右侧数组组成的右子树。所以采用相同的方法构造左孩子的最大二叉树和右孩子的最大二叉树。思想:二叉搜索树在中序遍历的情况下访问节点的值是逐渐增大的,所以只需要设置一个指针指向当前访问节点的前一个节点,判断这两个节点值的大小关系即可判断是否为二叉搜索树。思想:根据给出的val和根节点的值比较,相等则返回该节点,大于则分析右子树,小于则分析左子树。如果访问到叶子节点时val还是和这个节点的值不相等,则返回空指针。

2024-07-09 23:13:10 145

原创 代码随想录算法训练营第16天| 513. 找树左下角的值、112. 路径总和、113. 路径总和ii、106.从中序与后序遍历序列构造二叉树、105.从前序与中序遍历序列构造二叉树

思想:首先要明确怎么才能找到根节点,后序遍历数组中的最后一个元素就是根节点,在我们找到这个值之后,我们设置index来记录这个根节点在中序遍历序列中的什么部位。确定了这些之后,我们可以建立新的左子树的后序遍历数组和中序遍历数组,以及新的右子树的后序遍历数组和中序遍历数组。在这里我们需要注意的是必须先找出中序遍历数组,因为我们并不知道在后续遍历序列中,两个子树的间隔在什么地方,只能通过index来找。这道题主要要注意的是回溯的思路,在什么时候加入val,在什么时候减去val。最后出队的是树最深层最左边的值。

2024-07-08 00:45:29 309

原创 代码随想录算法训练营第15天| 110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和、 222.完全二叉树的节点个数

如果是,则可以通过位运算得出节点个数。在这一题初步了解到回溯的思想,首先我们可以把一个节点的值加入数组中,当当前遍历结束后,再把这个节点中的元素pop出来,一直pop到有未访问的路径为止,使用这种明显含有回溯思想的方法需要拷贝参数地址进行修改。思路:首先看当前节点有没有左孩子,如果有的话,则看左孩子的左右孩子是否为空,如果为空,则说明这个节点是左叶子节点。思想:一个树想要是平衡二叉树,首先前提是他的子树是平衡二叉树,所有用从下往上遍历的方法,不断比较左右孩子的深度,就可以判断是不是平衡二叉树了。

2024-07-06 13:30:20 208

原创 代码随想录算法训练营第14天| 226.翻转二叉树、101. 对称二叉树、104.二叉树的最大深度、111.二叉树的最小深度

当两个树分别的左右孩子都满足条件后才可以看父节点是否满足条件,否则没有意义,因此这里也要采用后序遍历,最后访问根节点。由外到内,再到父节点。思路:写出中序遍历的序列之后,发现这棵树变化前后的遍历顺序是相反的。思想:用了前序遍历和递归。首先把最小值设置为INT_MAX,之后开始遍历二叉树,每到一层,深度加1,遇到有节点的左右孩子都为空则比较当前深度与最小深度,如果小于则替换。首先把最大值设置为0,之后开始遍历二叉树,每到一层,深度加1,遇到有节点的左右孩子都为空则比较当前深度与最大深度,如果大于则替换。

2024-07-05 02:52:31 198

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

之后滑动窗口移动,当滑动窗口的左侧值对应的value等于deq.front()的话,则目前的队头元素排出,未排出时滑动窗口每移动一下,把这个值存入结果数组中一次。优先级队列:默认大根堆,如果想实现小根堆则需要自定义函数来改变排序规则,这里需要注意的是存放小根堆的数组是从后往前开始建堆的,所以数组从前到后是一个从大到小的顺序。栈顶的两个元素进行计算,然后把结果压回栈 就可以了。单调队列:队列中的元素按从大到小或者从小到大的顺序排列,push新元素时如果旧元素不符合条件则先pop旧元素再push新元素。

2024-07-04 01:35:50 306

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

题目链接:232. 用栈实现队列思想:利用两个栈,先存入一个栈,等到输出的时候再把这个栈的元素全部压入另一个站,然后等另一个栈的栈顶元素pop之后。剩下的元素再压回原来的栈,这样就实现了队列的pop...public://push元素则直接压入栈中s1.push(x);while(!s1.pop();if(!s2.pop();while(!s2.pop();while(!s1.pop();while(!s2.pop();225. 用队列实现栈。

2024-07-01 23:29:38 282

原创 代码随想录算法训练营第9天| 151.翻转字符串里的单词、卡码网:55.右旋转字符串

fast先移动,如果是空格,则继续后移,如果不是空格,那么考虑慢指针此时的位置,如果slow=0,那么我们直接将string[slow]的值改成string[fast]。如果不是0,那么现在的这个slow所指的位置写入空格,然后slow++,将这个slow对应的值改为string[fast]。之后的fast对应的值如果不是空格那么继续赋值,然后slow++,fast++,反之如果是空格则fast++,直到遍历结束。只要先反转整个字符串,再分别反转n切割成的两部分字符串就可以了。

2024-07-01 06:31:52 318

原创 代码随想录算法训练营第7天| 454.四数相加II、383. 赎金信、15. 三数之和、18. 四数之和

哈希法 把四个数组分为两组 第一组中的两个数组中对应的元素求和,存入哈希表,这里用map,因为需要同时记录和的值以及该和出现的次数。c+d = 0-(a+b)也就是说我们只需要找到满足条件的和对应的哈希表键值对就可以了 我们得到了cd的和,就要寻找hash[0-(a+b)]对应的值。对于数组、set、map三种方式的场景有空了更深的理解,同时熟悉了可能需要使用哈希法的场景,虽然有一些不会的题,但是通过看视频都解决了。思想:双指针 具体思路写在下面的注释 这道题如果用哈希法的话在去重的时候会比较困难。

2024-06-30 05:34:02 267

原创 代码随想录算法训练营第8天| 344.反转字符串、541. 反转字符串II、卡码网:54.替换数字

总结:今天题目没有什么难的,主要是熟悉了一下字符串的操作,第二题需要注意判断结束两种情况的条件以及对应的处理方式。541. 反转字符串II。卡码网:54.替换数字。

2024-06-29 02:28:33 271

原创 代码随想录算法训练营第6天| 242.有效的字母异位词 、 349. 两个数组的交集 、202. 快乐数、 1. 两数之和

思想:一直往后遍历,在遍历到一个数的时候,看target与他的差是否已经被存入哈希表,如果是的话,返回之前的那个键值对中的下标和此时这个元素的下标。收获:基本了解了map,set,数组的使用场景。思想:哈希表记录每个字母对应的数量就可以了,遇到能用哈希法的时候先想想能不能用数组,因为数组占用空间最小,分别把两个数组的键值对(值,数量)存入哈希表,最后比较两个哈希表是否相同就可以了。然后查找第二个容器中的元素在哈希表中是不是存在,存在则加入res,并删除哈希表中对应的键值对,不然相同的值可能会被添加多次。

2024-06-28 05:20:37 356

原创 代码随想录算法训练营第4天| 24. 两两交换链表中的节点 、 19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II

思想:其实找到每两个结点的操作步骤之后,就会发现这些步骤是循环的,其次,为了方便操作第一个节点,也要设置虚拟头节点。同时由于节点原来的next被更换后,原来指向的节点会被断开,所以要提前设置一个临时的指针指向原来的next节点。求出两个链表的长度之差diff,让长的那个链表从diff往后遍历,短的那个从头往后遍历。现在这两个链表剩下未访问的节点数相同,令他们同时往后遍历,遇到的第一个相同节点就是答案。根据最后一行等式,可以发现 x的长度 等于 两个指针相遇的点到环的入口加(n-1)个环的长度。

2024-06-27 01:11:12 205

原创 代码随想录算法训练营第3天| 203.移除链表元素 、707.设计链表、206.反转链表

第二题由于边界问题老是过不去 最后也是磕磕绊绊做完了 需要巩固。第一题和第三题比较基础 都是基本操作。应该单独再为链表结点写一个类或结构体。203 移除链表元素。

2024-06-25 04:32:50 148

原创 代码随想录算法训练营第2天| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

重点:滑动窗口的思想(其实在该题目中体现出的本质上也属于双指针的一种),一开始要循环的是结尾的指针,而不是开头的指针。除此之外,在经过四个方向一轮的循环之后,要记得更改起始位置,比如说上一轮是(0,0)开始的,那么下一轮就是(1,1)开始。重点:双指针的用法 本题应该分左右指针,分别从最左边和最右边依次选取平方最大的数,将其平方按倒序存入将要返回的数组中(就是说从arr[n]开始往arr[0]的方向存)遇到的困难:搞不清每个方向循环时的边界 导致最后遍历出的结果不对。遇到的困难:一开始暴力 然后超时了。

2024-06-23 06:20:38 202

原创 代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素

用于right也被计入的情况 ,此时在经过一轮target寻找之后,若 target < nums[middle],说明应该查找左边区间,此时middle已经被计入过是否等于target的判断,所以在下一轮循环中 right = middle - 1,left = middle + 1。今日收获:对于二分查找中 什么时候用left<=right,什么时候用left<right,以及什么时候用middle,什么时候用middle-1,有了清晰的认识。Leetcode 27 移除元素。

2024-06-22 06:27:53 214 1

空空如也

空空如也

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

TA关注的人

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