- 博客(49)
- 收藏
- 关注
原创 基础语法——组合与继承
override说明符显式声明了派生类中的一个成员函数重写、覆盖(override)了一个基类中的虚函数。通过关键字virtual将基类的函数声明为虚函数,允许派生类重写(覆盖)该函数。定义派生类,即继承的一般语法结构如下。override说明符。
2024-06-21 20:52:47
235
原创 基础语法——类与对象
如果一个构造函数的第一个参数是自身类类型的引用,且其他参数都有默认值,则此构造函数就是复制构造函数。每一个类中必须要有构造函数,析构函数,复制赋值运算符函数。用已经存在的对象初始化新定义的对象要用复制构造函数。构造函数的名字和类名相同,构造函数没有返回类型。析构函数的名字由"~"+"类名"构成。复制构造函数(拷贝构造函数)4、分配新内存并赋值数据。构造函数与复制构造函数。
2024-06-21 20:51:54
304
原创 基础语法——运算符重载
使用友元函数重载需要传入全部参数,使用成员参数重载要传入所有参数-1。具体用法可以在下文看到。注意输出符重载传的第二个参数要加const ,要保证输出数据不被更改。注意:传虚拟参数int表示该++或--运算符为后置。+、-、+=、-=运算符的重载。载+运算符来实现字符数组的连接。++、--运算符的重载。输入输出运算符的重载。
2024-06-20 14:28:39
272
原创 动态规划——记忆化搜索
发现从上面往下一步步走很麻烦,直接搜索肯定超时,我们可以逆向求解。从倒数第二行开始看,2可以选4和5,因为找最大,所以我们选5,把2加上5更新为7,以此类推,倒数第二行被更新为7,12,10、10。依次更新到第一行,第一行的数字就是答案。acwing901.滑雪。
2024-04-18 20:53:02
290
原创 基础算法——位运算
数字在计算机中以补码形式来储存 - x = ( ~ x + 1)合并起来:n >> k & 1。(2):看个位是几(x & 1)步骤:(1):先把第k位移到最后一位(n >> k)二、lowbit:返回x的最后一位1。如:10101000 返回 1000。一、n的二进制表示中第k位是几。操作:x & - x。
2024-04-11 23:22:19
198
原创 基础算法——二分
当我们将区间[l, r]划分成[l, mid - 1]和[mid, r]时,其更新操作是r = mid - 1或者l = mid;,此时为了防止死循环,计算mid时需要加1。当我们将区间[l, r]划分成[l, mid]和[mid + 1, r]时,其更新操作是r = mid或者l = mid + 1;算法思路:假设目标值在闭区间[l, r]中, 每次将区间长度缩小一半,当l = r时,我们就找到了目标值。也就是说,当看到r = mid时,计算mid不用+1。当看到l = mid时,计算mid需要+1。
2024-04-08 16:39:44
256
原创 动态规划——线性dp
最长严格上升子序列(二分优化)(时间复杂度O(nlogn))最长严格上升子序列 (时间复杂度O(n ^ 2))图片来源:@_snowstorm_二分优化后像贪心的思想。
2024-04-07 21:13:17
308
原创 搜索与图论——拓扑排序
有向无环图一定存在拓扑序列(有向无环图又被称为拓扑图),有向有环图一定不存在拓扑序列。无向图没有拓扑序列。拓扑序列:将一个图排成拓扑序后,所有的边都是从前指向后的。就是图的宽度优先遍历的一个应用。入度为0的点都可以排在最前边。入度:有多少条边指向自己。出度:有多少条边指向别人。
2024-04-04 01:51:43
459
原创 搜索与图论——染色法判定二分图
所以一个二分图一定可以成功被二染色,反之在二染色的过程中出现矛盾的图中一定有奇数环,也就一定不是二分图。由于图中没有奇数环,所以染色过程中一定没有矛盾。一个图是二分图当且仅当这个图中不含奇数环。
2024-03-30 22:25:13
370
原创 搜索与图论——Kruskal算法求最小生成树
kruskal算法相比prim算法思路简单,不用处理边界问题,不用堆优化,所以一般稀疏图都用Kruskal。判断a,b点是否连通以及将点假如集合中需要并查集的知识。每条边存结构体里,排序需要在结构体里重载小于号。Kruskal算法时间复杂度O(mlogm)
2024-03-30 18:01:32
767
原创 基础语法——重载小于号
其中,struct_name是你要重载小于号运算符的结构体或类类型的名称。在重载函数中,你可以根据自己的需要编写适当的比较逻辑,比较对象的某些成员变量或其他属性。重载小于号<运算符常用在结构体和类的对象之间的比较,
2024-03-30 16:43:37
640
原创 搜索与图论——Prim算法求最小生成树
生成树:每一次选中的t点,它和集合的距离对应的那条边,就是生成树的一条边。朴素版prim算法 时间复杂度O(n^2)算法流程和dijkstra算法非常相似。在最小生成树问题里,正边和负边都没问题。
2024-03-29 22:33:23
493
原创 搜索与图论——bellman—ford算法、spfa算法求最短路
spfa的核心优化思路是:拿我更新过的点来更新别人。一个点如果没有被更新过的话,拿它来更新别人一定是没有效果的,只有该点变小了,该点后面的点才会变小。spfa算法可以求出负环用的是抽屉原理,即把多于n+1个的物体放到n个抽屉里,则至少有一个抽屉里的东西不少于两件。在一般情况下,spfa算法都优于bf算法,但遇到最短路的边数有限制的题时,只能用bf算法。spfa算法 时间复杂度一般O(m), 最坏O(nm)代码在spfa求最短路的模板上稍加改动即可。bf算法和dijkstra很像。spfa算法求最短路。
2024-03-29 12:39:17
534
原创 搜索与图论——Dijkstra算法求最短路
的最小距离:dist[j] = min(dist[j],dist[t] + g[t][j]);朴素版dijkstra时间复杂度为O(n^2),对于稠密图可以ac,但遇到稀疏图时会TLE。1、初始时,所有点都在圈内,所有点vis都=0,d[原点]=0,d[其他点]=+∞。m远小于n的平方为稀疏图,m接近n的平方为稠密图。1、初始化,{0,1}入队,d[1] = 0,d[其他点] = max。4、重复第2、3步操作,知道圈内为空。4、重复2、3步操作,直到队列为空。,把{d[j],j}压入队列。
2024-03-27 22:50:55
617
2
原创 基础语法——类、结构体、链表
类和结构体基本一样,唯一的不同就是:如果不声明是private或public,则类默认为private,结构体默认为public。
2024-03-24 00:32:23
120
原创 基础语法——字符串
可变长的字符序列,比字符数组更好用,需引入头文件#include需引用头文件#include字符串的初始化及读入输出。标准库类型string。字符串数组的常用操作。string库中函数。
2024-03-23 23:25:10
139
原创 动态规划——背包问题
此时我们选择逆序遍历max_value[j],因为j是逆序循环,max_value[j]会先于max_value[j - w[i]]更新,也就是说,用旧值max_value[j - w[i]] 去更新max_value[j],相当于上一行(上一个i)的max_value[j - w[i]] 去更新max_value[j],就不会出错。优化空间复杂度前模板 (时间复杂度O(nm),空间复杂度(nm))优化空间复杂度后模板(时间复杂度O(nm),空间复杂度O(m))多重背包问题的二进制优化。
2024-03-19 23:30:03
464
原创 搜索与图论——BFS
实现的,用queue创建一个队列。宽搜的过程,通过队列来维护序列的状态空间,入队就排队等待,出队就扩展儿子们入队。宽搜的过程:从根开始,向下逐层扩展,逐层访问。宽搜适合于边权相同的最短路问题。广度优先搜索(BFS)宽搜的实现:宽搜是通过。
2024-03-10 22:22:06
464
原创 搜索与图论——DFS
因为栈满足先进后出的性质,所以当树的子树被全部搜完后才会回到该树。(后面的BFS使用队列实现的,因为队列满足先进先出的性质,适合于BFS的逐层遍历,这个在BFS文章中会提到。)DFS中递归调用的过程,系统自动通过栈去维护函数的。同理二叉树触碰点的时机分为:先、中、后。系统栈记录函数的返回地址,局部变量,参数传递等。深搜的过程:从根进入,向下走,走到底,向上走,即绕树兜圈,最后从根退出。深搜的计算:触碰节点的时机:1.入 2.下 3.回 4.离。多叉树的DFS简单模板。深搜的实现:深搜是通过。
2024-03-10 12:55:38
493
原创 数据结构——KMP
p[j + 1],让j回跳到能匹配的位置,如果找不到能匹配的位置,j就一直回跳到0。2.如果p[i] == p[j + 1],让j + 1,取模式串最长的相等前后缀可以保证不漏解,通过模式串前后缀的自我匹配的长度,计算next函数,给j指针打一张表,失配时就跳到next[i]的位置继续匹配。2.如果s[i] == p[j + 1],让j + 1。= p[j + 1],让j回跳到能匹配的位置,:i扫描主串,j扫描模式串,初始化 i= 1,j = 0。初始化:ne[1] = 0,i = 2,j = 0。
2024-03-07 19:28:48
430
1
原创 数据结构——哈希表
哈希表的作用:将一堆复杂庞大的数据映射到较小的内存空间中(一般是将1e9的数据映射到N = 1e5或1e6的数组里),手写哈希表一般支持插入、查找。处理冲突的方式:当h(11) = 3,h(21)= 3,即11与21都映射到3上时,就产生了冲突,此时可以在3上拉一条链(即单链表,h(3)为该链表的头节点head)同一条链上元素的插入方式与单链表的头插相同,把head改成h(k)即可。处理冲突的方法:h(k)= x时,看看k处有没有元素,如果没有就放到这里,如果有就看k+1的位置,以此类推往后遍历。
2024-03-07 14:42:47
447
1
原创 数据结构——堆
堆主要支持这五个操作:1、插入一个数 2、求集合中的最小值(小根堆)最大值(大根堆)3、删除最小值 4、删除任意一个元素 5、修改任意一个元素。对父节点使用左右孩子编号法:第n个节点的左孩子是2n,右孩子是2n+1,父节点为n/2。堆可以使用stl库中的priority_queue来实现也可以手写。这五个操作全部可以用up和down函数来实现。完全二叉树(堆)可以用一维数组存储。大根堆:父节点大于子节点。小根堆:父节点小于子节点。
2024-02-26 20:42:39
557
1
原创 数据结构——单调队列
在指针i从左向右遍历的过程中,我们可以用一个队列来保存a数组所有下标(不包括i指向元素),越大的元素越靠近队头,越小的元素越靠近队尾。所以我们每次从队尾开始遍历,当队列不为空且队列元素大于a[i]时,tt --(弹出该元素),直到队头元素小于a[i]时,且把不属于窗口内的队头元素弹出(hh ++ ),输出队头元素,并将a[i]压入队尾。单调队列使用场景较少,一般只用在求滑动窗口与解决求一个数左(右)边第一个小(大)于他的元素(元素的下标)的问题上。使用单调队列优化时间复杂度可以达到O(n)。
2024-02-25 23:03:44
430
原创 数据结构——单调栈
在指针i从左向右遍历的过程中,我们可以用一个栈来保存i左边的所有元素(不包括i指向元素),越大的元素越靠近栈顶,越小的元素越靠近栈底。所以我们每次从栈顶开始遍历,当栈不为空且栈顶元素大于a[i]时,tt --(弹出该元素),直到栈顶元素小于a[i]时,输出栈顶元素,并将a[i]压入栈顶。使用单调栈优化时间复杂度可以达到O(n)。由于每个元素一定会被压入栈且至多弹出一次,因此操作次数至多为2n,故时间复杂度为O(n)。单调栈通常被用来解决求一个数左(右)边第一个小(大)于他的元素(元素的下标)。
2024-02-24 23:45:05
329
1
原创 语法——字符串类型
使用char类型数组表示字符串时,可以使用指针比较来比较字符串的内容,但是需要注意,指针比较的是内存地址使用,所以使用“==”运算符比较时可以出现内容相同但输出结果为false的情况,因为他们的内存地址并不相同。string类型是c++标准库中提供的字符串类型,位于头文件中,提供了丰富的字符串操作函数。使用“==”运算符时,判断的是他们的内容。
2024-02-24 14:39:47
436
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人