
代码随想录
文章平均质量分 92
代码随想录训练营内容,希望督促自己赶紧完成
Che3rry
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
代码随想录|代码随想录算法训练营一刷总结
印象很清楚,3月17号这天做了很多决定,其实去年就用python刷过一段时间的算法,但是很快就坚持不下去了,所以在这一天决定了:正式开始刷算法题、正式开始准备秋招、并且认认真真写博客记录自己的学习路径。我觉得不仅卡哥是在教你这门课,最大的感觉是让你体会到算法的魅力,代码随想录的整个社区氛围我也非常喜欢,潜水跟大佬们也学到了很多。最后希望自己能够坚持到最后吧。原创 2024-05-22 11:35:43 · 611 阅读 · 1 评论 -
代码随想录算法训练营DAY57|C++单调栈Part3|84.柱状图中的最大矩形
二刷回来搞总结。原创 2024-05-20 22:01:57 · 1301 阅读 · 0 评论 -
代码随想录算法训练营DAY56|C++单调栈Part2|503.下一个更大元素II、42.接雨水
在前几题的练习中,我们熟悉了单调栈的工作过程,需要当前栈顶元素和当前遍历元素进行一个比较,如果当前遍历元素大于栈顶元素,此时就是我们收获结果的时候,但是这求的是当前元素右边第一个比他大的元素,左边的应该怎么求呢?其实,左边的第一个最大元素,他已经在栈内了,而且就是栈顶的第二个元素(因为我们栈是单调递增栈,左边第一个最大元素是我们遍历过的,它就在栈内)!接下来是30,我们发现当前遍历的元素大于栈口元素了,也就是说我们发现凹槽了,那么我们的凹槽元素就是10了,右柱子是30,左柱子是20。原创 2024-05-20 22:00:30 · 883 阅读 · 0 评论 -
代码随想录笔记|C++数据结构与算法学习笔记-字符串(一)|344.反转字符串、541.反转字符串II、替换数字、151.翻转字符串里的单词
i += 2k),然后又是对前k段进行反转,所以我们循环中的每次操作也只操作前k个,即i到i+k段字符串进行反转。ease的底层实现其实就是双指针,只不过我们这样调用era se的话,一次只删除一个空格,我们直接使用双指针法可以进行批量删除,时间复杂度为。在一个就是,在对复杂情况进行模拟的时候,我们一定要考虑,是否能够将某些规则进行合并处理,在本题中规则三和规则二就进行了合并。反转字符串,最直观的想法就是使用双指针,一个指向最前面,一个指向最后面,互相交换,然后向中间靠拢。那么现在我们的目标元素就是空格。原创 2024-03-20 12:00:08 · 760 阅读 · 0 评论 -
代码随想录笔记|C++数据结构与算法学习笔记-数组(二)|双指针、滑动窗口、模拟行为(循环不变量原则的应用)
本文基于代码随想录,写入一些自己的想法。原创 2024-03-18 15:49:13 · 876 阅读 · 1 评论 -
代码随想录笔记|C++数据结构与算法学习笔记-哈希表(二)|383. 赎金信、15. 三数之和、18. 四数之和
本文基于代码随想录,写入一些自己的想法。原创 2024-03-20 17:32:01 · 907 阅读 · 0 评论 -
代码随想录笔记|C++数据结构与算法学习笔记-栈和队列(一)|232.用栈实现队列、225. 用队列实现栈、20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值
其实我们只需要把元素1取出来加入队列的队尾,把元素2取出来加入队列的队尾,这样元素3就到队列的出口了,我们就可以先弹出元素3。我们现在遍历到第二个b,然后栈顶元素也是b,那么就消除,一下个遍历a,但是由于栈顶的b被消除了,此时的栈顶是a,然后我们再次完成消除,最后遍历c、a。用来存我们遍历过的元素,我们每遍历一个元素,都去栈里面询问一下,我之前有没有遍历a,我的前一个字母是a吗。我们从第一个符号开始遍历,每遍历一次,我们把它的右括号入栈,然后等到匹配的时候,对应出栈即可。把栈A的数据出栈,压入到栈B中。原创 2024-03-22 11:19:40 · 602 阅读 · 0 评论 -
代码随想录笔记|C++数据结构与算法学习笔记-栈和队列(二)|239. 滑动窗口最大值、347.前 K 个高频元素
但是其实,滑动窗口的移动过程很想事一个队列,滑动窗口朝着下个元素移动的时候,很像pop掉了最左边的元素,push进最右边的元素,所以队列中始终维护窗口中的值。堆的底层实现其实就是二叉树,大顶堆就是根结点的元素是最大的,即父亲总比左右两个孩子的数值大。同时优先级队列(大顶堆)也无法解决这个问题,因为大顶堆会自动给你排序,所以元素顺序改变了,我想pop的元素就不能正常pop了。其实计算元素出现的频率最好的就是使用map,其中key记录元素,value计算元素出现的次数。至于为啥可以看上文的文章或者视频链接。原创 2024-03-22 11:20:28 · 386 阅读 · 0 评论 -
代码随想录笔记|C++数据结构与算法学习笔记-数组(一)|二分查找
略,同理,唯一需要注意的就是当返回插入位置的时候一定要把情况讨论全,一共有四种情况。,我们想要写出二分查找的代码就是要先找到到底是哪个区间,是左闭右闭还是左闭右开呢?本题有一个很重要的点,就是在区间中查找区间,所以我们不得不查找目标区间的左右边界。与之前题目的最大差别是,这个并不是在找一个中间值,这个可以理解为在找一个边界值。第一种写法,我们定义 target 是在一个在左闭右闭的区间里,第二种写法,我们定义 target 是在一个在左闭右开的区间里,,即在循环的过程中保持不变的性质。原创 2024-03-17 20:45:40 · 1088 阅读 · 1 评论 -
代码随想录笔记|C++数据结构与算法学习笔记-字符串(二)|28. 实现 strStr()、459.重复的子字符串、KMP算法
前缀表是[0, 1, 0, 1, 2, 0],如果遇到不匹配,也就是说遍历到f,我们就找不包含f的前面那个子串的最长相等前后缀,是2。其实前缀的后面的那个字符的下标正好就是前缀的长度。那么如果这是个重复的字符串,那么我们从后面再重复加一遍,变成s+s,那么这个字符串中也一定是包含了一个新的s,比如s=abcabc,s+s = abc|abcabc|abc,这里就出现了一个新s。如果这个字符串是由重复子串组成的,那么它的最小重复单位,就是它的最长相等前后缀不包含的那个子串,就是它的最小重复子串。原创 2024-03-22 11:18:15 · 834 阅读 · 0 评论 -
代码随想录笔记|C++数据结构与算法学习笔记-链表(二)|两两交换链表中的节点、删除链表的倒数第N个节点、环形链表II
所以我们只需要求出两个链表的长度,并求出两个链表长度的差值,然后让curA移动到,和curB 末尾对齐的位置。此时我们就可以比较curA和curB是否相同,如果不相同,同时向后移动curA和curB,如果遇到curA == curB,则找到交点。然后在遍历链表的过程中,直接比较两个指针的地址是不是想等就可以了,但是很明显,里那个链表不一样长,一个跑得快一个跑得慢,所以我们首先需要让两个指针起跑线相同,然后开始遍历,这样就可以一起到终点了!首先能想到本题肯定是要两个指针的,一个操作链表A,一个操作链表B。原创 2024-03-19 12:15:46 · 910 阅读 · 0 评论 -
代码随想录笔记|C++数据结构与算法学习笔记-哈希表(一)|有效的字母异位词、两个数组的交集、快乐数、两数之和、四数相加II
本文基于代码随想录,写入一些自己的想法。原创 2024-03-19 17:28:33 · 865 阅读 · 0 评论 -
代码随想录笔记|C++数据结构与算法学习笔记-链表(一)|移除链表、构造设计链表、反转链表
将一个值为val的节点追加到链表中作为链表的最后一个元素。创建一个新结点遍历链表到最后把新结点放到最后一个节点的后面链表长度更新_size++;原创 2024-03-18 21:47:08 · 841 阅读 · 1 评论 -
代码随想录笔记|C++数据结构与算法学习笔记-栈和队列(〇)|stack、queue、单调队列和优先级队列(priority_queue)、大顶堆和小顶堆
队列中只有队头和队尾才可以被外界使用,因此队列不允许有遍历行为。栈中只有顶端的元素才可以被外界使用,因此栈不允许有遍历行为。队列容器允许从一端新增元素,从另一端移除元素。栈中进入数据称为 —栈中弹出数据称为 —队列中进数据称为 —队列中出数据称为 —原创 2024-03-28 15:41:53 · 760 阅读 · 0 评论 -
代码随想录算法训练营DAY54|C++动态规划Part15|⭐️647.回文子串、516.最长回文子序列
二刷回来整总结!/Users/cherry/MyLab/GOJOB/C++/代码随想录/算法训练营/assets/20210121171032473-20230310132134822.jpg。原创 2024-05-05 10:51:53 · 1120 阅读 · 0 评论 -
代码随想录笔记|C++数据结构与算法学习笔记-二叉树(七)|LeetCode617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树
用来比较遍历的节点是否有序,因为后台测试数据中有int最小值,所以定义为longlong的类型,初始化为longlong最小值。原创 2024-04-02 19:56:59 · 347 阅读 · 0 评论 -
代码随想录笔记|C++数据结构与算法学习笔记-二叉树(四)|LeetCode222.完全二叉树的结点个数、110.平衡二叉树、257.二叉树的所有路径
如果它是满二叉树,那就说明向左遍历的深度和向右遍历的深度一定是相等的。并且,最后的叶子结点左右遍历后中间肯定存在着叶子结点,而不会是空的,这是完全二叉树为我们保证的。求路径的过程中我们一般要使用前序遍历,因为只有前序遍历我们才能让父结点去指向它的孩子结点,这样才能吧我们的顺序按照题目输出出来。本题我们是要收集路径,加入有一个容器从根结点出发收集路径1,那么等到收集路径2的时候我们还要弹出路径1,只剩下一个根结点在里面,这就是回溯的过程。总体的思路就是判断每一个结点的左右子树的高度,看它的高度差是否超过1.原创 2024-03-31 16:37:33 · 810 阅读 · 0 评论 -
代码随想录算法训练营DAY53|C++动态规划Part14|583.两个字符串的删除操作、72.编辑距离、编辑距离总结篇
二刷的时候进行补充。原创 2024-05-04 15:48:18 · 1029 阅读 · 0 评论 -
代码随想录笔记|C++数据结构与算法学习笔记-二叉树(六)|LeetCode106.从中序与后序遍历序列构造二叉树、654.最大二叉树
那么再切换到中序可知,左区间是9,右区间是15,20,7;再切换回后序9,15,7,20中,9是左子树里面的,15,7,20是右子树的元素;6是最大的数,3 2 1是左子树,3又是最大的数作为6的左孩子;2 1是3的右区间作为右子树,2又是最大的作为3的右孩子,1是2的右区间,所以1是2的右孩子,由此得出二叉树。选择数组中最大的书,来切割数组,左区间作为左子树,右区间作为右子树,如此循环构造一颗最大二叉树。切割后序数组,拿切中序数组形成的左中序数组去切,因为他俩都是一样的:形成左后序 右后序。原创 2024-04-02 17:22:53 · 1025 阅读 · 0 评论 -
代码随想录算法训练营DAY52|C++动态规划Part13|392.判断子序列、115.不同的子序列
KMP算法求的是连续序列,本题中仅仅是来求子序列(字符串的一个 子序列 是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。一定都是1,因为也就是把以i-1为结尾的s,删除所有元素,出现空字符串的个数就是1。,也就是说,我们的当前格子需要左上方格子和左边格子才能推导出来。那必然是1,因为空字符串s可以删除0个元素,变成空字符串t。这一类问题,基本是要分析两种情况,这里是跟上一题一样的。根据递推公式来的,从上到下,从左到右。,如果遇到不相同的元素,字符串。原创 2024-05-04 15:34:24 · 1105 阅读 · 0 评论 -
代码随想录笔记|C++数据结构与算法学习笔记-二叉树(二)|二叉树层序遍历、226.翻转二叉树
先做个标记,总结以后再写,感觉好难😭。原创 2024-03-22 17:04:57 · 996 阅读 · 0 评论 -
代码随想录笔记|C++数据结构与算法学习笔记-二叉树(五)|LeetCode404.左叶子之和、513.找树左下角的值、112.路经总和
找到。原创 2024-04-01 11:48:24 · 1037 阅读 · 0 评论 -
代码随想录算法训练营DAY55|C++单调栈Part1|739.每日温度、496.下一个更大元素I
我么那这个题目中是求数组一里面每个元素,对应到数组二下标对应那个元素右边第一个更大的元素。输出在数组1相应的位置,所以我们的result肯定是要定义一个和。原创 2024-05-05 10:53:26 · 1220 阅读 · 1 评论 -
代码随想录笔记|C++数据结构与算法学习笔记-二叉树(一)|二叉树的递归遍历、二叉树的迭代遍历、二叉树的统一迭代法
二叉树的递归三部曲:(非常重要,每一题几乎都要拿来分析)原创 2024-03-22 15:47:37 · 913 阅读 · 0 评论 -
代码随想录笔记|C++数据结构与算法学习笔记-动态规划(〇)|
详细信息还请看代码随想录讲解视频。原创 2024-03-31 10:04:56 · 470 阅读 · 0 评论 -
代码随想录笔记|C++数据结构与算法学习笔记-二叉树(三)|LeetCode101.对称二叉树、104.二叉树的最大深度、111.二叉树的最小深度
本文基于代码随想录的文章和视频,写入一些小小的个人理解。原创 2024-03-30 16:58:30 · 777 阅读 · 0 评论 -
代码随想录算法训练营DAY51|C++动态规划Part12|1143.最长公共子序列、1035.不相交的线、53.最大子序列和
因为根据。原创 2024-05-03 13:52:59 · 1232 阅读 · 0 评论 -
代码随想录算法训练营DAY43|C++动态规划Part5|1049.最后一块石头的重量II、494.目标和、474.一和零
力扣题目链接1049.最后一块石头的重量II这个背包最多能装多少?LeetCode:1049.最后一块石头的重量II状态:想破脑袋想不出来怎么抽象成背包问题看完思路之后的状态:也不用想破脑袋把这些石头尽可能得分成两堆,如果这两堆石头重量相似的话,相撞之后所剩的值就是最小值。原创 2024-04-30 11:51:58 · 1167 阅读 · 0 评论 -
代码随想录算法训练营DAY44|C++动态规划Part6|完全背包理论基础、518.零钱兑换II、377. 组合总和 Ⅳ
有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。完全背包和01背包问题唯一不同的地方就是,每种物品有无限件。重量价值物品0115物品1320物品2430每件商品有无限个,问背包能背的物品的最大价值是多少?原创 2024-04-30 23:25:56 · 959 阅读 · 0 评论 -
代码随想录算法训练营DAY50|C++动态规划Part11|300.最长递增子序列、674.最长连续递增序列、718.最长重复子数组
暴力解法:两层for循环确定两个数组起始位置,然后再来一个循环可以是for或者while,来从两个起始位置开始比较,取得重复子数组的长度。本题中我们求的是连续的递增子序列,所以我们没有必要去比较前面的所有元素了,在上一题中,我们可是遍历了。以下标i为结尾的连续递增的子序列长度最少也应该是1,即就是nums[i]这一个元素。从递推公式上可以看出, dp[i + 1]依赖dp[i],所以一定是从前向后遍历。从小到大遍历即可,先遍历哪个也都是可以的,并且在遍历的过程中记录。,正好符合递推公式逐步累加起来。原创 2024-05-03 13:49:22 · 1042 阅读 · 0 评论 -
代码随想录算法训练营DAY49|C++动态规划Part10|188.买卖股票的最佳时机IV、309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费
本题其实和123.买卖股票的最佳时机III很像样,在123题中,我们只能买卖两次,但是本题却能买卖k次!这样我们又应该如何处理呢?仍然使用一个二维:第i天的状态为j,所剩下的最大现金是j的状态表示为:除了0以外,偶数就是卖出,奇数就是买入。题目要求是至多有K笔交易,那么那么j的范围就定义为 2 * k + 1 就可以了。确定递推公式跟之前的三道题都是老样子(一定要做买卖股票的最佳时机I~III这里的三道题)。达到状态,有两个具体操作:选最大的,所以 同理也有两个操作:所以剩下的、也就是我们的第二次买原创 2024-05-02 20:19:09 · 959 阅读 · 0 评论 -
代码随想录算法训练营DAY45|C++动态规划Part7|70.爬楼梯(进阶版)、322. 零钱兑换、279.完全平方数
在本题中,我们求的是最少物品是多少,所以本题和组合排列没什么关系,不影响我们最终要求的最少的元素数量,故本题什么样的遍历顺序都可以。也就是说求的是装满这个背包所需要的最少物品的数量。就是我们的背包容量,然后物品的重量和价值就是各个完全平方数,题目中要求的是用完全平方数拼凑出。dp[0]表示 和为0的完全平方数的最小数量,那么dp[0]一定是0。的背包,最少的物品。小的完全平方数组成的数字集合,作为我们的物品集合。中,我们求的是装满这个背包有多少种办法,,但是在本题中,我们的递推公式出现的是。原创 2024-05-01 17:54:00 · 1247 阅读 · 0 评论 -
代码随想录算法训练营DAY46|C++动态规划Part8|139.单词拆分、多重背包理论基础、背包问题总结篇
二刷后完成总结,这里先贴上卡哥的文章背包问题总结篇。原创 2024-05-01 17:57:37 · 781 阅读 · 0 评论 -
代码随想录算法训练营DAY47|C++动态规划Part8|198.打家劫舍、213.打家劫舍II、198.打家劫舍III
我们竟然把一个环形数组的题解耦成了一个线性数组!卡哥牛逼!原创 2024-05-01 18:01:54 · 954 阅读 · 0 评论 -
代码随想录算法训练营DAY48|C++动态规划Part9|121.买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III
递推公式先讨论一下。原创 2024-05-02 17:23:08 · 1510 阅读 · 0 评论 -
代码随想录算法训练营DAY36|C++贪心算法Part.5|435.无重叠区间、763.划分字母区间、56. 合并区间
就是取 区间1 和 区间2 右边界的最小值,因为这个最小值之前的部分一定是 区间1 和区间2 的重合部分,如果这个最小值也触达到区间3,那么说明 区间 1,2,3都是重合的。在代码处理上是直接不管,因为我们只关注非交叉区间的个数,到时候直接总区间个数-非交叉区间的个数就能求得要删除区间的个数。要首先计算出之前我们判断的相邻区间的最小边界(左边界的最小值),和我们下一个区间的左边界是否重叠。总共区间个数为6,减去非交叉区间的个数3。区间4结束之后,再找到区间6,所以一共记录非交叉区间的个数是三个。原创 2024-04-24 10:59:45 · 878 阅读 · 0 评论 -
代码随想录算法训练营DAY40\DAY41|C++动态规划Part.3|343.整数拆分、96.不同的二叉搜索树
本题我们用的是一种近似数学归纳法的推理。在LeetCode官解中,给出了严格的数学证明,我认为这样的思考过程也是非常需要了解的。LeetCode官解(必须手推一下!也不难!卡塔兰数往往解决以下几类问题:有效的括号组合的数量。不同的二叉搜索树的数量。凸多边形划分成三角形的方法数量。在一个正方形格子图中从一角到另一角的路径数量,这些路径仅向上或向右移动,并且不越过对角线。递推公式C01Cn122n1n2CnC01Cn1n222n1。原创 2024-04-28 16:37:52 · 906 阅读 · 0 评论 -
代码随想录算法训练营DAY38|C++动态规划Part.1|动态规划理论基础、509.斐波那契数、70.爬楼梯、746.使用最小花费爬楼梯
动态规划(Dynamic Programming, DP),如果某一个问题有很多重叠子问题,这样往往是用动态规划是最有效的。所以动态规划中每一个状态一定是由上一个状态推导出来的这一点就区分于贪心,贪心没有状态推导,而是从局部直接选最优的。动规是由前一个状态推导出来的,而贪心是从局部直接选出最优的。dp[i]表示第i个斐波那契数值为dp[i]原创 2024-04-26 08:55:15 · 1349 阅读 · 0 评论 -
代码随想录算法训练营DAY42|C++动态规划Part4|0-1背包理论基础(一)、0-1背包理论基础之滚动数组(二)、416.分割等和子集
通过块中的文字,我们就可以知道,本题是不能先遍历背包容量,再遍历物品的,因为在二维世界中,这种遍历方法是从上到下的,本格子的值依赖上一层左上角的值,这样我们在一维数组中无法保存上一层的状态。之前谈到我们本质上还是在遍历一个二维数组,只不过我们在不停得对其进行更新,如果从小到大遍历,我们就会覆盖掉上一层的值,导致之前状态的丢失!那么整个集合的和除以2,其实就是每个子集合的和。还记得我们在[再论01背包的遍历顺序](# 再论01背包的遍历顺序)讨论的遍历顺序吗,我们发现一个很关键的点,那就是本次状态(第。原创 2024-04-29 10:39:13 · 997 阅读 · 0 评论 -
代码随想录算法训练营DAY37|C++贪心算法Part.6|738.单调递增的数字、968.监控二叉树、贪心算法总结
贪心算法总结卡哥的贪心总结真的已经很帅了,但是一刷的我并不太能get到,等到二刷个人再总结一波!/Users/cherry/MyLab/GOJOB/C++/代码随想录/算法训练营/assets/20201229203710729.png/Users/cherry/MyLab/GOJOB/C++/代码随想录/算法训练营/assets/20201229203742446.png。原创 2024-04-25 11:26:24 · 803 阅读 · 0 评论