自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 代码随想录算法训练营第三十六天 | 1005.K次取反后最大化的数组和、134. 加油站、135. 分发糖果

局部最优:取candyVec[i + 1] + 1 和 candyVec[i] 最大的糖果数量,保证第i个小孩的糖果数量既大于左边的也大于右边的。我们用一个curSum来取累加剩余油,只要加的为负数之后,就说明i下标之前的所有站点都不适合做起始站点,选取i+1作为起始站点。这里取较大值,因为可能我比左边孩子大的数,比右边大的还要大,就取较大的。全局最优:相邻的孩子中,评分高的右孩子获得比左边孩子更多的糖果。全局最优:相邻的孩子中,评分高的孩子获得更多的糖果。,这样最大的负数都会在前面。

2024-05-22 12:21:28 428

原创 代码随想录算法训练营第三十五天 | 122.买卖股票的最佳时机II、55. 跳跃游戏、45.跳跃游戏II

相当于(prices[3] - prices[2]) + (prices[2] - prices[1]) + (prices[1] - prices[0])如果移动下标达到了当前这一步的最大覆盖最远距离了,还没有到终点的话,那么就必须再走一步来增加覆盖范围,直到覆盖范围覆盖了终点,假如第 0 天买入,第 3 天卖出,那么利润为:prices[3] - prices[0]。那我们只需要当利润为正数时去买卖即可,因为只有正数才会对总利润产生正向效果。本题的思路:我们的最终利润是可以分成每天的利润去看的,

2024-05-21 12:10:40 173

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

情况三:单调坡中有平坡这种情况就会出现错误,如果pre一直跟着cur,所以会多一个,因此我们只需要将遇到摆动后,记录一下坡的方向就可以了,不需要实时更新。

2024-05-20 12:41:15 633

原创 代码随想录算法训练营第三十二天 | 332.重新安排行程(可跳过)、51. N皇后(可跳过)、37. 解数独(可跳过),回溯总结

三道题跳两道,做一下N皇后,剩下两道等60天结束后再看,目前跳过的还有字符串的KMP算法。

2024-05-17 21:34:08 395

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

图上也可以看出,我们是每层的每个节点来收集结果的,但是第一层不需要收集,因为元素要求大于等于2个。

2024-05-17 12:34:04 952

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

这题的思路和子集没什么差别,主要是多了一个去重的操作,我们对于去重的操作都是先排序,然后利用used数组来判断是树枝去重还是树层去重,记得used数组要初始化。终止条件:用pointSum来终止,也就是逗点的数量,如果等于3了,说明已经切割完成了,此时去判断一下最后一个区间即可,细节在代码中已经标注。这道题其实本质和组合没有区别,唯一的不同就在于我们收集结果的位置,组合是在叶子节点收集,而子集则是在每个节点都要收集。本题和切割子串还是很相似的,但是细节上有所不同。

2024-05-16 17:53:23 401

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

这题的去重逻辑,其实和三数之和很像,我们排完序后,在树枝上,我们取重复元素是可以的,但是在树层,在遇到相同的,也就是已经走过的路了,那就不要再走了,直接剪枝就可以了,但是。这里我们进行切割的话,是使用startIndex来进行标记的,而在横向的切割中,是用i去寻找下一个切割点的,因此我们截取字符串也是从[stratIndex,i]去截取的。而这题,我们只需要将数组排序后,例如235,和为4,当2+3已经大于4了,就没必要去遍历5了,因此在for循环中多加个判断条件即可。本题主要要理解的是如何画树形结构。

2024-05-15 19:14:37 536

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

const string& 是const引用传递,不会产生副本,也不会改变原来参数的值。其次就是注意逻辑的处理即可,详情见代码,本题也不需要剪枝,因为就是需要所有的可能性。剪枝操作也是一样的,首先剪深度,当和已经大于要求的和,那么就不需要继续深入了。这题回溯的深度,是由元素的个数决定的,这题的宽度,是由对应关系个数确定的。整体的思路和77题是一样的,这里只是多加了个一个和的判断。&引用传递不会产生副本,直接会修改原来参数的值,传入的是地址。值传递,会产生副本,不会修改原来参数的值。这题比较关键的一个点是。

2024-05-14 12:52:13 563

原创 代码随想录算法训练营第二十七天 | 回溯算法理论基础、77. 组合

回溯算法本质就是穷举,加上一些剪枝操作,但不是什么高效的算法。有递归就会有回溯,同时一层递归就是一层for循环。

2024-05-13 12:20:26 272

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

代码随想录。

2024-05-11 12:40:20 318

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

左不空,右不空 (左右孩子都可以上位,选右孩子,就把左子树移到右孩子的最左侧节点的下面即可)如果p在左边,q在右边,那么他们相交的节点就是最近祖先,因为从上往下搜索,所以直接return。p和q,如果都小于当前节点,那么就去左子树搜素,如果p和q都大于当前节点就去搜索右子树。对于二叉搜索树来说,迭代法一般比较简单,因为搜索树已经帮我们确定好了搜索顺序。终止条件就是要找到要删的节点,随后去处理逻辑。叶子节点,左空右空 (直接删)没有找到删除节点 (直接返回)左不空,右空 (左孩子上位)

2024-05-10 12:40:37 461

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

530.二叉搜索树的最小绝对差530.二叉搜索树的最小绝对差。

2024-05-09 12:48:59 516

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

首先想到的是二叉搜索树的特性,利用中序即可,但这题还是有坑的,就是我们必须保证左子树所有节点都比当前节点小,右子树所有节点都比当前节点大。第一次去理解同时处理两个树,我们传参数同时传入两个树的根节点,就是同步进行,随后利用中左右的遍历顺序递归处理即可。这道题和构造二叉树本质上没有区别,注意终止条件和进入递归前的条件判断即可。对于递归理解还是不透彻,自己写不出来qwq。利用二叉搜索树的特性即可,比较简单。

2024-05-08 14:25:31 528

原创 代码随想录算法训练营第二十一天 | 找树左下角的值、路径总和、从中序与后序遍历序列构造二叉树

后序遍历序列的最后一个元素一定是根节点,那么根据这个可以找到中序序列中和这个相等的索引下标,用去切割中序遍历序列,分为左区间和右区间,随后根据左区间和右区间再切割后序序列,然后递归左右区间即可·这里比较容易搞混的点就是:左下角的值是最深层最左侧的叶子节点,那其实三种遍历方式都是可以的,我们因为中节点不做处理,只需要去递归到左边的最底层,没有就去递归右节点的最底层即可。我们只需要先用resize将最后一个元素舍弃后,用中序的左右区间的数量去切割即可,因为他们的数量必定是相同的。

2024-05-07 17:53:42 152

原创 代码随想录算法训练营第二十天 | 110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和

平衡二叉树:左右节点的子树高度差不超过1,因为求高度我们使用后序遍历,递归函数返回值是int,因为我们需要记录左右子树的高度进行比较,父节点像孩子收集信息,并返回给父节点,如果不是平衡二叉树,直接返回-1,如果是则返回1+左右子树最高的高度。对于回溯的理解,我们直接看最后的子树,当叶子节点执行完return后,从函数中出来,那么就需要pop掉这个叶子节点,然后去遍历右节点,同样的pop后,那么这个最后的子树的父节点作为上一级子树的左节点也遍历完了,就pop掉即可,以此类推。递归都不太难,每日打卡。

2024-05-06 16:15:31 379

原创 代码随想录算法训练营第十九天 | 104.二叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数

求深度,我们应该使用前序遍历(从父节点到孩子结点),求高度,我们使用后续遍历(从孩子节点到父节点)。但求的是最大深度,那其实就是根节点的高度,后序遍历将左右孩子的高度收集,返回父节点,父节点再进行加一操作111.二叉树的最小深度解题思路与最大深度的区别:并不是改成min就可以了,因为求得是最近叶子的高度,即最小深度,陷阱就是上图的情况,我们只需要分别判断左空右不空,左右都不为空,左不空右空的情况的就可以了222.完全二叉树的节点个数解题思路对于普通二叉树,

2024-05-05 16:49:36 254

原创 代码随想录算法训练营第十八天 | 层序遍历、 226.翻转二叉树、101. 对称二叉树

用队列模拟,从第一层放节点进去,并记录size(代表这一层的节点个数,方便我们知道是哪一层),弹出节点后,size--并将左右孩子加入队列,终止条件为队列没有元素。中序时,左中右时,要都处理左子树,因为处理左子树后,他就变成了右子树,而这时又处理了左子树,因此都要处理左子树。前序和后序时,只需要节点为空时停止遍历,不为空则交换左右孩子,随后按照中左右或者左右中的循序递归即可。层序遍历也是可以的,我们只需要在层数遍历pop后,将他的左右孩子swap一下,即可,更加直观。,最后判断是否可以翻转。

2024-05-05 00:29:46 195

原创 代码随想录算法训练营第十四天 | 二叉树基础知识、递归遍历、迭代遍历、统一迭代

需要了解 二叉树的种类,存储方式,遍历方式 以及二叉树的定义。

2024-05-03 23:55:30 413 1

原创 代码随想录算法训练营第十三天 | 239. 滑动窗口最大值、347.前 K 个高频元素

这题利用的就是一个单调队列的操作,我们弄懂单调队列的逻辑即可,只需要去维护最大值就可以了,对于类似于滑动窗口的最大值(小)值这类问题,可以想到单调队列这种方法基本的注意事项我都写在注释中了,这边主要还是要理解一下思路,优先级队列的思路。

2024-04-29 22:20:28 282

原创 代码随想录算法训练营第十一天 | 20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值

栈不仅可以记录出现的元素,还可以记顺序当遇到相邻匹配的问题时,我们都可以使用栈来解决,因为栈可以帮助我们记录上一个遍历的元素是什么栈也可以用于逆波兰式的求解,也适用于相邻元素匹配,和相邻元素消除,而逆波兰时在动画上看也是一种消除,因此都是可以用栈来求解的。

2024-04-27 23:04:14 515

原创 代码随想录算法训练营第十天 | 232.用栈实现队列、225.用队列实现栈

这题比较难的就是用一个队列去实现栈,我们只需要想通,当队列和栈保持出元素相同的话,我们只需要将出元素的前size-1个元素重新加入队列,再pop即可。这题比较难得点就是栈是先进后出的,而队列是先进先出的,那么我们只需要用两个栈就可以完成队列操作,一个进栈,一个出栈。我们的出栈操作只需要将每次进栈的元素在pop时加入出栈即可,如果是新加的元素,等待出栈空后一起加即可。补打卡,去旅游了,远程控制写的博客的代码,质量堪忧,但好在跟上就行。

2024-04-27 21:13:13 308

原创 代码随想录算法训练营第九天 | 28. 实现 strStr()(跳过)、459.重复的子字符串(跳过)、双指针法总结

这题一般想到的都是利用for+erase函数来完成,但erase函数的时间复杂度也是O(n),因此时间复杂度是O(n^2),所以我们可以利用双指针法来完成,快指针相当于读指针,慢指针相当于写指针,当快指针读到需要的元素时,我们写入慢指针即可一般移除操作都可以利用这个方法。

2024-04-25 22:23:48 332 1

原创 代码随想录算法训练营第八天 | 344.反转字符串、541. 反转字符串II、卡码网:54.替换数字、151.翻转字符串里的单词、卡码网:55.右旋转字符串

反转字符串用的是双指针秒了反转字符串2 告诉我们当是区间区间判断时,迭代器可以跳着变化,并且注意reverse函数的区间,左闭右开,里面放的是迭代器替换数字 这道题告诉我们,很多数组填充类的问题,其做法都是先预先给数组扩容带填充后的大小,然后再利用双指针法,从后向前进行操作最后是翻转字符串的单词和左旋转右旋转字符串,我们只需要整体反转后,再局部反转即可,注意范围。

2024-04-24 23:06:44 925

原创 哈希表章节总结

是把传入的key映射到符号表的索引上。处理有多个key映射到相同索引上时的情景,处理碰撞的普遍方式是和拉链法: 将发生冲突的元素放在链表中即可线性探测法:一定要保证tableSize大于dataSize,如果发生冲突那么就找他的下一个位置存放数组就不多说了。

2024-04-23 22:50:03 489

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

这道题要求不能有重复的三元组,因此使用哈希法再进行去重操作是非常麻烦和耗时的,因此我们可以换一种思路,用双指针法,但我们也要进行去重操作,但去重操作要如何进行呢,到底是nums[i]==nums[i+1]时跳过,还是nums[i]==nums[i-1]时跳过,我们可想而知,如果是前者就跳过,那么是三元组中不能有重复元素,而后者跳过的意思就是,当。,直接跳过即可,而b,c的去重操作也是一样的。然后再一个重要的点就是如何找到等于0的元组呢,因此不要求下标,我们可以使用sort来排序后,时间复杂度:O(n)

2024-04-23 22:30:51 836

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

当数据值较大的时候,使用set,或者看到唯一,无序等等,且看到某某元素是否出现过,也要联想到哈希结构当我们遇到元素是否出现过这样的问题,就可以联想到哈希结构,但哈希结构又分为三种,因此当我们遇到数据较小时,可以利用哈希数组来完成,当遇到数据较大时,可以利用集合完成(自动去重),当遇到的数据分散,且有别的要记录时,利用map存储。

2024-04-22 21:08:49 369

原创 链表章节总结

这里主要说一下做题的技巧吧。

2024-04-21 22:58:08 302 1

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

本题考查的是链表的基础操作,但在操作过程中我们画图分析时会发现有时会丢失节点的引用,因此要记录可能会丢失的节点,另外比较重要的就是循环条件要如何写,分为偶数和奇数节点的情况,但我们应要先判断cur->next,否则会发生空指针引用的错误这里使用两张卡哥的图来表示一下过程 利用双指针的思路,让快指针先走n步,然后快慢指针同时移动,这样就可以找到倒数第N个节点(快指针指向空,慢指针指向倒数第N个),但由于我们需要删掉这个节点,因此要找到这个节点的前一个节点,只需要让快指针走N+1步即可 记得清除内

2024-04-21 14:32:27 227 1

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

使用虚拟头结点可以统一对链表的操作,但同时不要忘记判断操作的指针是否为空指针,最后使用c++的话需要手动清理内存这里比较妙的是在用index的函数中,利用index来直接记录要循环移动的次数,当cur为虚拟头结点和头结点时,分别是index前一个节点和index节点,这里比较讨巧,其次是对于c++的构造函数等不太熟悉,熟记便可/*** int val;* };*/206.反转链表代码随想录。

2024-04-19 20:48:30 269 1

原创 数组总结篇

(本文的图均引用自代码随想录)

2024-04-18 22:06:20 445

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

双指针思想不限于单个指针去寻找新数组元素,单个指针标记下标,根据这个含有负数平方的数组特性,可以利用两个指针分别去寻找新元素,本题关键在于理解数组的特性,在套用双指针。本题在于理解滑动窗口是什么,和双指针来实现的滑动窗口。窗口是什么?是由起始位置和终止位置之间的元素加起来,符合条件的数组如何以及为何移动起始位置?当我们移动终止位置,扩大窗口后,找到满足条件的数组后,我们要去寻找他的子数组是否满足条件,去找到那个最小的子数组如何以及为何要移动终止位置?

2024-04-18 21:44:05 642 1

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

这里的不变量是定义的区间,是左闭右闭,还是左闭右开,这是不变的,在后续改成区间值的时候,也不变该思路中,实现较为简单,但需要注意的是这个i--,再删除完一个元素后,这个元素的下标值要重新判断以便,以防重置目标值的出现。

2024-04-17 20:37:24 660

空空如也

空空如也

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

TA关注的人

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