算法知识
文章平均质量分 76
基础算法
wh233z
努力学习in……
展开
-
ST算法(Sparse Table,稀疏表)
ST表(Sparse Table)是一种用于高效处理区间查询的数据结构。它可以在O(1)的时间复杂度内回答某一区间的最值查询(最小值、最大值等)。ST表使用动态规划的思想,通过预处理的方式来快速计算出各个区间的最值。原创 2024-08-13 15:14:16 · 977 阅读 · 0 评论 -
动态规划之——背包DP(完结篇)
本文讲分组背包、有依赖的背包、 背包问题求方案数以及背包问题求具体方案原创 2024-08-09 21:45:11 · 752 阅读 · 0 评论 -
动态规划之——背包DP(进阶篇)
多重背包也是 0-1 背包的一个变式,与 0-1 背包的区别在于每种物品有 k 个,而非一个。二进制优化是将个数进行拆分,那么我们有没有其他更快的方法呢?,可是不同的是选一个物品会消耗两种价值(容量、重量),从第二个物品开始,每个物品的价值跟物品的重量w有关系。比如苹果总数为50,如果我们一个个拿,需要拿50次。那么我们可以在01背包的基础上,多加上一重循环,假设说这时候有6个箱子,这6个箱子的容量为。为什么没有1呢,因为我们可选的数量为3,如果套队列优化的多重背包的模板,很明显,这个代码的时间复杂度为。原创 2024-08-06 19:57:21 · 1308 阅读 · 2 评论 -
动态规划之——背包DP(入门篇)
而我们从后往前遍历,后面的容量不可能比原来的容量大,因此也就不会出现上面这种情况。(解释:新的状态每次都会覆盖原状态,因此每次都跟自己比较大小即可)本文只讲了01背包和完全背包,至于其他背包问题后续补充。,因此我们只需要保留一维,将新的状态覆盖在原状态即可。到此,模板题讲完了,接下来我们来看一道01应用题。算出左脑最多花的时间,ans加上总时间减去。对于上述例题来说,这个代码是过不去的。我们可以先从后往前枚举,在当前。,我们可以将上述步骤改为递归。,与01背包不同的是,这题的。观察式子,我们发现当前状态。原创 2024-08-05 13:55:35 · 1336 阅读 · 0 评论 -
求最短路径的基本方法——SPFA(贝尔曼-福特算法的优化算法)
SPFA算法是求解单源最短路径问题的一种算法,由理查德·贝尔曼(Richard Bellman) 和 莱斯特·福特 创立的。有时候这种算法也被称为 Moore-Bellman-Ford 算法,因为 Edward F. Moore 也为这个算法的发展做出了贡献。它的原理是对图进行V-1次松弛操作,得到所有可能的最短路径。其优于迪杰斯特拉算法的方面是边的权值可以为负数、实现简单,缺点是时间复杂度过高,高达 O(VE) 其中V是节点数量,E是边数量。但算法可以进行若干种优化,提高了效率。原创 2024-08-02 11:27:23 · 987 阅读 · 0 评论 -
求最短路径的2种基本方法——Floyd算法与Dijkstra算法
算法的特点:弗洛伊德算法是解决任意两点间的最短路径的一种算法,可以正确处理有向图或无向图或负权(但不可存在负权回路)的最短路径问题,同时也被用于计算有向图的传递闭包。算法特点:迪杰斯特拉算法可以算出从一个顶点到其余各顶点的最短路径,解决的是有权图中最短路径问题。原创 2024-08-01 15:57:13 · 1159 阅读 · 0 评论 -
动态规划之——线性DP(入门篇)
线性动态规划,是较常见的一类动态规划问题,其是在线性结构上进行状态转移,这类问题不像背包问题、区间DP等有固定的模板。线性动态规划的目标函数为特定变量的线性函数,约束是这些变量的线性不等式或等式,目的是求目标函数的最大值或最小值。原创 2024-07-30 20:12:32 · 1440 阅读 · 2 评论 -
set、multiset、unordered_set的区别以及常见用法 + 基本位运算bitset常见用法
set存放的元素呈升序set当中存储元素的value都是唯一的,不可以重复set中的元素不能被修改。原创 2024-07-21 15:08:27 · 720 阅读 · 0 评论 -
c++数据结构——栈
由于题目求的是下一个更大元素,因此我们可以考虑用栈来模拟最大的元素,倒着遍历nums2,判断当前元素是否比栈顶元素大,满足则删去栈顶元素,直到不能删为止,判断栈是否为空,若为空则说明当前元素是最大的,我们可以标记当前元素为-1,不为空则标记当前元素为栈顶元素(栈顶元素大于当前元素),最后从头遍历nums1即可。用栈模拟一遍,将所有无法匹配的括号的位置全部置1,经过这样的处理后, 此题就变成了寻找最长的连续0的长度。(后进先出的叫法,也是可以的):栈的插入操作,叫做进栈,也称压栈、入栈。原创 2024-07-18 11:15:35 · 500 阅读 · 0 评论 -
哈希表(知识点+leetcode)以及字符串哈希
哈希表是散列表,就是通过关键码值而直接进行访问的一种数据结构哈希表中关键码就是数组的索引下标,然后通过下标直接访问数组中的元素其内部由一个个key:value 样式的键值对组成。哈希表中的key通过哈希函数得到内存地址,然后将key和value放到对应的内存地址,从而实现通过key获取Value的方式哈希碰撞:2个不同的key通过哈希函数(hash function)得到了相同的内存地址,也就是是内存地址已经被一个占用了,解决方法是将其中之一变为链表结构,使用next指向。原创 2024-07-16 19:49:28 · 1761 阅读 · 0 评论 -
乘法逆元的模板以及应用
首先我们可以开一个最小堆模拟集合,因为每次取出的数必须是集合里面最小的数,否则就不满足题意,堆中的元素总数为分母,当前队头的最小元素的数量即为分子,该数量可以用map来记录,计算不同分数的积并进行取模,最后将分母进行快速幂的逆元,然后乘上分子在取模一次即可。求最后取出来的数组满足递增(小于等于后一项)的概率,然后对这个概率进行取模处理。所以我们可以用快速幂来算出x的值,这个数就是 a 的逆元了。非-1:将这个数存入集合里面。-1:从集合里面取出一个数。原创 2024-07-15 14:52:16 · 882 阅读 · 0 评论 -
exgcd的模板以及应用
exgcd的变形,由题意我们可以得出x+km≡y+kn(mod l),那么x+km与y+kn跟l成倍数关系,x+km−(y+kn)=lz,z∈Z,变换一下可以得出x-y-k(n-m)= lz,我们令a=n-m,b=l,c=x-y,那么ka+bz=c,形如ax+by=c,令gcd(a,b)=d,通过exgcd我们可以得出ax1+by1=d,方程两边同时乘以c/d,可以得出a。先套用exgcd模板求出最小的特解x,然后用裴蜀定理判断无解的情况,剩下的就是二元一次方程的解法(纯数学,本蒟蒻不会,可以参考。原创 2024-07-14 10:46:47 · 835 阅读 · 0 评论 -
如何求最大公约数以及最小公倍数
最小公倍数 = 两数之积除以最大公约数,在这里使用辗转相除的方法求解最大公约数,即a与b的最大公约数可以转化为a、b之间的余数为两者之间最小的数之间的公约数。所以对于输入的两个数进行连续求余,直到余数为0,求余的分母即为结果。题意描述:n个分数求和,若结果只为整数则只输出整数,否则输出的形式为一个整数k,和一个分数形式,分数必须是最简形式且分子小于分母,若整数为0则不输出整数形式。分析:首先我们需要将分子和分母的总和分别存入两个变量,模拟数学中分数相加的形式,每一次相加后都要对其进行约分,最后按题意输出。原创 2024-04-14 13:58:16 · 584 阅读 · 1 评论 -
模拟竖式计算除法
正确思路:我们可以模拟竖式相除,当被除数大于除数时,就相除,然后对被除数和除数取模,若取模后不为0(即还没找到s),那么就将他乘以10在加上1(加上1是因为光棍的所有位数都为1),对于位数另开一个计数器统计位数即可。题意描述:给定一个整数x,求出这个整数乘以最小的整数s是一个光棍(光棍就是所有位数都由1组成),以及输出光棍的位数。对于这份代码我也没报多少希望,果然当光棍的值超出long long范围时,则找不到答案,所以这种方法是错的。错误思路:直接暴力穷举关棍,当光棍可以整除x时,就找到这个值。原创 2024-04-16 20:12:06 · 610 阅读 · 0 评论 -
常用的string函数库
transform(s.begin(),s.end(),s.begin(),::tolower或者::toupper)//将字符串s转化为小写或者大写。// 结果:23456-----参数5表示:截取的字符串的长度。// s1.begin(),s1.begin()+5 是左闭右开区间。string的排序:sort(s.begin(),s.end())原创 2024-04-19 18:44:06 · 573 阅读 · 1 评论 -
何为动态规划
动态规划(英语:Dynamic programming,简称 DP),通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题。简单来说,动态规划其实就是,给定一个问题,我们把它拆成一个个子问题,直到子问题可以直接解决。然后呢,把子问题答案保存起来,以减少重复计算。再根据子问题答案反推,得出原问题解的一种方法(类似于递推)。原创 2024-04-01 22:24:20 · 959 阅读 · 0 评论 -
算法时间复杂度的时间限制以及算法时间复杂度的分析
时间复杂度大小比较:O(1)<O(log2n)<O(n)<O(nlog2n)<O(n^2)<O(n^3)<......<O(n!第一步: i n*n n*n/2 n*n/4 n*n/8。(3)O(n根号n)的算法能解决的范围在n<=10^5(二层循环,其中一层循环变量呈倍数关系)(1)O(n)的算法能解决的范围在n<=10^8(KMP字符串查找法,欧拉筛)(4)O(n^2)的算法能解决的范围在n<=5000(二层for循环,dp)原创 2024-03-31 09:52:38 · 521 阅读 · 1 评论 -
何为LCA(最近共同祖先)?
(也称暴力枚举,从一个点开始向上标记他的父节点,直接标记到根节点为止,然后另另一个点也开始向上回溯,当这个点被标记过,则找到这两个点的共同祖先),当数据过大时,很明显这个算法会超时,所以本文不过多解释此方法。用层序遍历的思想求出树的深度和宽度,同时标记每个节点所在的层数,然后用tarjan算法求出a和b的共同祖先,最后套公式输出距离即可。顾名思义,就是求两个节点最近的共同祖先,就好比下图,2和3的共同祖先为3,2和4的共同祖先为1。2.枚举所有没有访问的过的子节点y,继续遍历子节点。5.标记当前节点回溯。原创 2024-05-13 20:56:46 · 628 阅读 · 0 评论 -
何为并查集?
并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。简单来说,并查集是用来管理元素分组的算法。并查集的作用是什么?并查集可以高效的对元素进行分组(合并在一起),并且能快速的查询两个元素是否属于同一组。P3367 【模板】并查集 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)假设我们有3个人x,y,z假设x打赢y,a[y]=x;也就是说x是y的老大。原创 2024-05-10 19:04:46 · 421 阅读 · 0 评论 -
二叉树的基础遍历2.0
前序,中序和后序的分析1.0已给出,本文不做过多介绍,本文重点讲二叉树的层序遍历。本文所用的方法为非递归(本蒟蒻不会递归的方法),非递归。在1.0中使用的是简单的结构体建树,本文注重用。:层序遍历就是从左到右,一层一层的遍历。原创 2024-05-08 16:52:23 · 579 阅读 · 0 评论 -
对顶堆和简单的位运算
维护一个最大堆一个最小堆,最大堆里存的是较小的一半数据,最小堆里存的是较大的一半数据,并且维持最大堆元素个数不少于最小堆元素个数,并且最大堆元素个数与最小堆元素个数之差小于等于1。每次来一个数的时候,先决定其入哪个堆,然后如果堆的元素个数出现了违法上面规定的情况,就做相应的调整。即:两位同时为“1”,结果才为“1”,否则为0。例如,142 1 = 71,142 >> 2 =35。左移1相当于该数乘以2,左移2相当于该数乘以2*2即乘以4。原创 2024-04-30 16:02:15 · 350 阅读 · 0 评论 -
二叉树 中序+____ 的遍历
树和二叉树基本上都有先序、中序、后序、按层遍历等遍历顺序,给定中序和其它一种遍历的序列就可以确定一棵二叉树的结构。原创 2024-05-22 14:07:16 · 527 阅读 · 0 评论 -
二叉树的基础遍历
前序:根左右(先输出父节点,在分别输出子节点的左节点和右节点)题目描述:给出每个结点的两个子结点编号,根节点都为1,如果子节点为0,则它就不存在,然后依次求出它的前序、中序、后序遍历。先用递归找出树的所有左节点并依次输出,找到末尾则回溯回上一个父节点,然后向右节点递归并依次输出。中序:左根右(先输出子节点的左节点,在输出父节点,然后输出子节点的右节点)例如:1,2,3,4,5,6,7(图片中的左,右分别是前,后,写错了)后序:左右根(先输出子节点的左节点和右节点,最后输出父节点)原创 2024-04-23 20:22:38 · 500 阅读 · 0 评论 -
常用的ctype库以及vector和pair的常见用法
ctype库isalnum:检查 ch 是否为字母或数字isalpha:检查 ch 是否为字母isdigit:检查 ch 是否为数字( ‘0’ ~ ‘9’ )islower:检查 ch 是否为小写字母(‘a’ ~ ‘z’)toupper:将 ch 字符转换成大写字母(ch=toupper(ch))原创 2024-04-21 23:01:28 · 1196 阅读 · 1 评论 -
滑动窗口模板
一个简单的思路,就是在每一个滑动窗口中,遍历一次滑动窗口中的数,找到滑动窗口中的最大值和最小值,如果标记原窗口最大最小值及其位置,那么在新的窗口中,若最大最小值仍在新窗口中,滑动窗口是一种基于双指针的一种思想,两个指针指向的元素之间形成一个窗口。:窗口有两类,一种是固定大小类的窗口,一类是大小动态变化的窗口。若数组长度为n,滑动窗口的长度k,则有n-k+1个滑动窗口。如上代码是模拟双端队列实现的,时间复杂度比双端队列快了一倍。我们发现每次滑动窗口时,,若最大或最小值不在新窗口中,我们再遍历一次窗口。原创 2024-04-28 15:45:48 · 780 阅读 · 0 评论 -
快排和归并的模板及其应用
快排和归并的模板及其应用原创 2024-04-27 10:59:59 · 346 阅读 · 0 评论