![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c++代码随想录
文章平均质量分 92
weixin_42179093
这个作者很懒,什么都没留下…
展开
-
代码随想录算法训练营60天完结总结
这些题都至少要二刷到三刷。每天刷题的感觉,从数组链表的没啥难度,到字符串栈的巩固提升,二叉树是崩溃的第一步,以前只理解前中后序都是怎么一回事,但是真的没了解过代码是怎么一回事。回溯接踵而来,排列组合的问题有了思路(作为一个数学生,下意识的用最好理解的组合数,结果发现有更偏算法的AC办法),剪枝优化却任重而道远;60填的训练营虽然要结束了,走到却并不意味着代码征途的结束,当初报训练营的时候,是想着有一个督促作用。也赖自己,过去的几个月一直在实习,本来以为可以有时间认真做的,结果时间有、精力达不到,惭愧啊。原创 2023-09-09 23:58:20 · 198 阅读 · 0 评论 -
代码随想录算法训练营 day42 |01背包问题、01背包问题——滚动数组、416. 分割等和子集
在一维dp数组中,dp[j]表示:容量为j的背包,所背的物品价值可以最大为dp[j]。原创 2023-08-22 22:41:44 · 90 阅读 · 0 评论 -
代码随想录算法训练营 day41 |343. 整数拆分、96.不同的二叉搜索树
那么从1遍历j,比较(i - j) * j和dp[i - j] * j 取最大的。从递归公式上来讲,dp[以j为头结点左子树节点数量] * dp[以j为头结点右子树节点数量] 中以j为头结点左子树节点数量为0,也需要dp[以j为头结点左子树节点数量] = 1, 否则乘法的结果就都变成0了。j的结束条件是 j < i - 1 ,其实 j < i 也是可以的,不过可以节省一步,例如让j = i - 1,的话,其实在 j = 1的时候,这一步就已经拆出来了,重复计算,所以 j < i - 1。原创 2023-08-21 22:37:33 · 99 阅读 · 0 评论 -
代码随想录算法训练营 day39 |62.不同路径、63. 不同路径 II
从递归公式dp[i][j] = dp[i - 1][j] + dp[i][j - 1] 中可以看出,一定是从左到右一层一层遍历,这样保证推导dp[i][j]的时候,dp[i - 1][j] 和 dp[i][j - 1]一定是有数值。那么很自然,dp[i][j] = dp[i - 1][j] + dp[i][j - 1],因为dp[i][j]只有这两个方向过来。这样就可以保证推导dp[i][j]的时候,dp[i - 1][j] 和 dp[i][j - 1]一定是有数值的。原创 2023-08-20 20:38:11 · 87 阅读 · 0 评论 -
代码随想录算法训练营 day38 |动态规划理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
然后再写代码,如果代码没通过就打印dp数组,看看是不是和自己预先推导的哪里不一样。如果打印出来和自己预先模拟推导是一样的,那么就是自己的递归公式、初始化或者遍历顺序有问题了。如果和自己预先模拟推导的不一样,那么就是代码实现细节有问题。原创 2023-08-20 19:04:12 · 128 阅读 · 0 评论 -
代码随想录算法训练营 day37 |738.单调递增的数字、968.监控二叉树、贪心算法总结
目录一、(leetcode 738)单调递增的数字1.暴力解法2.贪心解法二、(leetcode 968)监控二叉树1.二叉树遍历2.如何隔两个节点放一个摄像头情况1:左右节点都有覆盖情况2:左右节点至少有一个无覆盖的情况情况3:左右节点至少有一个有摄像头情况4:头结点没有覆盖三、贪心算法总结力扣题目链接时间复杂度:O(n × m) m为n的数字长度 空间复杂度:O(1)2.贪心解法思考:出现strNum[i - 1] > strNum[i]情况(非单调递增),首先想让strNum[i - 1原创 2023-08-17 19:09:55 · 123 阅读 · 0 评论 -
代码随想录算法训练营 day36 |435. 无重叠区间、763.划分字母区间、56. 合并区间
此时问题就是要求非交叉区间的最大个数。这里记录非交叉区间的个数还是有技巧的,如图:区间,1,2,3,4,5,6都按照右边界排好序。当确定区间 1 和 区间2 重叠后,如何确定是否与区间3也重贴呢?就是取 区间1 和 区间2 右边界的最小值,因为这个最小值之前的部分一定是 区间1 和区间2 的重合部分,如果这个最小值也触达到区间3,那么说明 区间 1,2,3都是重合的。接下来就是找大于区间1结束位置的区间,是从区间4开始。区间4结束之后,再找到区间6,所以一共记录非交叉区间的个数是三个。原创 2023-08-16 22:04:07 · 84 阅读 · 0 评论 -
代码随想录算法训练营 day35 |860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球
排序完的people: [[7,0], [7,1], [6,1], [5,0], [5,2],[4,4]]原创 2023-08-15 19:20:56 · 62 阅读 · 0 评论 -
代码随想录算法训练营 day34|1005.K次取反后最大化的数组和、134. 加油站、135.分发糖果
如果 ratings[i] > ratings[i + 1],此时candyVec[i](第i个小孩的糖果数量)就有两个选择了,一个是candyVec[i + 1] + 1(从右边这个加1得到的糖果数量),一个是candyVec[i](之前比较右孩子大于左孩子得到的糖果数量)。i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到i这里都会断油,那么起始位置从i+1算起,再从0计算curSum。原创 2023-08-14 13:28:06 · 66 阅读 · 0 评论 -
代码随想录算法训练营 day32 |122.买卖股票的最佳时机II、55. 跳跃游戏、45.跳跃游戏II
i 每次移动只能在 cover 的范围内移动,每移动一个元素,cover 得到该元素数值(新的覆盖范围)的补充,让 i 继续移动下去。如果移动下标达到了当前这一步的最大覆盖最远距离了,还没有到终点的话,那么就必须再走一步来增加覆盖范围,直到覆盖范围覆盖了终点。从图中可以看出来,就是移动下标达到了当前覆盖的最远距离下标时,步数就要加一,来增加覆盖距离。,即:移动下标只要遇到当前覆盖最远距离的下标,直接步数加一,不考虑是不是终点的情况。这里还是有个特殊情况需要考虑,当移动下标达到了当前覆盖的最远距离下标时。原创 2023-08-13 17:00:41 · 75 阅读 · 0 评论 -
代码随想录算法训练营 day31 |贪心算法理论基础、455.分发饼干、376. 摆动序列、53. 最大子序和
贪心的本质是选择每一阶段的局部最优,从而达到全局最优。想清楚局部最优,想清楚全局最优,感觉局部最优是可以推出全局最优,并想不出反例,那么就试一试贪心。原创 2023-08-11 13:29:02 · 161 阅读 · 0 评论 -
代码随想录算法训练营 day29 |491.递增子序列 46.全排列 47.全排列 II
uset只负责本层。原创 2023-08-09 19:26:45 · 153 阅读 · 0 评论 -
代码随想录算法训练营 day28 | 93.复原IP地址、78.子集、90.子集II
终止条件和分割回文串情况不同,本题明确要求只会分成4段,所以不能用切割线切到最后作为终止条件,而是分割的段数作为终止条件。从图中可以看出,同一树层上重复取2 就要过滤掉,同一树枝上就可以重复取2,因为同一树枝上元素的集合才是唯一子集!子集也是一种组合问题,因为它的集合是无序的,子集{1,2} 和 子集{2,1}是一样的。求排列问题的时候,就要从0开始,因为集合是有序的,{1, 2} 和{2, 1}是两个集合。startIndex一定是需要的,因为不能重复分割,记录下一层递归分割的起始位置。原创 2023-08-08 19:23:39 · 59 阅读 · 0 评论 -
代码随想录算法训练营 day27 | 39. 组合总和、40.组合总和II、131.分割回文串
在处理组合问题的时候,递归参数需要传入startIndex,表示下一轮递归遍历的起始位置,这个startIndex就是切割线。原创 2023-08-07 22:44:49 · 54 阅读 · 0 评论 -
代码随想录算法训练营 day25| 216.组合总和III 、17.电话号码的字母组合
图中可以看出遍历的深度,就是输入"23"的长度,而叶子节点就是我们要收集的结果,输出["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]。其实这里sum这个参数也可以省略,每次targetSum减去选取的元素数值,然后判断如果targetSum为0了,说明收集到符合条件的结果了。例如 k = 2,n = 4的话,就是在集合[1,2,3,4,5,6,7,8,9]中求 k(个数) = 2, n(和) = 4的组合。结果其实就是一条根节点到叶子节点的路径。原创 2023-08-07 21:49:36 · 90 阅读 · 0 评论 -
代码随想录算法训练营 day24 | 回溯算法理论基础、77. 组合
回溯法也可以叫做回溯搜索法,它是一种搜索的方式。回溯是递归的副产品,只要有递归就会有回溯。所以下面,回溯函数也就是递归函数,指的都是一个函数。原创 2023-08-04 18:00:40 · 128 阅读 · 1 评论 -
代码随想录算法训练营 day23|669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树
目录一、(leetcode 669)修剪二叉搜索树二、(leetcode 108)将有序数组转换为二叉搜索树三、(leetcode 538)把二叉搜索树转换为累加树四、二叉树完整总结 力扣题目链接错误想法:遇到 的时候直接return NULL然而[1, 3]区间在二叉搜索树的中不是单纯的节点3和左孩子节点0决定的,还要考虑节点0的右子树重新关注一下上面的示例,如图:所以以上的代码是不可行的!从图中可以看出需要重构二叉树在上图中发现节点0并不符合区间要求,那么将节点0的右孩子 节点2 直接赋给节点3的左孩原创 2023-08-03 14:27:48 · 53 阅读 · 0 评论 -
代码随想录算法训练营 day22| 235. 二叉搜索树的最近公共祖先 、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点
剩下的情况,就是cur节点在区间(p->val <= cur->val && cur->val <= q->val)或者 (q->val <= cur->val && cur->val <= p->val)中,那么cur就是最近公共祖先了,直接返回cur。将删除节点(元素7)的左孩子放到删除节点(元素7)的右子树的最左面节点(元素8)的左孩子上,就是把5为根节点的子树移到了8的左孩子的位置。递归函数不用返回值也可以,找到插入的节点位置,直接让其父节点指向插入节点,结束递归,也是可以的。原创 2023-08-02 22:23:13 · 73 阅读 · 0 评论 -
代码随想录算法训练营 day21| 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先
如果 root == q,或者 root == p,说明找到 q p ,则将其返回,这个返回值,后面在中节点的处理过程中会用到,那么中节点的处理逻辑,下面讲解。但我们还要返回最近公共节点,可以利用上题目中返回值是TreeNode * ,那么如果遇到p或者q,就把q或者p返回,返回值不为空,就说明找到了q或者p。判断逻辑是 如果递归遍历遇到q,就将q返回,遇到p 就将p返回,那么如果 左右子树的返回值都不为空,说明此时的中节点,一定是q 和p 的最近祖先。原创 2023-08-02 21:43:18 · 68 阅读 · 0 评论 -
代码随想录算法训练营day20| 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树
因为是传入了两个树,那么就有两个树遍历的节点t1 和 t2,如果t1 == NULL 了,两个树合并就应该是 t2 了(如果t2也为NULL也无所谓,合并之后就是NULL)。题目中说输入的数组大小一定是大于等于1的,所以不用考虑小于1的情况,那么当递归遍历的时候,如果传入的数组大小为1,说明遍历到了叶子节点了。其实本题同样,在寻找一个不符合条件的节点,如果没有找到这个节点就遍历了整个树,如果找到不符合的节点了,立刻返回。参数传入的是存放元素的数组,返回该数组构造的二叉树的头结点,返回类型是指向节点的指针。原创 2023-08-01 23:07:47 · 34 阅读 · 1 评论 -
代码随想录算法训练营 day18| 513.找树左下角的值、112. 路径总和、113.路径总和ii、106.从中序与后序遍历序列构造二叉树、105.从前序与中序遍历序列构造二叉树
那么如何找最左边的呢?可以使用前序遍历(当然中序,后序都可以,因为本题没有 中间节点的处理逻辑,只要左优先就行),保证优先左边搜索,然后记录深度最大的叶子节点,此时就是树的最后一行最左边的值。后序数组的最后一个元素为切割点,先切中序数组,根据中序数组,反过来再切后序数组。中序数组我们都切成了左中序数组和右中序数组了,那么后序数组就可以按照左中序数组的大小来切割,切成左后序数组和右后序数组。首先要切割中序数组,原因是切割点在后序数组的最后一个元素,就是用这个元素来切割中序数组的,所以必要先切割中序数组。原创 2023-08-01 22:30:20 · 52 阅读 · 1 评论 -
代码随想录算法训练营 day17| 110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和
注意,只有当前遍历的节点是父节点,才能判断其子节点是不是左叶子。此时递归的函数就已经写出来了,这个递归的函数传入节点指针,返回以该节点为根节点的二叉树的高度,如果不是二叉平衡树,则返回-1。当遇到左叶子节点的时候,记录数值,然后通过递归求取左子树左叶子之和,和 右子树左叶子之和,相加便是整个树的左叶子之和。此时还没完,递归完,要做回溯啊,因为path 不能一直加入节点,它还要删节点,然后才能加入新的节点。判断一个树的左叶子节点之和,那么一定要传入树的根节点,递归函数的返回值为数值之和,所以为int。原创 2023-07-31 21:36:25 · 35 阅读 · 1 评论 -
代码随想录算法训练营 day16| 104.二叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数
3)确定单层递归的逻辑:先求它的左子树的深度,再求右子树的深度,最后取左右深度最大的数值 再+1 (加1是因为算上当前中间节点)就是目前节点为根节点的树的深度。3)确定单层递归的逻辑:先求它的左子树的节点数量,再求右子树的节点数量,最后取总和再加一 (加1是因为算上当前中间节点)就是目前节点为根节点的节点数量。反之,右子树为空,左子树不为空,最小深度是 1 + 左子树的深度。1)确定递归函数的参数和返回值:参数就是传入树的根节点,返回就返回以该节点为根节点二叉树的节点数量,所以返回值为int类型。原创 2023-07-31 20:09:17 · 57 阅读 · 1 评论 -
代码随想录算法训练营 day15 | 二叉树层序遍历、226.翻转二叉树、101. 对称二叉树
这个迭代法,其实是把左右两个子树要比较的元素顺序放进一个容器,然后成对成对的取出来进行比较,那么其实使用栈也是可以的,只要把队列原封不动的改成栈就可以了。注意上面最后一种情况,我没有使用else,而是else if, 因为我们把以上情况都排除之后,剩下的就是 左右节点都不为空,且数值相同的情况。因为我们要比较的是根节点的两个子树是否是相互翻转的,进而判断这个树是不是对称树,所以要比较的是两个树,参数自然也是左子树节点和右子树节点。遍历的过程中去翻转每一个节点的左右孩子就可以达到整体翻转的效果。原创 2023-07-31 17:36:45 · 134 阅读 · 0 评论 -
代码随想录算法训练营 day14| 二叉树理论基础、递归遍历、迭代遍历、统一迭代
刚刚我们说过了二叉树有两种存储方式顺序存储,和链式存储,顺序存储就是用数组来存,这个定义没啥可说的,我们来看看链式存储的二叉树节点的定义方式。int val;原创 2023-07-29 21:44:16 · 68 阅读 · 0 评论 -
代码随想录算法训练营 day13 | 239. 滑动窗口最大值 、347. 前K个高频元素
其实就是一个披着队列外衣的堆,因为优先级队列对外接口只是从队头取元素,从队尾添加元素,再无其他取元素的方式,看起来就是一个队列。而且优先级队列内部元素是自动依照元素的权值排列。那么它是如何有序排列的呢?缺省情况下priority_queue利用max-heap(大顶堆)完成对元素的排序,这个大顶堆是以vector为表现形式的complete binary tree(完全二叉树)。堆是一棵完全二叉树,树中每个结点的值都不小于(或不大于)其左右孩子的值。原创 2023-07-26 22:34:21 · 94 阅读 · 1 评论 -
代码随想录算法训练营day11 | 20. 有效的括号、1047. 删除字符串中的所有相邻重复项 、150. 逆波兰表达式求值
第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号return false。第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false。第二种情况:遍历字符串匹配的过程中,发现栈里没有要匹配的字符。平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 )。该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * )。b.括号没有多余,但是 括号的类型没有匹配上。原创 2023-07-25 22:53:10 · 51 阅读 · 0 评论 -
代码随想录算法训练营day10 | 栈与队列理论基础、232.用栈实现队列、225. 用队列实现栈
HP STL 其他版本的C++ STL,一般是以HP STL为蓝本实现出来的,HP STL是C++ STL的第一个实现版本,而且开放源代码。如图,栈的内部结构,栈的底层实现可以是vector,deque,list 都是可以的, 主要就是数组和链表的底层实现。,把que1最后面的元素以外的元素都备份到que2,然后弹出最后面的元素,再把其他元素从que2导回que1。在push数据的时候,只要数据放进输入栈就好,但在pop的时候,操作就复杂一些,输出栈如果为空,就把进栈数据。原创 2023-07-24 22:47:41 · 68 阅读 · 0 评论 -
代码随想录算法训练营day8 | 344.反转字符串,541. 反转字符串II,剑指Offer 05.替换空格,151.翻转字符串里的单词,剑指Offer58-II.左旋转字符串
在遍历字符串的过程中,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。在C++中,提供一个string类,string类会提供 size接口,可以用来判断string类字符串是否结束,就不用'\0'来判断是否结束。其实在基本操作上没有区别,但是 string提供更多的字符串处理的相关接口,例如string 重载了+,而vector却没有。定义两个指针(也可以说是索引下标),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。原创 2023-07-24 16:38:41 · 55 阅读 · 0 评论 -
代码随想录算法训练营day7| 454.四数相加II 、383. 赎金信 、15. 三数之和、18. 四数之和
四数之和的双指针解法是两层for循环nums[k] + nums[i]为确定值,依然是循环内有left和right下标作为双指针,找出nums[k] + nums[i] + nums[left] + nums[right] == target的情况,三数之和的时间复杂度是O(n^2),四数之和的时间复杂度是O(n^3)。这道题目是四个独立的数组,只要找到A[i] + B[j] + C[k] + D[l] = 0就可以,不用考虑有重复的四个元素相加等于0的情况(相对独立,不用去重)原创 2023-07-23 22:38:08 · 65 阅读 · 0 评论 -
代码随想录算法训练营day6| 哈希表理论基础、242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和
std::unordered_set底层实现为哈希表,std::set 和std::multiset 的底层实现是红黑树,红黑树是一种平衡二叉搜索树,所以key值是有序的,但key不可以修改,改动key值会导致整棵树的错乱,所以只能删除和增加。在遍历数组的时候,只需要向map去查询是否有和目前遍历元素匹配的数值,如果有,就找到的匹配对,如果没有,就把目前遍历的元素放进map中,因为map存放的就是我们访问过的元素。这道题 我们需要给出一个元素,判断这个元素是否出现过,如果出现过,返回这个元素的下标。原创 2023-07-22 22:32:09 · 54 阅读 · 0 评论 -
代码随想录算法训练营day2 | 977.有序数组的平方 、209.长度最小的子数组、59.螺旋矩阵II
在于根据当前子序列和大小的情况,不断调节子序列的起始位置。从而将O(n^2)暴力解法降为O(n)。——>如果只用一个for循环来表示 滑动窗口的起始位置,那么如何遍历剩下的终止位置?定义一个新数组result,和A数组一样的大小,让k指向result数组终止位置。如果用一个for循环,那么应该表示 滑动窗口的起始位置,还是终止位置?:要么从头到尾左闭右开,要么从头到尾左开右闭,确定好,不要总改,会乱。每一种颜色,代表一条边,拐角处让给新的一条边来继续画。s=7, 数组是 [2,3,1,2,4,3]原创 2023-07-13 22:24:35 · 602 阅读 · 1 评论 -
代码随想录算法训练营day4| 24. 两两交换链表中的节点 、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II
删掉slow所指向的节点就可以了(个人想法:fast走了n步,距离末尾l-n步,slow走l-n,则距离末尾n步,符合要求)分别定义 fast 和 slow 指针,从头结点出发,fast指针每次移动两个节点,slow指针每次移动一个节点,如果 fast 和 slow指针在途中相遇 ,说明这个链表有环。和n为1的时候 效果是一样的,一样可以通过这个方法找到 环形的入口节点,只不过,index1 指针在环里 多转了(n-1)圈,然后再遇到index2,相遇点依然是环形的入口节点。否则循环退出返回空指针。原创 2023-07-17 20:39:06 · 97 阅读 · 1 评论 -
代码随想录算法训练营day3| 203.移除链表元素 ,707.设计链表,206.反转链表
链表:链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)链表的入口节点称为链表的头结点也就是head(如下图)链表节点定义// 单链表int val;// 节点上存储的元素// 指向下一个节点的指针ListNode(int x) : val(x), next(NULL) {} // 节点的构造函数通过自己定义构造函数初始化节点使用默认构造函数初始化节点。原创 2023-07-17 14:11:38 · 116 阅读 · 1 评论