自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 关于web_server项目的学习记录(自用)

基础处理框架:Multi-reactormuduo库有三个核心组件实现持续监听reactor的fd:channel;epoll/poller/eventloop类。

2024-03-28 21:41:11 880

原创 STL复习

STL从广义来讲包括了三类:算法,容器和迭代器。算法包括排序,复制等常用算法,以及不同容器特定的算法。容器就是数据的存放形式,包括序列式容器和关联式容器,序列式容器就是list,vector等,关联式容器就是set,map等。迭代器就是在不暴露容器内部结构的情况下对容器的遍历。

2024-03-19 14:38:17 295

原创 C++基础复习自用--vector

用一个空的vector与当前vector进行交换,使用形如vector().swap(v)这样的代码,将v这个vector变量所代表的内存空间与一个空vector进行交换,这样v的内存空间等于被释放掉了,而这个空vector因为是一个临时变量,它在这行代码结束以后,会自动调用vector的析构函数释放动态内存空间,这样,一个vector的动态内存就被迅速的释放掉了。2.vector().swap(vec):清空内容,且释放内存,想得到一个全新的vector。,所以指向原内存的迭代器全部失效。

2024-03-19 11:00:22 913

原创 代码随想录day:二叉树

中序遍历要先访问到最左边的节点,再开始处理节点,然后进行中右节点的访问。(自己调用自己,有终止条件和返回值)(不停循环,利用栈的性质)在迭代中,前序遍历是可以一边访问节点一边处理节点。

2023-12-27 19:40:41 483

原创 代码随想录day:队列与栈

队列和栈都不是容器,而是容器适配器。即他们可以都可以以vector,列表或者对方的容器实现。

2023-11-13 09:39:57 152

原创 代码随想录训练营Day5:哈希数组

在剪枝时,如果targrt<0的话,就不能简单的因为nums[i]>tarfget就剪枝了,负数情况不一样。

2023-11-11 20:32:27 153

原创 代码随想录day4:链表总结

迭代法:发现的规律是,本质上一组同时改变新的节点。重复的是,原来head-》next也就是newhead变成了新的头结点。而且要每次返回交换顺序的头结点给上一组。一开始自己的思路只是两两交换,并没有说涉及到前一个节点。实际上两两交换涉及到了三个节点。使用虚拟头结点,这样一次性处理三个节点。且每次组里第一个节点其实数值没变。

2023-10-29 21:32:16 564

原创 代码随想录训练营day3:链表part1

链表的增删操作时间复杂度O(1),查询时间复杂度O(n),因为要从头结点开始。使用场景和数据完全相反。记得返回的是虚拟头结点的next而不是虚拟头结点return dummyhead。利用虚拟头结点可以同意操作。不然删除头结点需要额外写。链表的储存地址是不连续的。总是忘记判定插入或者删除的位置是否有效。

2023-10-28 12:19:09 778

原创 滑动窗口延申题:最小覆盖子串

这道题的实质是要求s字串的种类和数量必须大于等于t的种类和数量。由上一道接水果的题知道了用哈希表记录出现的种类和数量。

2023-10-28 10:54:51 84

原创 代码随想录:day2数组完结

也是双指针,但是指针是一前一后从前往后走。并且for循环套的一定是窗口结尾的指针。自己本来没有用for循环,但也是双指针移动的。这样一会挪前边,一会挪后边总是有情况照顾不到。做题要灵活些,都忘了使用map存放数组中的元素和出现的次数了。因为数组里有负数,所以双指针其实是开头结尾开始向中间走。同时额外创建了数组承接结果。

2023-10-26 21:44:28 560

原创 代码随想录训练营day1:数组part01

代码可以精简的地方:while不加后边的条件语句,可以省去前边的middle赋值和判断。遇到有序数据寻找元素即可考虑二分法,每次更新左/边界,直接缩小一般搜索范围。把所有情况考虑清楚。区间默认是左闭右开和左闭右闭。时间复杂度也变成O(n)具体区别在代码中解释。

2023-10-26 15:32:26 766

原创 代码随想录训练营总结记录

真没想到自己能坚持下来,毕竟一开始刷三道题要一上午,但是后来逐渐找到适合自己的节奏,前一天晚上看题看讲解,上午到了工位自己写题调试写博客。好像不知不觉就这样坚持下来了。博客还是写的不够详细,希望二刷的时候能多把自己的思考补充进去。一刷其实感觉有点乱,脑子里的总结性东西不多,但是感觉刷题没那么难了,都是有思考套路在的。希望二刷之后能做到心中有数。数组,链表,哈希表,字符串,双指针,栈与队列,二叉树,回溯算法,贪心,动态规划,单调栈。还有没有开始的图论。当对解题思路不理解时,跟着代码在纸上画图对于我来说

2023-10-12 15:54:21 94

原创 代码随想录动day60-63单调栈

如果数组本身就是升序的,例如[2,4,6,8],那么入栈之后 都是单调递减,一直都没有走 情况三 计算结果的哪一步,所以最后输出的就是0了。如果数组本身是降序的,例如 [8,6,4,2],在 8 入栈后,6 开始与8 进行比较,此时我们得到 mid(8),rigt(6),但是得不到 left。本题是要找每个柱子左右两边第一个小于该柱子的柱子,所以从栈头(元素从栈头弹出)到栈底的顺序应该是从大到小的顺序,与接雨水的题相反。这道题是寻找元素右边第一个比自己大的,所以(单调栈从栈头到栈底的)顺序为递增。

2023-10-01 22:16:33 206

原创 代码随想录day59动态规划回文子串

1.布尔类型的dp[i][j] :表示区间范围[i,j] (注意是左闭右闭)的子串是否是回文子串,如果是dp[i][j]为true,否则为false。递归关系,也就是判断一个子字符串(字符串的下表范围[i,j])是否回文,依赖于子字符串(下表范围[i + 1, j - 1] )是否是回文。4.遍历顺序:一定要从下到上,从左到右遍历,这样保证dp[i + 1][j - 1]都是经过计算的。以字符串每一个,或者两个字符为中心像两边扩散看是否是回文串。回文子串是要连续的,回文子序列可不是连续的!

2023-09-30 20:59:18 181

原创 代码随想录day55-58:动态规划子序列问题part1

子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。那么每次更新dp[i]都是在比较结尾nums[i]与前边所有元素的大小。如果比前边大,那么就是dp[j]+1。子序列问题是动态规划解决的经典问题,当前下标i的递增子序列长度,其实和i之前的下表j的子序列长度有关系。解题思路:dp[i]代表以nums[i]结尾的递增子序列长度。

2023-09-29 10:02:07 186

原创 代码随想录day51:动态规划股票最后一周

最要是分析出来有四种状态:买入状态,今天卖出,今天冷冻,卖出状态。卖出的时候考虑有手续费即可。

2023-09-29 09:26:10 119

原创 代码随想录day50:动态规划

3.初始化:dp[0][0]=0;第0天就买入股票dp[0][1]=-price[0];2.递推公式: 第一次持有股票可能是第i天买的或者前一天就持有:dp[i][1] = max(dp[i-1][0] - prices[i], dp[i - 1][1]);第一次卖出股票:dp[i][2] = max(dp[i-1][1] + prices[i], dp[i - 1][2]);第二次持有股票:dp[i][3] = max(dp[i-1][2] - prices[i], dp[i - 1][3]);

2023-09-26 17:50:58 95

原创 代码随想录day49:动态规划part10

dp[i][0] = max(dp[i - 1][0], -prices[i])第i天持有股票可能是前一天就持有股票,也可能是今天刚买的股票。1.dp数组的定义–dp[i][0]表示第i天持有股票所得最多现金,dp[i][1]表示第i天不持有股票所得最多现金。3.dp数组初始化:其基础都是要从dp[0][0]和dp[0][1]推导出来。持有不等于第i天买入。

2023-09-25 18:05:35 162

原创 代码随想录day48动态规划part9打家劫舍系列

这道题目算是树形dp的入门题目,因为是在树上进行状态转移,我们在讲解二叉树的时候说过递归三部曲,那么下面我以递归三部曲为框架,其中融合动规五部曲的内容来进行讲解。用上面基础情况的逻辑写成子函数,数组成环,情况一:包含首不包含尾,包含尾不包含首。

2023-09-24 21:19:19 149

原创 代码随想录day46动态规划part08

2.公式:if(j>=i && dp[i] && worddict.find(dp[j-i])!4.遍历顺序:完全背包内嵌的for循环为正序;这是排列数所以外层背包内层物品。动规五部曲:1.dp[j]单词的前j个长度拆分出的单词是否都在字典里。3.初始化:dp[0]=true;判断一个单词能否用空格拆分为字典里的单词。把多重背包拆成0,1背包。

2023-09-24 20:09:31 60

原创 代码随想录day45:动态规划part07:

用普通的动态规划:dp[i] = dp[i - 1] + dp[i - 2];3.初始化dp[0]=0,dp[i]=INT_MAX求得是最小值,先赋予数组最大值才不会影响后续判断。根本没有被更新,说明硬币怎么凑都无法满足amountcoins = [2], amount = 3。注意:判断数组不要越界,比如,当d[j]=MAX的时候,已经不能往下进行了,加1会越界。示例 1: 输入: 2 输出: 2 解释: 有两种方法可以爬到楼顶。示例 2: 输入: 3 输出: 3 解释: 有三种方法可以爬到楼顶。

2023-09-22 10:25:02 93

原创 代码随想录day44:动态规划part06

如果外层背包容量,内层物品嵌套,背包容量为1时,可以放下物体0,有1种。背包容量为2时,可以放下物品0,1,有两种:1,1和2。背包容量为3时,dp[3]=dp[2]+dp。+(在1里放入2)出现重复。

2023-09-21 11:19:29 115

原创 代码随想录day43:动态规划part05:01背包

494.目标和递推公式的思路–凑成dp[j]就有dp[j - nums[i]] 种方法。例如:dp[j],j 为5,那么凑整dp[5]有多少方法呢,也就是把 所有的 dp[j - nums[i]] 累加起来。474.一和零0,1背包问题,一维数组里边背包容量的遍历一定是倒序,否则会不断同时加入同一个字符串。mn看起来是两维,其实都是容量问题。

2023-09-20 10:34:40 94

原创 代码随想录训练营day42:动态规划part04:01背包

【代码】代码随想录训练营day42:动态规划part04:01背包。

2023-09-19 11:28:53 88

原创 代码随想录day40:动态规划part03

dp[3],就是 元素1为头结点搜索树的数量 + 元素2为头结点搜索树的数量 + 元素3为头结点搜索树的数量。元素1为头结点搜索树的数量 = 右子树有2个元素的搜索树数量 * 左子树有0个元素的搜索树数量;元素2为头结点搜索树的数量 = 右子树有1个元素的搜索树数量 * 左子树有1个元素的搜索树数量;元素3为头结点搜索树的数量 = 右子树有0个元素的搜索树数量 * 左子树有2个元素的搜索树数量;

2023-09-18 10:00:41 83

原创 代码随想录训练营day39:动态规划part2

1.d[i][j]:小机器人从(0,0)出发到达(i,j)会有多少种路径。2.递推公式:d[i][j]=d[i-1][j]+d[i][j-1]3.初始化:d[i][0]=1 d[0][j]=0。4.遍历:从左上到右下。

2023-09-17 20:25:53 33

原创 代码随想录day39:动态规划part2

62.不同路径63.不同路径II342.整数拆分

2023-09-15 11:22:19 129

原创 代码随想录训练营day38:动态规划part1

动态规划五部曲:1.确定dp[i]的含义2.递推公式3.初始化4.遍历顺序5.举例与打印出的dp对比。

2023-09-15 11:06:11 42

原创 代码随想录训练营day37:回溯法part5+总结

那么空节点不能是无覆盖的状态,这样叶子节点就要放摄像头了,空节点也不能是有摄像头的状态,这样叶子节点的父节点就没有必要放摄像头了,而是可以把摄像头放在叶子节点的爷爷节点上。2但是他又没有父节点的状态,所以递归结束之后,还要判断根节点,如果没有覆盖,result++。本质是当相邻位不符合条件时,局部贪心,23-》29,前一位减一,后一位变9,9也的确是最大的。为了让摄像头数量最少,我们要尽量让叶子节点的父节点安装摄像头,这样才能摄像头的数量最少。情况四,根节点可能会处于root->left。

2023-09-14 11:36:41 65

原创 代码随想录训练营day36贪心算法part04

【代码】代码随想录训练营day36贪心算法part04。

2023-09-13 17:12:54 66

原创 代码随想录训练营day35:回溯part5

使用vector是非常费时的,C++中vector(可以理解是一个动态数组,底层是普通数组实现的)如果插入元素大于预先普通数组大小,vector底部会有一个扩容的操作,即申请两倍于原先普通数组的大小,然后把数据拷贝到另一个更大的数组上。所以使用vector(动态数组)来insert,是费时的,插入再拷贝的话,单纯一个插入的操作就是O(n^2 )了,甚至可能拷贝好几次,就不止O(n^2)了。在 std::list 中,只支持双向遍历迭代器,因此不能像 std::vector 那样通过偏移来访问元素。

2023-09-12 14:06:01 87

原创 代码随想录训练营day34:回溯算法part03

首先如果总油量减去总消耗大于等于零那么一定可以跑完一圈,说明 各个站点的加油站 剩油量rest[i]相加一定是大于等于零的.每个加油站的剩余量rest[i]为gas[i] - cost[i].从下标0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到i这里都会断油,那么起始位置从i+1算起,再从0计算curSum。

2023-09-11 11:32:42 81

原创 代码随想录day32:回溯算法part2

解题思路:当走到当前最大距离的时候,再加油,ans++,去更新当前最大距离=nextDistance。题目假设总是可以到达数组的最后一个位置。

2023-09-09 21:16:48 64

原创 代码随想录day31贪心算法part1

【代码】代码随想录day31贪心算法part1。

2023-09-08 15:51:10 99

原创 代码随想录训练营Day31:回溯总结

组合问题:N个数里面按一定规则找出k个数的集合排列问题:N个数按一定规则全排列,有几种排列方式切割问题:一个字符串按一定规则有几种切割方式子集问题:一个N个数的集合里有多少符合条件的子集棋盘问题:N皇后,解数独等等组合问题:n中找k个数的集合:终止条件:path.size()==k 有startindex去重,每次都取下一个,剪枝,i<n-(k-path.size())+1k个数相加等于target,终止条件,if target==0; 剪枝:target-nums[i]&lt

2023-09-07 10:18:45 72

原创 代码随想录训练营day29:回溯法part6

全排列是有序的,所以不需要start index。与之前子集II,组合总和II不同的去重方式。46题+去重,记得先排序。

2023-09-06 11:06:58 82

原创 代码随想录训练营Day28:回溯part4

如果nums[i-1]=nums[i]且nums[i-1]为true,那这是树枝上的【1,2,2】情况。跟之前多种组合问题一样,这道题变成了集合中有重复元素,所以需要used数组,在树层上去重。

2023-09-05 10:44:32 85

原创 代码随想录训练营Day27:回溯法part3

剪枝优化:在终止条件判断的时候,如果target

2023-09-03 13:23:14 102

原创 代码随想录训练营Day25回溯part2

所以这次每次递归遍历的指针index是指向digital第几个字母。for循环中的i遍历的是字母串中对应的字符。遍历的都是同一个集合,但这次第一层是字符串digital,第二层是字母。用键盘打字本身有一个映射,可以用unordered map或者。在map构建时,char是‘ ’,string是“”。这题跟组合题不一样的地方:组合题n叉树。

2023-09-03 10:55:12 44

原创 代码随想录训练营Day24回溯法part1

for循环就是遍历集合区间,可以理解一个节点有多少个孩子,这个for循环就执行多少次。搜索,穷举所有可能,顶多在for循环里做做剪枝,所以该算法效率不高。backtracking这里自己调用自己,实现递归。问题分类:组合、切割、排列、子集、棋盘。回溯是递归的副产品,递归后紧跟着回溯。终止条件,递归参数的确定,递归逻辑。借用组合题,对回溯法进行模板整理。

2023-09-02 10:07:47 71

空空如也

空空如也

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

TA关注的人

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