![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
代码随想录刷题
文章平均质量分 92
懒羊羊->加油吖
这个作者很懒,什么都没留下…
展开
-
代码随想录算法训练营第二十九天 | 134. 加油站 , 135. 分发糖果 ,860.柠檬水找零, 406.根据身高重建队列
局部最优可推出全局最优,找不出反例,那就试试贪心。一些同学可能也会疑惑,你怎么知道局部最优就可以推出全局最优呢?有数学证明么?在贪心系列开篇词。原创 2024-08-14 22:18:28 · 905 阅读 · 0 评论 -
代码随想录算法训练营第二十八天 | 122.买卖股票的最佳时机II , 55. 跳跃游戏 , 45.跳跃游戏II , 1005.K次取反后最大化的数组和
局部最优推出全局最优,找不出反例,试试贪心!如图:i 每次移动只能在 cover 的范围内移动,每移动一个元素,cover 得到该元素数值(新的覆盖范围)的补充,让 i 继续移动下去。而 cover 每次只取 max(该元素数值补充后的范围, cover 本身范围)。如果 cover 大于等于了终点下标,直接 return true 就可以了。原创 2024-08-13 23:27:52 · 1219 阅读 · 0 评论 -
代码随想录算法训练营第二十七天 | 455.分发饼干,376. 摆动序列 ,53. 最大子序和
其实并不会,因为还有一个变量 result 一直在更新 最大的连续和,只要有更大的连续和出现,result 就更新了,那么 result 已经把 4 更新了,后面 连续和变成 3,也不会对最后结果有影响。在计算是否有峰值的时候,大家知道遍历的下标 i ,计算 prediff=nums[i] - nums[i-1] 和 curdiff=nums[i+1] - nums[i],如果。注意版本一的代码中,可以看出来,是先遍历的胃口,在遍历的饼干,那么可不可以 先遍历 饼干,在遍历胃口呢?原创 2024-08-13 00:55:24 · 1087 阅读 · 0 评论 -
代码随想录算法训练营第二十五天 | 491.递增子序列 ,46.全排列 ,47.全排列 II
可以看出元素1在[1,2]中已经使用过了,但是在[2,1]中还要在使用一次1,所以处理排列问题就不用使用startIndex了。大家应该很清晰的看到,树层上对前一位去重非常彻底,效率很高,树枝上对前一位去重虽然最后可以得到答案,但是做了很多无用搜索。因为排列问题,每次都要从头开始搜索,例如元素1在[1,2]中已经使用过了,但是在[2,1]中还要再使用一次1。本题给出的示例,还是一个有序数组 [4, 6, 7, 7],这更容易误导大家按照排序的思路去做了。而且本题也要求不能有相同的递增子序列。原创 2024-08-11 00:23:44 · 1026 阅读 · 0 评论 -
代码随想录算法训练营第二十四天 | 93.复原IP地址 , 78.子集 , 90.子集II
求排列问题的时候,就要从0开始,因为集合是有序的,{1, 2} 和{2, 1}是两个集合,排列问题我们后续的文章就会讲到的。从图中可以看出,同一树层上重复取2 就要过滤掉,同一树枝上就可以重复取2,因为同一树枝上元素的集合才是唯一子集!情况就不同了,本题明确要求只会分成4段,所以不能用切割线切到最后作为终止条件,而是分割的段数作为终止条件。其实子集也是一种组合问题,因为它的集合是无序的,子集{1,2} 和 子集{2,1}是一样的。如果把 子集问题、组合问题、分割问题都抽象为一棵树的话,原创 2024-08-09 23:58:57 · 779 阅读 · 0 评论 -
代码随想录算法训练营第二十三天 | 39. 组合总和 , 40.组合总和II , 131.分割回文串
在处理组合问题的时候,递归参数需要传入startIndex,表示下一轮递归遍历的起始位置,这个startIndex就是切割线。原创 2024-08-09 00:04:49 · 899 阅读 · 0 评论 -
代码随想录算法训练营第二十二天 | 77. 组合, 216.组合总和III , 17.电话号码的字母组合
图中可以看出遍历的深度,就是输入"23"的长度,而叶子节点就是我们要收集的结果,输出["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]。第一次取1,集合变为2,3,4 ,因为k为2,我们只需要再取一个数就可以了,分别取2,3,4,得到集合[1,2] [1,3] [1,4],以此类推。图中每一个节点(图中为矩形),就代表本层的一个for循环,那么每一层的for循环从第二个数开始遍历的话,都没有意义,都是无效遍历。原创 2024-08-08 02:32:04 · 879 阅读 · 0 评论 -
代码随想录算法训练营第二十一天 | 669. 修剪二叉搜索树,108.将有序数组转换为二叉搜索树 ,538.把二叉搜索树转换为累加树
在。原创 2024-08-07 00:33:26 · 700 阅读 · 0 评论 -
代码随想录算法训练营第二十天 | 235. 二叉搜索树的最近公共祖先 , 701.二叉搜索树中的插入操作 , 450.删除二叉搜索树中的节点
剩下的情况,就是cur节点在区间(p.val <= cur.val and cur.val <= q.val)或者 (q.val <= cur.val and cur.val <= p.val)中,那么cur就是最近公共祖先了,直接返回cur。将删除节点(元素7)的左孩子放到删除节点(元素7)的右子树的最左面节点(元素8)的左孩子上,就是把5为根节点的子树移到了8的左孩子的位置。动画中的二叉搜索树中,删除元素7, 那么删除节点(元素7)的左孩子就是5,删除节点(元素7)的右子树的最左面节点是元素8。原创 2024-08-06 02:45:48 · 1004 阅读 · 0 评论 -
代码随想录算法训练营第十八天 | 530.二叉搜索树的最小绝对差 , 501.二叉搜索树中的众数, 236. 二叉树的最近公共祖先
那么我们来说一说,如果 root == q,或者 root == p,说明找到 q p ,则将其返回,这个返回值,后面在中节点的处理过程中会用到,那么中节点的处理逻辑,下面讲解。在回溯的过程中,必然要遍历整棵二叉树,即使已经找到结果了,依然要把其他节点遍历完,因为要使用递归函数的返回值(也就是代码中的left和right)做逻辑判断。判断逻辑是 如果递归遍历遇到q,就将q返回,遇到p 就将p返回,那么如果 左右子树的返回值都不为空,说明此时的中节点,一定是q 和p 的最近祖先。原创 2024-08-05 22:29:55 · 967 阅读 · 0 评论 -
代码随想录算法训练营第十七天 | 654.最大二叉树, 617.合并二叉树 ,700.二叉搜索树中的搜索 , 98.验证二叉搜索树
一些同学也会疑惑,什么时候递归函数前面加if,什么时候不加if,这个问题我在最后也给出了解释。其实就是不同代码风格的实现,原创 2024-08-03 03:01:23 · 788 阅读 · 0 评论 -
代码随想录算法训练营第十六天 | 513.找树左下角的值,112. 路径总和 & 113.路径总和ii,106.从中序与后序遍历序列构造二叉树 & 105.从前序与中序遍历序列构造二叉树
找到。原创 2024-08-03 02:11:26 · 816 阅读 · 0 评论 -
代码随想录算法训练营第十四天 | 226.翻转二叉树,101. 对称二叉树, 104.二叉树的最大深度 , 111.二叉树的最小深度
为什么使用中序遍历求不出高度和深度呢,因为需要通过判断左右子节点的高度来确定中间节点的高度,以此来返回上一层。本题最大的误区就是处理逻辑和最大深度一样,如果一个节点的左孩子或者右孩子为空,此时的最小深度并不为0,而是要看有节点的一侧最小的深度是多少。为什么这个迭代法中序就是可以的呢,因为这是用栈来遍历,而不是靠指针来遍历,避免了递归法中翻转了两次的情况。本题可以使用前序(中左右),也可以使用后序遍历(左右中),使用前序求的就是深度,使用后序求的是高度。,所以在递归遍历的过程中,也是要同时遍历两棵树。原创 2024-08-01 02:03:19 · 940 阅读 · 0 评论 -
代码随想录算法训练营第十三天 | 理论基础,递归遍历,迭代遍历,统一迭代, 层序遍历
写完了递归算法,运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。分析一下为什么刚刚写的前序遍历的代码,不能和中序遍历通用呢,因为前序遍历的顺序是中左右,先访问的元素是中间节点,要处理的元素也是中间节点,所以刚刚才能写出相对简洁的代码,前序遍历是中左右,每次先处理的是中间节点,那么先将根节点放入栈中,然后将右孩子加入栈,再加入左孩子。因为这样出栈的时候才是中左右的顺序。原创 2024-07-30 00:47:25 · 913 阅读 · 0 评论 -
代码随想录算法训练营第十一天 | 150. 逆波兰表达式求值, 239. 滑动窗口最大值 ,347.前 K 个高频元素
寻找前k个最大元素流程如图所示:(图中的频率只有三个,所以正好构成一个大小为3的小顶堆,如果频率更多一些,则用这个小顶堆进行扫描)原创 2024-07-28 00:40:33 · 967 阅读 · 0 评论 -
代码随想录算法训练营第十天 | 232.用栈实现队列 , 225. 用队列实现栈 , 20. 有效的括号 , 1047. 删除字符串中的所有相邻重复项
前两道题目之前单独写了文章,此处就不再重复。原创 2024-07-26 23:45:58 · 526 阅读 · 0 评论 -
代码随想录算法训练营第九天 | 151.翻转字符串里的单词,卡码网:55.右旋转字符串,28. 实现 strStr(),459.重复的子字符串
说到KMP,先说一下KMP这个名字是怎么来的,为什么叫做KMP呢。因为是由这三位学者发明的:Knuth,Morris和Pratt,所以取了三位学者名字的首字母。所以叫做KMP写过KMP的同学,一定都写过next数组,那么这个next数组究竟是个啥呢?next数组就是一个前缀表(prefix table)。前缀表有什么作用呢?前缀表是用来回退的,它记录了模式串与主串(文本串)不匹配的时候,模式串应该从哪里开始重新匹配。原创 2024-07-26 01:26:56 · 691 阅读 · 0 评论 -
代码随想录算法训练营第四天 | 24. 两两交换链表中的节点,19.删除链表的倒数第N个节点 ,面试题 02.07. 链表相交 , 142.环形链表II
了解思路以及链表的反转顺序之后,本题使用双指针基本上没有什么难度,但是有小细节需要注意,比如在反转之后,cur在指向dummyhead时,走完步骤一之后,节点二已经变成cur.next了,后面就可以使用cur.next对节点二进行操作。一开始审题没有仔细,脑袋没有转过来,以为是删除链表中的第n个节点,想着这样只用一次遍历就可以了,后来反应过来是倒数第n个节点,使用暴力法的话,需要先知道链表的长度。,所以如果两个链表有相交,那从相交点到尾部一定都是相等的。(注意:节点相同指的是指针相等,而不是节点的值相等)原创 2024-07-20 19:38:24 · 629 阅读 · 0 评论 -
代码随想录算法训练营第六天 | 242.有效的字母异位词 ,349. 两个数组的交集 ,202. 快乐数,1. 两数之和
不要小瞧 这个耗时,在数据量大的情况,差距是很明显的。此时就要选择另一种数据结构:map ,map是一种key value的存储结构,可以用key保存数值,用value再保存数值所在的下标。由于 a 到 z 的 ASCII 值是连续的,我们可以将字符减去 a,转换成 0 到 25 中的数字,即数组下标。因为题目中说每个位置上的数字的平方和会无限循环,也就是说,sum会重复出现,判断重复出现就可以用set来解决。,而且这道题目中字符串只有小写字符,那么就可以定义一个数组,来记录字符串s里字符出现的次数。原创 2024-07-23 20:00:53 · 1020 阅读 · 0 评论 -
代码随想录算法训练营第七天 | 454.四数相加II ,383. 赎金信 ,15. 三数之和,18. 四数之和
数组的大小是受限制的,而且如果元素很少,而哈希值太大会造成内存空间的浪费。set是一个集合,里面放的元素只能是一个key,而两数之和这道题目,不仅要判断y是否存在而且还要记录y的下标位置,因为要返回x 和 y的下标。所以set 也不能用。这时候就可以用到字典了。原创 2024-07-23 20:51:56 · 1172 阅读 · 0 评论 -
代码随想录算法训练营第八天 | 344.反转字符串,541. 反转字符串II,卡码网:54.替换数字
这道题目要求不能使用额外空间解决,python中首先想到的是reverse函数,但是只用库函数就解决了还有么有其他的解法呢?这里其实可以看到不用双指针,会更加的便捷,但是双指针的思路,能够让我们更多方法的去思考问题。两种写法期思想都是基于在循环中跳过的步长为2*k,一种是直接使用切片操作,另一种是使用双指针操作。然后从后向前替换数字字符,也就是双指针法,过程如下:i指向新长度的末尾,j指向旧长度的末尾。本题并不难,主要考查大家对基础知识的灵活应用,其中最后的方法里面提供了一种s[:]的写法,原创 2024-07-24 22:15:28 · 665 阅读 · 0 评论 -
225. 用队列实现栈
225. 用队列实现栈。原创 2024-07-21 18:12:46 · 419 阅读 · 0 评论 -
232.用栈实现队列
话说晚上看题目真的需要精力,昨天晚上迷迷糊糊的看着道题目,觉得好难,根本看不懂在讲什么,然后直接放弃看题目睡觉去了,今天白天又重温一遍,感觉so easy。好了,回归正题,python里面没有内置的栈数据结构,所以可以使用列表来模拟栈操作。一个输入栈,一个输出栈。但是栈的特性是先进后出,而队列的特性是先进先出,so,这该咋办?,再从出栈弹出数据,如果输出栈不为空,则直接从出栈弹出数据就可以了。,再从出栈弹出数据,如果输出栈不为空,则直接从出栈弹出数据就可以了。在push数据的时候,只要数据放进输入栈就好,原创 2024-07-21 16:26:17 · 317 阅读 · 0 评论 -
代码随想录算法训练营第三天 | 链表理论基础,203.移除链表元素 ,707.设计链表 ,206.反转链表
要判断cur.next是因为我们要取下一个节点的值比较,如果下一个节点不存在,我们取值相当于操作空指针,就会报错。目前只写了,不设虚拟头节点的代码,遇到的问题也都注释在代码里,这里就不过多赘述,后面写虚拟头节点和双链表遇到问题,再更新。单链表只能拿到下一个节点信息,获取不到上一个节点是什么。我没有使用虚拟头结点设计的链表,想好思路。原创 2024-07-19 19:20:26 · 681 阅读 · 0 评论 -
环形链表2
重新看题目讲解时,发现一刷的时候根本没有仔细看,今天又看了一遍,在写代码时候发现还是没有思路,然后思考了下自己的问题,因为有现成的思路解题,所以自己就比较依赖老师的思路,但是看完之后自己并没有回头去整理自己的解题思路。在这里要批评一下自己,在后续的刷题中一定要复盘自己的思路,多一些思考和见解。在用集合解题过程中,自己以为每个节点的值相等,然后节点就是相等的,这种思维完全是错的,所以自己模拟了一下建了一个循环链表,可以帮助小伙伴理解。其证明方法在这里就不过多叙述,可以看卡尔老师的文字讲解证明过程,原创 2024-07-18 23:38:57 · 276 阅读 · 0 评论 -
代码随想录算法训练营第二天 | 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II
if n原创 2024-07-18 19:32:03 · 1031 阅读 · 0 评论 -
代码随想录算法训练营第一天 | 704. 二分查找,27. 移除元素
写二分法,区间的定义一般为两种,左闭右闭即[left, right],或者左闭右开即[left, right)。原创 2024-07-18 12:06:01 · 364 阅读 · 0 评论