![](https://img-blog.csdnimg.cn/direct/eda2d4a94f48497b804fd6b704f1eba7.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法--学习笔记
文章平均质量分 90
基于acwing算法基础课的算法笔记
爱写文章的汉堡包
这个作者很懒,什么都没留下…
展开
-
【第二十五课】动态规划:数字三角形(acwing-898 / 蓝桥官网503 / c++代码)
它表示一个很大的数,添上负号就表示一个很小的负数。原创 2024-04-27 22:04:05 · 1103 阅读 · 0 评论 -
【第二十五课】动态规划:多重背包和分组背包(acwing-4,5,9 /思路 / c++代码)
在看多重背包和分组背包之前,要先有01背包和完全背包基础哦。指路👇。原创 2024-03-03 11:37:58 · 900 阅读 · 0 评论 -
【第二十五课】动态规划:完全背包问题(acwing-3 / 公式推导 / 思路理解 / 优化 / c++代码)
在开始看完全背包问题之前,可能需要先了解01背包及其解决办法。指路👇。原创 2024-03-02 19:14:40 · 882 阅读 · 0 评论 -
【第二十五课】动态规划:01背包问题(acwing-2 / 思路 / 含一维数组优化 / c++代码)
反正受到外界干扰够多了,看着"动态规划""背包"这些标题都觉得发怵。。。好好学吧动态规划(Dynamic Programming, DP)是一种解决优化问题的算法思想,常用于求解最优化问题,我们这里主要学习的就是解决背包问题。(关于为什么叫动态规划,就只是个命名而已不用纠结)背包问题就是给定一个容量为V,给出N件物品,每件物品有其体积和价值,让我们得出一种解决方案使得在满足背包容量V的前提下,这些选出的物品的总价值能达到最大。而背包问题又按可选择的物品的次数分为。原创 2024-02-27 21:25:23 · 828 阅读 · 0 评论 -
【第二十四课】二分图:acwing-860染色法判定二分图 / acwing-861二分图的最大匹配 ( c++代码 )
我这里按照图中说一下:比如1号点最开始应该直接匹配的是4号点,但是在对3号点进行匹配的时候,我们发现3号点只能与1号点匹配,于是我们就想让1号点再找找有没有其他可以选择的(3号点只有1号,只好让1号点变一变啦),发现1号点还可以与6号点匹配,那这样就皆大欢喜啦,我们多了一个匹配数。,由于环的长度是奇数,环的最后一个节点又必须与环的起始节点相连,且它们属于同一个集合,这与二分图的定义相矛盾。3-c作为染色,是因为我们这里用1 2分别表示染成的两种不同的颜色,而3-c刚好能够得到与前一个点的c不同的颜色。原创 2024-02-16 19:04:24 · 828 阅读 · 0 评论 -
【第二十三课】最小生成树:prime 和 kruskal 算法(acwing858,859 / c++代码 )
之前学最短路的时候,我们都是以有向图为基础的,当时我们提到如果是无向图,只要记得两个顶点处都要加边就好了。而在最小生成树的问题中,我们所面临的大多都是无向图。这个姐姐👇对这两种算法的讲解非常清晰,没有代码部分,但是对于理解这两种算法的做法很有帮助,推荐看一下。【数据结构 图 最小生成树 Prime和Kruskal算法】截取自视频。感觉总结的很好,就搬过来啦(侵删)原创 2024-02-09 15:57:53 · 1055 阅读 · 0 评论 -
【第二十二课】最短路:多源最短路floyd算法(acwing-852 spfa判断是否存在负环 / acwing-854 / c++代码)
抽屉原理是一个基本的组合数学原理,简单来说就是:如果有n个抽屉和n+1个物品,那么至少有一个抽屉里会有两个或更多的物品。图中左边表示求最短路的函数 右边是判断是否存在负环的代码。如果cnt[j]大于等于节点的总数n,那么说明至少有一个节点被访问了两次,这意味着存在一个环。,检查是否存在一条路径通过这个中间节点可以使得某对节点之间的距离更短。,因此我们对于每个节点对的遍历要经过n次。内层的两个循环的作用就是遍历所有顶点对。有问题欢迎指出,一起加油!好啦,最短路问题也算是写完了。下面是bing的解释。原创 2024-02-03 18:31:53 · 610 阅读 · 0 评论 -
【第二十二课】最短路:bellman_ford / spfa算法 (acwing-851 / acwing-853 / c++代码)
由于权重可以表示不同的度量,例如距离、时间、费用等,具体取决于问题的背景,因此会存在一些权值为负数的题目。也就是存在负权边的最短路问题。dijkstra算法由于每次都选择当前最短路径的节点进行扩展,并不能解决带有负权值的最短路问题。会存在如下图这样的问题根据dijkstra的算法思路,我们会先确定A->C的最短路径是1,但其实,A可以先到B再到C ,这样最短距离是-2.于是有了bellman_ford算法和SPFA算法专门解决有负权值的最短路问题。原创 2024-02-03 12:56:00 · 984 阅读 · 0 评论 -
【第二十二课】最短路:dijkstra算法 ( acwing849 / acwing850 / c++ 代码)
就是指:只求是指:要这些情况对应有不同的算法,这次先介绍dijkstra算法的两种。原创 2024-02-01 17:01:51 · 1030 阅读 · 0 评论 -
【第二十一课】拓扑序列bfs (acwing-848有向图的拓扑序列 / c++代码 )
关于拓扑排序有几点:1.拓扑序列中,每条有向边都是从序列中前面的顶点指向后面的顶点。2.有向无环图(DAG)一定有拓扑序列。存在环的图一定没有拓扑序列,因为环必定有从后面的点指向前面的点的边。3.一个有向无环图一定至少有一个入度为0的点。4.拓扑排序有多种可能的序列,因为图中可能存在多个入度为零的顶点,而这些顶点可以以任意顺序加入拓扑序列。如何求拓扑排序?(刚死去的数据结构知识来攻击我了hh下面这个视频讲了求拓扑排序的方法,推荐看......重复该操作。而我们代码实现就是,用队列模拟这个过程。原创 2024-01-30 18:16:19 · 371 阅读 · 0 评论 -
【第二十课】树和图的深度/宽度优先遍历(acwing-846树的重心 / acwing-847图中点的层次 / c++代码)
我们。原创 2024-01-30 12:09:16 · 991 阅读 · 0 评论 -
【第十九课】BFS:广度优先搜索 (acwing-844走迷宫 / 含过程演示的视频推荐 / c++代码)
关于这种类型的题,我是有点印象的。。。当时蓝桥杯校内选拔就有这种题,当时还没学算法hhh。原创 2024-01-29 16:28:50 · 907 阅读 · 0 评论 -
【第十八课】DFS:深度优先搜索( acwing-843 n-皇后问题 / 两种搜索思路 / c++代码 )
错误写法(可跳看到这道题,我想这不还是n个数的全排列的问题么?也就是把数字变成了字符,一些输出格式上的变化。于是就在原有代码上修改一下应该就行。我的思路就还是path存有可能的排序路径,但是输出的时候要输出字符,且为棋盘格的二维数组形式,因此添加了两层for循环嵌套,并用if语句判断 path[i]==j ,说明此处放皇后Q,符合输出格式。代码这里错误的原因在于,我通过在得到一种答案输出之前,判断相邻两个皇后的数字相差不能是1或-1,也就是限制了相邻两个皇后的位置不能是对角线或者副对角线的关系。原创 2024-01-28 12:58:41 · 921 阅读 · 0 评论 -
【第十八课】DFS:深度优先搜索(acwing-842排列数字 / c++代码 )
这道题让我们用数学来解,应该很容易写出来就像这样分叉,得到不同方案。用代码实现就要讲到我们今天要学的DFS深度优先搜素。原创 2024-01-27 17:54:01 · 446 阅读 · 0 评论 -
【第十七课】c++常用的STL容器
上篇vector指路👇。原创 2024-01-27 13:14:54 · 1046 阅读 · 0 评论 -
【第十七课】STL容器:vector
在前面学习的过程中,其实vector用的还是挺多的。我们所使用到的vector最主要的功能就是,利用vector创建动态数组,也就是可以不提前规定数组的大小, 系统自动根据我们所使用的空间来动态的管理我们数组的大小。vector实现动态数组的原理是:倍增。也就是我们vector类型的数组,当当前空间不够用的时候,就会直接创建一个空间大小是原来2倍的数组,将原来空间里的元素复制到新的数组中。关于当前空间的说法,是否与我们所说的“vector可以不提前规定数组的大小”存在冲突呢?答案是不会的。原创 2024-01-26 21:23:18 · 1121 阅读 · 0 评论 -
【第十六课】哈希表(acwing-840模拟散列表 / 拉链法 / 开放寻址法 / c++代码 )
我对哈希表的印象就是:感觉可以类比数组,像数组的下标和该下标所对的元素之间的关系一样,就是比如ha[0]=1,那么我下标为0所对应的元素就是1,就是这样一种映射关系。只是哈希表所解决的是更复杂一些点、具有某种复杂的函数关系的映射。另外感觉直接连想起来了关于离散化的知识,其实当时写那道题的时候就感觉也是类似哈希表的这种映射,只是当时还没学到hh。离散化:acwing-802区间和这里也提出了离散化是一种特殊的哈希表,它特殊的地方就在于。原创 2024-01-24 19:39:38 · 1056 阅读 · 0 评论 -
【第十六课】哈希表(acwing-841字符串哈希 / 详解 / 优秀的文章推荐 / c++代码)
字符串的哈希核心思想是:我们把字符串当做一个P进制的数,有点像通过前缀和的思想得到两段字符串的哈希值,在判断两段字符串所映射的哈希值是否相同即可。我们当然可以定义一个特别大的数据类型来避免溢出,只是再大也会有超限的时候,因此要完成取模工作,关于对谁取模,这里又是一个经验值,一般是2^64,而。求每个前缀字符串的哈希值的方法明白了之后,我们就要想,求的时候一直在乘次方,将会导致这个映射的数特别大,也就是。咳咳,感觉这个刚开始第一遍接触的时候很抽象,,,还好网友们很强,有很通俗的解释办法hh。原创 2024-01-25 18:05:54 · 1202 阅读 · 0 评论 -
【第十五课】数据结构:堆(acwing-839模拟堆 / ph和hp数组的映射关系 /c++代码 )
上篇已经详细解释过堆的内容,需要可以回顾一下。这里关注这道题提出几个注意点。原创 2024-01-24 12:35:45 · 505 阅读 · 0 评论 -
【第十五课】数据结构:堆 (“堆”的介绍+主要操作 / acwing-838堆排序 / 时间复杂度的分析 / c++代码 )
但是我们要删的是第一个元素呀,怎么办呢?我们。原创 2024-01-23 18:38:46 · 1131 阅读 · 0 评论 -
【第十四课】并查集(acwing-837连通块中点的数量 / c++代码 / 思路详解)
这是因为在C++中,原创 2024-01-23 11:55:17 · 930 阅读 · 0 评论 -
【第十四课】并查集(acwing-836合并集合 / 做题思路 /c++代码)
利用这种方式来实现我们的M和Q操作:M操作就是利用while循环找到两个元素所在树的树根 (判断方式是p[x]==x,我们规定根节点的父节点为其自己),然后将其中一个的p[x]指向另一个元素的父节点即可,也就是。2.1×10^9,而二维数组元素最多有10^10,从这方面来讲也是不可行的( 在64位系统中,最多可有9.2*10^18,不存在该问题)。由于我们的优化是,寻找其中一个节点的根节点,那么每次都会不断地向上搜索,而这中间搜索到的节点,也就是。其根节点都是该元素的根节点,都直接赋值为最终的结果。原创 2024-01-16 13:06:31 · 926 阅读 · 0 评论 -
【第十三课】Trie字符串统计(acwing-835 / 二维数组的含义 / c++代码)
Trie树在我们之前学习树的时候简单提过一嘴。Trie树也称为前缀树或字典树,是一种用于高效存储和查找字符串的数据结构。Trie树的主要思想是利用字符串之间的公共前缀来节省存储空间,提高查询效率。:Trie树中的每个节点代表一个字符串,这个字符串是的。:如果两个字符串有公共的前缀,那么它们在Trie树中的路径会有公共的部分。这样可以,从而节省空间。:Trie树中的每条边都对应一个字符。。就像图片中这样。原创 2023-12-29 18:20:49 · 426 阅读 · 0 评论 -
【第十二课】KMP算法(acwing-831 / c++代码 / 思路 / 视频+博客讲解推荐)
进行了详细的阐释。原创 2023-12-28 21:58:07 · 1600 阅读 · 0 评论 -
【第十一课】数组模拟栈和队列 / 单调栈 / 单调队列(滑动窗口) (c++代码 / 思路 )(acwing-828,829,830,154)
这个数组模拟栈和队列的实现比较简单,我们之前也学过数据结构的内容,比较好实现,就不再多说了。原创 2023-12-20 18:44:45 · 880 阅读 · 0 评论 -
【第十课】区间和并(acwing-803 / c++代码 / 思路 )
这道题直接说算法思路了。原创 2023-12-13 18:14:57 · 66 阅读 · 0 评论 -
【第九课】离散化(acwing-802区间和 / c++代码 / 思路超详解 )
其主要思想就是:当数值可取范围特别大(导致我们没办法开数组,会超限),但是我们实际操作的、用上的位置很少、很稀疏,这时候我们就要采用离散化的方法,把使用到的位置的值存放到一个下标从0或者从1开始的数组里面。a和s数组最多位数也就只到alls的最多位,且每位元素与alls的下标一一对应也是连续存储的,但是我们a和s数组定义的大小非常大,预分配了更多的空间以处理可能的最大坐标值,所以我们。在实际操作中,我们只会处理到alls数组的大小的位置,因为这就是所有可能的坐标值的数量。想要复习的可以看之前的文章。原创 2023-12-12 17:55:33 · 206 阅读 · 2 评论 -
【第八课】位运算(acwing-801二进制中1的个数 / 进制转换 / lowbit(x) / 思路详解 /c++代码)
数字逻辑课程里有很多包括其他进制之间的各种转换.(b站期末速成课里讲的很清楚hhh)这里附上相关章节的课程链接,有需要的朋友自取啦~(从第一课时开始前后几个视频都是讲进制转换哒)对啦,里面也包含。我们将二进制数与 1 进行与操作,1 的二进制表示只有最有一个数字是 1 ,前面可以按照该二进制数的位数进行补零。那 1 的二进制数前面都是 0 ,与出来肯定也都是 0 ,所以我们说。位运算符,如位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)和右移(>>),都是直接对整数的二进制位进行操作。原创 2023-12-10 22:18:35 · 65 阅读 · 0 评论 -
整数二分习题:力扣-35,69(c++代码 含思路详解)
由于 l 和 r 的初始值都小于等于x,且x<=2^31-1,因此 l+r+1 的最大值为2^31 - 1 + 2^31 - 1 + 1 = 2^32 - 1,应该用。读完题之后,我们发现这是一个查找目标值的题,和之前写过的力扣704这道题不同的就是,多增加了一个要求:就是如果数组中不存在目标值,就把目标值按顺序应该在数组中的插入的位置作为答案输出。你可能会问为什么不能表述成模板一的说法来求解:如果换成求第一个平方之后>=8的数,那么得到的结果应该是3啊,与我们想要的不同,所以不能使用模板一。原创 2023-07-18 14:50:16 · 105 阅读 · 1 评论 -
【第一课】前缀和
在这段代码主函数中并列for循环,且循环执行n+m次,此时是时间复杂度为O(n+m),但最后输出的时候,调用Sum函数中存在for循环,可理解为循环的嵌套,在Sum函数中,for循环执行次数为r-l+1,由于r和l是由输入决定的,我们不能确定它们的具体值,所以只能用最坏情况来估计时间复杂度。当我们想要得到从第一个元素到第三个元素的和时,应该是q[3]-q[0]=6-0 从第二个元素到第四个元素的和时,应该是q[4]-q[1]=16-3 由此可以看出。主要是q[i],要明白它所表示的含义是,原创 2023-06-26 16:08:00 · 69 阅读 · 0 评论 -
【第四课】冒泡排序,快速排序(acwing-785)(含思路详解)!!!
黄色表示重点紫色表疑问。原创 2023-07-19 22:52:01 · 127 阅读 · 1 评论 -
前缀和习题 :游戏之神,最大矩阵和,激光炸弹
题目中说地图,先想到了二维数组,有N个目标,N是我们给的炸弹个数,也是防炸弹的次数,后面给出的(x,y)是我们决定把炸弹放在那个位置, 放上去之后这个位置就具有了从0到+w的价值,当输入与上次相同的(x,y)坐标时,该点价值累加,对应题目中。,可以想到在地图中初始每个位置都是0,经过输入坐标确定w的值使每个位置的价值不同,而题目要求的就是规定一个半径R,在R*R的矩阵中,区域内价值和最多的即为所求区域。逐句来看,给我n个非负整数,说明要有数组来存放他们,提出q个问题,即q个询问,。原创 2023-06-28 19:55:45 · 102 阅读 · 1 评论 -
【第三课】二分查找:力扣704(基础)
学姐有事不能带我们了wuwuwu。那接下来的我就根据acwing目录学吧。还是老样子,通过例题学习知识点。嗯,写完了才发现有acwing二分模板也能够解决这个问题,而且好像是二分模板里很好的,我在学习学习在关于那个的博客。如果是想看那个的止步于此吧哈哈哈等我之后更新(老实巴交)原创 2023-07-13 22:05:22 · 81 阅读 · 1 评论 -
差分习题:小明的彩灯,牛妹吃豆子(c++实现,含思路,数据范围,定义数组个数 详解)
在这里可能要好好区分一下什么时候是定义一个数组就可以,什么时候必须定义两个数组(是我需要hhh)。当需要对初始化为0的数组中某个区域内的值进行相同操作时,只需开辟一个数组;当需要对数组中的单个点进行操作的时候,就需要开辟两个数组解释如下。差分数组只能表示相邻元素之间的差值,而无法表示单个元素的值。当数组初始化为0时,想要实现对某个区域内的值做相同的改变,我们可以只使用差分数组来解决,不需要开辟原数组。我们可以建立一个差分数组q,其中q[i]表示q[i]与p[i-1]之间的差值。原创 2023-07-04 23:39:33 · 178 阅读 · 0 评论 -
整数二分习题:力扣-34(c++代码,含函数返回数组的方法详解)
嗯,就用黄底加粗表示重点绿底表示并列的不同方法亮蓝表示毒鸡汤吧暂时hhh佳文推荐用好看的蓝色把欢迎食用哦力扣34-在排序数组中查找元素的第一个和最后一个位置。原创 2023-07-16 22:53:46 · 146 阅读 · 1 评论 -
【第二课】差分
利用前缀和推出原数组只需更改原数组中的一个值 即可实现对前缀和数组中给定区间内所有元素值的更改原创 2023-07-03 19:06:55 · 65 阅读 · 1 评论 -
【第三课】浮点二分(acwing-790 c++代码 含思路详解)
提示:黄色背景表示重点。橙色背景表示步骤。嗯,在学过整数二分之后,这里其实想了怎样通过二分的方法实现,emm,但是因为还不太熟练,不知道怎么表示这道题里所需要的性质,以及在想三次方怎么通过二分优化......额,没转过来弯,所以又用了遍历......(小声,不敢抬头)然后写了一堆bug(微笑)原创 2023-07-15 08:46:54 · 80 阅读 · 1 评论 -
【第三课】整数二分(acwing-789-含思路详解,死循环问题,while循环出口问题)
做了力扣704的二分发现有acwing更全面的模板之后,趁热打铁,把这个学了。看到这道题,本想用力扣704那道题的解法,即,首先通过二分找到目标元素,即mid值所对的元素,确定了起始位置,然后再写一个函数计算终止位置,具体实现是,累计目标元素出现的次数,再加上begin的初值也就得到了end的值。根据上面的想法,然后我就兴致冲冲的写了一堆bug,,,在不断的调试代码中,原创 2023-07-14 22:25:34 · 167 阅读 · 1 评论 -
整数二分习题:力扣-367(含思路详解,定义数据类型详解),洛谷-2249
但是,在二分查找过程中,r 的值会不断减小,最终不会超过 46340。,相较浮点数二分,我们要多考虑一点性质的划分条件,这道题进行二分的性质应该是,找到第一个 平方之后的数 小于所给的数(这里是因为,向下取整的原因[下面会详细解释],,如果一个数不是完全平方数,开方之后应该是有小数,但是我们既然是整数二分,那么所得到的数肯定是一个整数,那到底应该怎么判断是不是呢?(稍微提一嘴,我是在vscode上写代码,之后复制到洛谷上的,这样是过不了的,tab键出现问题,嗯,有大佬清楚这个问题的话求指点!原创 2023-07-21 23:10:54 · 121 阅读 · 1 评论 -
【第五课】数据结构:单链表(acwing-826)(数组模拟链表 与 结构体链表的 对照理解,含思路详解,c++实现)
咳咳,嗯,算法学习的顺序有点乱哈,主要是我自己的进度和学姐的进度有些出入,其实第四课排序的,还差个归并排序,等之后在写吧。嗯,刚好最近学了数据结构里的链表,趁热打铁,把算法中的链表相关的也学一下,方便对比hh。原创 2023-08-07 23:21:05 · 333 阅读 · 1 评论