算法笔记
文章平均质量分 67
将平时学习过程中对算法的理解和模板整理出来。
林小鹿@
后端开发,热衷于算法,每日更新高质量算法题解。
展开
-
前缀和与差分 图文并茂 超详细整理(全网最通俗易懂)
前缀和:前缀和是指某序列的前n项和,可以把它理解为数学上的数列的前n项和(对于一个一维数组的前缀和)****前缀和算法有什么好处?先来了解这样一个问题:输入一个长度为n的整数序列。接下来再输入m个询问,每个询问输入一对l, r。对于每个询问,输出原序列中从第l个数到第r个数的和。一般解法:int n,m;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) scanf("%d",&a[i]);while(m--){原创 2020-12-17 17:30:31 · 128554 阅读 · 160 评论 -
图解快速排序
假设我们现在对“6 1 2 7 9 3 4 5 10 8”这个10个数进行排序。首先在这个序列中随便找一个数作为基准数(不要被这个名词吓到了,就是一个用来参照的数,待会你就知道它用来做啥的了)。为了方便,就让第一个数6作为基准数吧。接下来,需要将这个序列中所有比基准数大的数放在6的右边,比基准数小的数放在6的左边,类似下面这种排列。3 1 2 5 4 6 9 7 10 8在初始状态下,数字6在序列的第1位。我们的目标是将6挪到序列中间的某个位置,假设这个位置是k。现在就需要寻原创 2020-12-06 16:55:54 · 324 阅读 · 0 评论 -
来自北京大学NOIP金牌选手yxc的常用代码模板4——数学知识
目录数学知识1.试除法判定质数2.试除法分解质因数3.朴素筛法求素数4.线性筛法求素数5.试除法求所有约数6.约数个数和约数之和7.欧几里得算法8.筛法求欧拉函数9.快速幂10.扩展欧几里得算法11.高斯消元12.Lucas定理13.分解质因数法求组合数14.卡特兰数15.NIM游戏16.公平组合游戏ICG17.有向图游戏数学知识1.试除法判定质数bool is_prime(int x){ if (x < 2) return false; for (int i = 2; i &原创 2020-12-03 19:21:50 · 1782 阅读 · 0 评论 -
来自北京大学NOI金牌选手yxc的常用代码模板3——搜索与图论
目录搜索与图论1.树与图的存储2.树与图的遍历3.拓扑排序4.朴素dijkstra算法5.堆优化版dijkstra6.Bellman-Ford算法7.spfa 算法(队列优化的Bellman-Ford算法)8.spfa判断图中是否存在负环9.floyd算法10.朴素版prim算法11.Kruskal算法12.染色法判别二分图13.匈牙利算法搜索与图论1.树与图的存储树是一种特殊的图,与图的存储方式相同。对于无向图中的边a,b,存储两条有向边a->b, b->a。因此我们可以只考虑有向图原创 2020-12-02 19:34:46 · 1826 阅读 · 0 评论 -
来自北京大学NOIP金牌选手yxc的常用代码模板2——数据结构
目录1.单链表2.双链表3.栈4.队列5.单调栈6. 单调队列7.KMP8.Trie树9.并查集10.堆11.一般哈希12.字符串哈希13.C++ STL简介1.单链表// head存储链表头,e[]存储节点的值,ne[]存储节点的next指针,idx表示当前用到了哪个节点int head, e[N], ne[N], idx;// 初始化void init(){ head = -1; idx = 0;}// 在链表头插入一个数avoid insert(int a){原创 2020-11-30 16:04:53 · 2241 阅读 · 3 评论 -
来自北京大学NOI金牌选手yxc的常用代码模板1——基础算法
目录常用代码模板1——基础算法1.快速排序算法模板2.归并排序算法模板3.整数二分算法模板4.浮点数二分算法模板5.高精度加法6.高精度减法7.高精度乘低精度8.高精度除以低精度9.一维前缀和10.二维前缀和11.一维差分12.二维差分13.位运算14.双指针算法15.离散化16.区间合并常用代码模板1——基础算法1.快速排序算法模板void quick_sort(int q[], int l, int r){ if (l >= r) return; int i = l -原创 2020-11-29 19:30:15 · 5076 阅读 · 6 评论 -
Dijkstra求最短路算法 ( 超级超级详细的 ) 不断更新中
Dijkstra求最短路最短路问题Dijkstra算法迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。实现过程代码```cppint Dijkstra(){ memset(dist,0x3f,sizeof dist);原创 2020-10-31 19:44:55 · 8574 阅读 · 9 评论 -
数据结构 —— 队列
队列1.队列的介绍队列是一种先进先出的数据结构,这和栈有所不同,但又更容易理解。类似于食堂排队打饭,车站排队买票。后来的人排在队伍最后边,先来的人先打饭或者买票走。如图队列总是从队尾插入元素,而从队首移除元素,满足先进先出的规则。因此需要一个队首指针front指向队首元素的前一个位置,而使用一个队尾指针rear来指向队尾元素。,需要一个队首指针front来指向队首元素的前一个位置,而使用一个队尾指针rear来指向队尾元素。和栈类似,当使用数组来实现队列时,队首指针front和队尾指针rear为i原创 2020-10-16 19:02:00 · 2748 阅读 · 0 评论 -
并查集模板超详细整理
并查集被很多OIer认为是最简洁而优雅的数据结构之一,主要用于解决一些元素分组的问题。它管理一系列不相交的集合,并支持两种操作:·合并(Union):把两个不相交的集合合并为一个集合。·查询(Find):查询两个元素是否在同一个集合中。假如有编号为1, 2, 3, …, n的n个元素,我们用一个数组fa[]来存储每个元素的父节点(因为每个元素有且只有一个父节点,所以这是可行的)。一开始,我们先将它们的父节点设为自己。查询int find(int x){ if(fa[x] == x)原创 2020-05-13 19:06:24 · 4203 阅读 · 0 评论 -
数论 - 欧拉函数【 普通求法 + 筛法求欧拉函数 】
欧拉函数1.定义对于正整数n,欧拉函数是小于或等于n的正整数中(即1-n中)与n互质的数的数目,记作φ(n)其中φ(1)=1。2求n的欧拉值3.结论4.代码模板:int phi(int x){ int res = x; for (int i = 2; i <= x / i; i ++ ) if (x % i == 0) { res = res / i * (i - 1); while (原创 2020-07-29 10:05:21 · 684 阅读 · 0 评论 -
数论 - 约数基础 【 试除法求所有约数 + 约数个数和约数之和 + 欧几里得算法-求解最大公约数 】
数论—约数基础1.约数定义约数,又称因数。整数a除以整数b(b≠0) 除得的商正好是整数而没有余数,我们就说a能被b整除,或b能整除a。a称为b的倍数,b称为a的约数。在大学之前,"约数"一词所指的一般只限于正约数。约数和倍数都是二元关系的概念,不能孤立地说某个整数是约数或倍数。一个整数的约数是有限的。同时,它可以在特定情况下成为公约数。2.试除法求所有约数vector<int> get_divisors(int x){ vector<int> res; f原创 2020-07-29 09:54:35 · 641 阅读 · 0 评论 -
数论 - 质数(素数)基础【 素数的判断 + 试除法分解质因数 + 求1-n之间的素数的三种筛法 】
数论1.素数素数又称为质数,是指除了1和本身之外,不能被其他数整除的一类数。即对给定的正整数n,如果对任意的正整数a(1<a<n),都有n%a!=0成立,那么称n是素数;否则,如果存在a(1<a<n),使得n%a==0,那么称n为合数。应特别注意的是,1既不是素数,也不是合数。2.素数的判断、1.试除法bool is_prime(int x){ if (x < 2) return false; for (int i = 2; i <=x / i; i++)原创 2020-07-27 19:05:57 · 1193 阅读 · 0 评论 -
数论 - 高斯消元算法
1.高斯消元(1)定义高斯消元法是求解线性方阵组的一种算法,它也可用来求矩阵的秩,以及求可逆方阵的逆矩阵。它通过逐步消除未知数来将原始线性系统转化为另一个更简单的等价的系统。它的实质是通过初等行变化将线性方程组的增广矩阵转化为行阶梯矩阵.(2)初等行变换初等行变换定义:所谓数域P上矩阵的初等行变换是指下列3种变换:(1)以P中一个非零的数乘矩阵的某一行(2)把矩阵的某一行的c倍加到另一行,这里c是P中的任意一个数(3)互换矩阵中两行的位置一般来说,一个矩阵经过初等行变换后就变成了另一个矩原创 2020-07-27 18:54:38 · 2108 阅读 · 0 评论 -
数论-扩展欧几里得算法
数论-扩展欧几里得算法1.推导过程2.代码模板// 求x, y,使得ax + by = gcd(a, b)int exgcd(int a, int b, int &x, int &y){ if (!b) { x = 1; y = 0; return a; } int d = exgcd(b, a % b, y, x); y -= (a/b) * x; return d;}3.题目练习AcWin原创 2020-07-25 13:23:15 · 406 阅读 · 1 评论 -
学归并排序和逆序对,这篇文章就够了!!!归并排序和逆序对超详细整理!
目录1.归并排序2.逆序对3.例题1.归并排序(1).介绍归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(DivideandConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并排序的时间复杂度是O(nlogn). 速度快,同时归并排序是稳定的排序,即相等的元素的顺序不会改变,如输人记录1(1) 3(2) 2(3) 2(4)5(5) (括号中是记录的关键字)时输出原创 2020-07-02 09:28:21 · 3849 阅读 · 5 评论 -
快速排序模板整理
快速排序1.思想快速排序是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。假设待排序的序列为{ a[1],a[1+1], a[1+2],…a[r] },首先任意选取一个记录(通常可选中间一个记作为枢轴或支点),然后重新排列其余记录,将所有关键字小于它的记录都放在左子序列中,所有关键字大于它的记录都放在右子序列中。由此可以将该“支点"记录所在的位置mid作分界线,将序原创 2020-07-21 13:14:33 · 1656 阅读 · 1 评论 -
数据结构-栈的详细整理
1.栈1.栈的介绍栈(stack)是一种后进先出或者先进后出的数据结构。可以把栈理解为一个箱子,箱子的容量仅供一本书放入或拿出。每次可以把一本书放在箱子的最上方,也可以把最上方的书拿出。用数组st[]来模拟栈,常见操作包含清空(clear),获取栈内元素(size),判断栈是否为空(empty),进栈(push),出栈(pop),获取栈顶元素(top)等。2.用数组模拟(1) 清空(clear)void clear(){ TOP=-1;}(2) 获取栈内元素个数(size)栈顶指针原创 2020-07-21 12:50:48 · 520 阅读 · 0 评论