![](https://img-blog.csdnimg.cn/20190918135101160.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构与算法
算法学习
魏大橙
努力不一定被看见,但休息一定会被看见。
展开
-
AcWing 802. 区间和
假定有一个无限长的数轴,数轴上每个坐标上的数都是 0。现在,我们首先进行 n 次操作,每次操作将某一位置 x 上的数加 c。接下来,进行 m 次询问,每个询问包含两个整数 l 和 r,你需要求出在区间 [l,r] 之间的所有数的和。原创 2024-04-12 21:33:21 · 169 阅读 · 0 评论 -
动态规划(DP)之闫式分析法
以物品数为外层循环来循环容量,即对物品从第一个到最后一个都是进行选与不选操作,通过增加物品,来逐层计算,每层计算都只需调用上一层的计算结果来进行简单计算,避免了底层数据多次计算。原创 2024-03-06 23:42:08 · 1685 阅读 · 0 评论 -
匈牙利算法
增广路径,即当左边集合的点1匹配右边的点2为已匹配时,会找到上一个左边指向该右边已匹配点2的节点3,并尝试将该节点3转向另一个节点4,若果节点4也匹配则重复该操作,如果未匹配则称这条新路径为增广路径。二分图只有偶数环,因为只有偶数环才可以保证成环的条件下还能保证在同一个集合内的环节点没有边存在,而奇数环的出现说明在这个环中至少有两个节点是在同一集合内,并且它们之间还存在边。图中的所有顶点可以分为两个集合,集合内部没有边存在,边只存在于集合之间,即所有边的顶点分别属于不同集合。二分图一定不含有奇数环。原创 2024-03-07 23:20:27 · 445 阅读 · 0 评论 -
染色法
二分图只有偶数环,因为只有偶数环才可以保证成环的条件下还能保证在同一个集合内的环节点没有边存在,而奇数环的出现说明在这个环中至少有两个节点是在同一集合内,并且它们之间还存在边。又称作二部图,是图论中的一种特殊模型。图中的所有顶点可以分为两个集合,集合内部没有边存在,边只存在于集合之间,即所有边的顶点分别属于不同集合。将图中所有的节点都染上颜色1或颜色2,染色规则为相邻节点不能为同一种颜色,即节点 x 若为颜色1则它的相邻节点 y 的颜色为2。二分图一定不含有奇数环。原创 2024-03-06 23:23:09 · 379 阅读 · 0 评论 -
Kruskal算法
主要由排序方法决定,而它的排序方法只与图中边的条数有关,而与图中顶点的个数无关,当使用时间复杂度为O(elog2e)的排序方法时,Kruskal算法的时间复杂度即为O(log2e)是求连通网的最小生成树的另一种方法。与Prim算法不同,它的时间复杂度为O(eloge)(e为图中的边数),所以,适合于求边稀疏的网的最小生成树。:图的顶点个数较多、而边的条数较少时,使用Kruskal算法构造最小生成树效果较好。原创 2024-03-04 22:40:40 · 733 阅读 · 0 评论 -
Prim算法
一开始,选择一个起始点为最初的解集合,并把起始点的所有出边作为参考路径。在参考路径中选择一条距离最短的路径,把该路径的目标点加入集合,删除该路径。再把目标点的所有出边加入到参考路径中,重复选择最短路径并把路径目标点加入集合(当遇到路径目标点已在集合中时,选择删除该路径,重新选择)Prim算法与Dijkstra算法原理类似,但不同的是Prim中比较的点距离为点到解集的距离,而Dijkstra中的距离是该点到源节点1的距离。原创 2024-02-28 15:59:52 · 346 阅读 · 0 评论 -
最短路径算法总结(Dijkstra、Bellman-ford、SPFA和Floyd)
在最短路径算法中,常用的有Dijkstra、Bellman-ford、spfa、Floyd这四大算法Dijkstra:迪克斯特拉算法Bellman-ford:贝尔曼-福特算法SPFA:Shortest Path Faster Algorithm算法Floyd:弗洛伊德算法四大算法介绍简介Dijkstra:是一种用于求解单源最短路径的贪心算法。它从起始节点开始,逐步扩展到其他节点,每次选择当前距离起始节点最近的节点进行扩展。通过不断更新节点的最短距离,最终得到起始节点到其他所有节点的最短路原创 2024-02-25 16:23:59 · 1685 阅读 · 1 评论 -
DFS与BFS
DFS侧重于深度,即在搜索解空间时会搜索到最后一层,当达到最后一层时发现解不可用会返回上层进行另外一个方向的深层搜索。而BFS则是侧重广度,即在搜索时会将该层的所有下一层结果计算出来,然后才进入下一层进行重复操作,类似于层次遍历。BFS:广度优先遍历(Breath First Search)DFS:深度优先遍历(Depth First Search)原创 2024-02-04 22:24:12 · 324 阅读 · 0 评论 -
【数据结构】并查集
其特点是看似不复杂,但数据量极大,使用正常的数据结构会导致占用的空间过大,即使占用空间不成问题,但它的时间复杂度也是极高。在一些有N个元素的集合应用问题中,通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。答:路径压缩,在查询父节点的过程中,当集合中的元素查询过自己的树根后,会将自己以及查询经过元素的父节点都直接指向根节点。根节点的编号就是整个集合的编号,每个节点都存储它的父节点,例:p[x] 代表的是 x 的父节点。原创 2024-03-01 15:48:22 · 376 阅读 · 0 评论 -
滚动数组
在斐波那契数列中,我们要计算第 n 个数为多少时,会申请一个长度为 n 的数组来进行n-2次递推得到结果。而利用滚动数组思想,我们只需要长度为 3 的数组,仍是通过n-2次递推,但会覆盖之前不再利用的计算结果,通过计算、覆盖、计算......来得到我们所需的结果。在某些情况下,某些二维动态规划方程可以直接降阶为一维,甚至有时可以降低时间复杂度。是一种算法优化思想,它通过让数组滚动起来,每次都使用固定的几个存储空间,以达到压缩和节省存储空间的目的,即是一种通过观察动态规划方程来巧妙地降低计算复杂度的思想。原创 2024-03-05 23:28:00 · 378 阅读 · 0 评论 -
模拟队列(数组实现)
push xpopemptyquery现在要对队列进行M个操作,其中的每个操作3和操作4都要输出相应的结果。原创 2024-02-06 16:10:21 · 363 阅读 · 0 评论 -
模拟栈(数组实现)
push xpopemptyquery现在要对栈进行M个操作,其中的每个操作3和操作4都要输出相应的结果。原创 2024-02-06 16:07:39 · 371 阅读 · 0 评论 -
模拟双链表(数组实现)
现在要对该链表进行M次操作,进行完所有操作后,从左到右输出整个链表。:题目中第k个插入的数并不是指当前链表的第k个数。例如操作过程中一共插入了n个数,则按照插入的时间顺序,这n个数依次为:第1个插入的数,第2个插入的数,…第n个插入的数。原创 2024-02-06 16:04:03 · 393 阅读 · 0 评论 -
模拟单链表(数组实现)
现在要对该链表进行 M 次操作,进行完所有操作后,从头到尾输出整个链表。:题目中第 k个插入的数并不是指当前链表的第 k个数。例如操作过程中一共插入了 n个数,则按照插入的时间顺序,这 n个数依次为:第 11 个插入的数,第 22 个插入的数,…第 n个插入的数。第一行包含整数 M,表示操作次数。H xD kI k x共一行,将整个链表从头到尾输出。1≤M≤100000所有操作保证合法。原创 2024-01-26 16:58:39 · 467 阅读 · 0 评论 -
位运算常用的两种操作
取出十进制数转换为二进制后所对应位置的数字n >> k & 1。原创 2024-04-12 00:52:36 · 210 阅读 · 0 评论 -
双指针算法
严格来说,双指针更像是一种思想而不是一种算法,双指针是指在遍历对象时,使用两个指针来进行访问,通常可以分为快慢指针(相同方向)、左右指针(相反方向)和滑动窗口(维护一个区间)将暴力解法的O(n^2)时间复杂度降低到O(n),避免多层循环。思考暴力解法中指针的单调性,通过单调性关系来进行应用。原创 2024-04-11 23:42:16 · 413 阅读 · 0 评论 -
二分查找基本模版
通过不断取中点,重复将一个区域一份为二,使其不断缩小范围直至找到答案。性质/边界,而不是单调性。原创 2024-04-12 19:49:09 · 183 阅读 · 0 评论 -
前缀和与差分
表示从第 1 个数到第 i 个数之和一维前缀和可以很快速的求序列中任意区间的和,而二维前缀和可以快速求一个矩阵中某个子矩阵的和O(n×m),其中预处理 O(n),查询 O(m)在每次输入数据时,构造前缀和数组,求区间 [ l , r ] 和时只需在 Al - Ar。原创 2024-04-08 00:54:05 · 699 阅读 · 0 评论 -
分治思想排序(快速排序、归并排序)
分而治之,即把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。原创 2024-04-07 18:24:59 · 381 阅读 · 0 评论 -
AcWing 790. 数的三次方根
给定一个浮点数 n,求它的三次方根。原创 2024-04-12 19:42:10 · 175 阅读 · 0 评论 -
AcWing 789. 数的范围
给定一个按照升序排列的长度为 n 的整数数组,以及 q 个查询。对于每个查询,返回一个元素 k 的起始位置和终止位置(位置从 0 开始计数)。如果数组中不存在该元素,则返回-1。原创 2024-04-12 17:10:44 · 230 阅读 · 0 评论 -
AcWing 801. 二进制中1的个数
给定一个长度为 n 的数列,请你求出数列中每个数的二进制表示中 11 的个数。原创 2024-04-12 00:38:25 · 228 阅读 · 0 评论 -
AcWing 2816. 判断子序列
给定一个长度为 n 的整数序列 a1,a2,…,an 以及一个长度为 m 的整数序列 b1,b2,…,bm。请你判断 a 序列是否为 b 序列的子序列。子序列指序列的一部分项按而得的序列,例如序列 {a1,a3,a5} 是序列 {a1,a2,a3,a4,a5} 的一个子序列。原创 2024-04-11 23:40:09 · 162 阅读 · 0 评论 -
AcWing800. 数组元素的目标和
给定两个升序排序的有序数组 A 和 B,以及一个目标值 x。数组下标从 00 开始。请你求出满足 A[i]+B[j]=x 的数对 (i,j)。数据保证有唯一解。原创 2024-04-11 22:50:34 · 167 阅读 · 0 评论 -
AcWing 799. 最长连续不重复子序列
给定一个长度为 n 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。原创 2024-04-11 00:35:37 · 194 阅读 · 0 评论 -
AcWing788. 逆序对的数量
给定一个长度为 n 的整数数列,请你计算数列中的逆序对的数量。逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i<j 且 a[i]>a[j],则其为一个逆序对;否则不是。原创 2024-04-09 00:03:34 · 237 阅读 · 0 评论 -
AcWing786. 第k个数
给定一个长度为 n 的整数数列,以及一个整数 k,请用快速选择算法求出数列从小到大排序后的第 k 个数。原创 2024-04-08 23:56:12 · 199 阅读 · 0 评论 -
AcWing798. 差分矩阵
输入一个 n 行 m 列的整数矩阵,再输入 q 个操作,每个操作包含五个整数 x1,y1,x2,y2,c,其中 (x1,y1) 和 (x2,y2) 表示一个子矩阵的左上角坐标和右下角坐标。每个操作都要将选中的子矩阵中的每个元素的值加上 c。请你将进行完所有操作后的矩阵输出。原创 2024-04-08 00:51:34 · 239 阅读 · 0 评论 -
AcWing796. 子矩阵的和
输入一个 n 行 m 列的整数矩阵,再输入 q 个询问,每个询问包含四个整数 x1,y1,x2,y2,表示一个子矩阵的左上角坐标和右下角坐标。对于每个询问输出子矩阵中所有数的和。转载 2024-04-08 00:47:27 · 226 阅读 · 0 评论 -
AcWing797. 差分
输入一个长度为 n 的整数序列。接下来输入 m 个操作,每个操作包含三个整数 l,r,c,表示将序列中 [l,r] 之间的每个数加上 c。请你输出进行完所有操作后的序列。原创 2024-04-08 00:32:52 · 113 阅读 · 0 评论 -
AcWing795. 前缀和
输入一个长度为 n 的整数序列。接下来再输入 m 个询问,每个询问输入一对 l,r。对于每个询问,输出原序列中从第 l 个数到第 r 个数的和。原创 2024-04-08 00:04:26 · 227 阅读 · 0 评论 -
AcWing787. 归并排序
给定你一个长度为 n 的整数数列。请你使用归并排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。原创 2024-04-07 18:26:14 · 110 阅读 · 0 评论 -
AcWing785. 快速排序
给定你一个长度为 n 的整数数列。请你使用快速排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。原创 2024-04-07 17:33:12 · 225 阅读 · 0 评论 -
完全背包问题(一般写法与空间优化写法)
有 N 种物品和一个容量是 V 的背包,每种物品都有无限件可用。第 i 种物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。原创 2024-03-10 01:25:51 · 357 阅读 · 0 评论 -
贪心区间问题(最大不相交区间数量)
给定 N 个闭区间 [ai,bi],请你在数轴上选择若干区间,使得选中的区间之间互不相交(包括端点)。输出可选取区间的最大数量。原创 2024-03-10 00:51:47 · 372 阅读 · 0 评论 -
贪心排序不等式(排队打水)
有 n 个人排队到 1 个水龙头处打水,第 i 个人装满水桶所需的时间是 ti,请问如何安排他们的打水顺序才能使所有人的等待时间之和最小?原创 2024-03-10 00:21:28 · 401 阅读 · 0 评论 -
贪心Huffman数(合并果子)
在一个果园里,达达已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。达达决定把所有的果子合成一堆。每一次合并,达达可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过 n−1 次合并之后,就只剩下一堆了。达达在合并果子时总共消耗的体力等于每次合并所耗体力之和。因为还要花大力气把这些果子搬回家,所以达达在合并果子时要尽可能地节省体力。原创 2024-03-10 00:12:31 · 360 阅读 · 0 评论 -
贪心区间问题(区间选点)
给定 N 个闭区间 [ai,bi],请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。输出选择的点的最小数量。位于区间端点上的点也算作区间内。原创 2024-03-10 00:06:16 · 338 阅读 · 0 评论 -
完全背包问题
有 N 种物品和一个容量是 V 的背包,每种物品都有无限件可用。第 i 种物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。原创 2024-03-07 23:25:50 · 364 阅读 · 0 评论 -
01背包问题(优化空间写法)
有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。第 i 件物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。原创 2024-02-29 21:10:44 · 368 阅读 · 0 评论