![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
重返基础学习
丶Kingdom
欢迎批评,欢迎斧正,拒绝嘴臭。
展开
-
ch1(数据结构篇)——单链表、双链表、栈、队列、单调栈、单调队列
1.自然语言描述①单链表:这里使用的是不带头结点的单链表,由一个指向第一个结点的head指针,e数组(e[i]表示第i个插入列表的结点)ne数组(ne[i]表示第i个插入链表的结点的邻接结点)idx表示下一次插入结点的序号。②双链表:在单链表的基础上加入了每个结点左邻接的结点数组。③栈:先进后出表,用数组模拟,tt表示栈顶。④队列:先进先出表,用数组模拟,hh表示队首,tt表示队尾。⑤单调栈:不断pop栈输出直到栈空,如果得到单调递增序列则为单调递增栈,反之为单调递减栈。对于一个序列,为了找出序列原创 2021-03-01 12:58:08 · 254 阅读 · 0 评论 -
ch2(搜索与图论)——迭代加深搜索
1.自然语言描述迭代加深搜索是在原本的深度优先搜索基础上,控制了遍历状态空间树的深度;比如:第一次DFS,控制深度为depth,看在这种情况下是否能搜索到答案状态,如果没搜到,第二次DFS控制深度为depth+1,在看是否能搜到答案状态……以此类推,通过不断加大深度来搜索答案状态;迭代加深搜索适合于答案位于状态空间树的较浅层次但是...原创 2020-10-24 22:03:24 · 119 阅读 · 0 评论 -
ch2(搜索与图论)——双向广搜
1.自然语言描述当状态空间树很大很大时(时间复杂度很高)从起点到终点直接BFS仍会超时;可以考虑分别从起点和终点双向BFS,双向BFS会将原来的状态空间树极大地缩小。双向BFS的扩展方式:既然是双向BFS,则起点开始和终点开始各需要一个活结点队列,最短路径的保存记录也需要两个——各自相对于起点和终点的最短路径记录。扩展时,优先扩展两个队列中活结点较少的那一侧。2.代码描述题目:Acwing 190.字串变换 题目链接#include <iostream>#include <c原创 2020-10-07 22:59:04 · 145 阅读 · 0 评论 -
ch2(搜索与图论)——最短路模型
1.自然语言描述对于一般的连续空间(可能是一维、二维、三维乃至更高维)中探索最短路,就是用BFS去解决。记录路径:若要记录从起点到终点的路径,可以反向BFS,从终点搜索到起点,同时记录路径中每个点的前一个点。这样,达到起点后,再从起点开始顺着记录的点输出,显示从起点到终点的路径。2.代码描述题目:Acwing 1076.迷宫问题 题目链接#include <iostream>#include <cstdio>#include <cstring>#incl原创 2020-10-06 23:10:45 · 133 阅读 · 0 评论 -
ch2(搜索与图论)——flood fill
1.自然语言描述面对一个二维平面图,图中元素有不同的种类,问题要求出图中所有某一种类的元素构成了多少连通块?最大连通块的大小是多少?或是满足特殊要求的连通块有多少个?……这些问题,他们的输入数据规模往往不大;绕不开连通块这个话题。Flood fill算法能够求出图中要求的连通块:模拟用水(想象一下Minecraft中岩浆桶和水桶的作用效果)灌满一个连通块;灌满图中所有连通块的次数就是连通块的个数。Flood fill算法在遍历连通块时采用的是BFS策略。2.代码描述题目:Acwing 1097.池塘原创 2020-10-05 17:32:10 · 167 阅读 · 0 评论 -
ch4(DP)——数字三角形模型
1.自然语言描述源于题目:数字三角形(Acwing.898) 题目链接这种题往往是计算在一个二维空间中,从起点到终点的最大收益/最小耗费;用闫氏DP分析法,可以总结出这种模型状态标识、状态计算的特点;状态往往以一个多元组f表示,分量往往由点的坐标/横纵坐标之和进行表示;状态计算往往是根据题目中对点运动的限制条件,限制条件有时在某个特殊条件中被暗示。状态表示不一定只能表示一个点的状态,也可以表示同时在图上运动的两个点。状态计算的集合划分,往往是以从上一个点抵达当前状态的不同方向进行划分。2.代码描述原创 2020-09-13 18:29:08 · 162 阅读 · 0 评论 -
ch4(DP)——区间DP、状态压缩DP
1.自然语言描述区间DP:一般是给定一个序列,然后进行区间内元素合并,问合并整个序列的最大价值/最小耗费是多少。区间DP问题有着明显的特征,问题的思考方式也有着确定的模板。状态压缩DP:一般是将问题中的状态,用一个二进制数来表示,将状态的枚举转变为位运算;如果用一般的暴力搜索,复杂度将会是出奇的高;这个时候就考虑能不能将每个状态压缩为一个二进制数,然后通过问题本身的信息来降低复杂度。2.代码描述题目:Acwing.282 石子合并 题目链接#include <iostream>#in原创 2020-09-07 22:54:08 · 135 阅读 · 0 评论 -
ch4(DP)——线性DP(最长上升子序列LIS、最长公共子序列LCS、最短编辑距离)
1.自然语言描述线性DP的特点是状态在线性结构上转移;其问题形式多种多样,只有几个典型的问题有固定的模板,更一般的问题是具体问题具体分析。最长上升子序列LIS:用f[i]表示以i结尾的元素最长上升子序列的长度;状态集合划分,是否能成为原先以s[1],s[2],…,s[i-1]结尾的最长上升子序列的新末尾元素,从而有状态转移方程f[i]=min(f[i],f[j]+1)(1<=j<i,s[j]<s[i])注意根据定义,f[i]初始化为1。最长公共子序列LCS:用f(i,j)表示序列A以原创 2020-09-05 23:46:27 · 232 阅读 · 0 评论 -
ch3(数学)——博弈论(Nim游戏、SG函数)
1.自然语言描述公平组合游戏(ICG)是指满足:1.游戏有两个参与者,轮流决策,每个人都知道游戏的完整信息;2.游戏者在某一状态可以做出的决策集合仅取决于当前状态,与游戏者本人无关;3.游戏进行中,任何一个状态都不能多次到达,游戏一定会决出胜负。Nim 游戏:有n堆石子,第i堆石子有si个,两个玩家轮流取走任意一堆的任意多个石子(但不能不取)谁最后没的取判输(取走最后一个物品的人获胜)Nim 和:把每一堆的石子数进行异或运算,s1 ^ s2 ^ s3 ^ … ^ sn = x;定义必胜状态为先手必胜原创 2020-09-04 23:29:44 · 379 阅读 · 0 评论 -
ch3(数学)——组合数学(Lucas定理、Catalan数)
1.自然语言描述组合数的计算是高中数学的知识;计算机算组合数的方法不唯一,可以按照组合数原始式去算,也可以用定理来递归计算。具体怎么算,要看问题数据规模。组合数原始式:C(n,m)=n!/(m!*(n-m)!);有一重要性质:C(n,m)=C(n-1,m)+C(n-1,m-1);(解释:对于n个元素中的某个元素,C(n,m)包含两种情况;第一种是选取了这个元素,也就是说选的m个元素中包含这个元素,去掉这个元素会使m个也去掉1个,情况数为C(n-1,m-1);第二种是未选取这个元素,m个中不包含这个元素原创 2020-09-03 16:27:28 · 430 阅读 · 1 评论 -
ch4(DP)——背包问题(01背包、完全背包、多重背包、分组背包、混合背包)
1.自然语言描述① 01背包问题:有n个物品,每个物品有相应的体积vi和价值wi,对于一个物品,要么装入背包,要么不装入;有一个体积为V的背包,怎么装物品才能使背包中物品的价值最大?② 完全背包问题:有n种物品,每种物品有相应的体积vi和价值wi,对于一种物品可以选任意多个装入背包(即每种物品的数量是无穷大的)有一个体积为V的背包,怎么装物品才能使背包中物品的价值最大?③ 多重背包问题:有n种物品,每种物品有相应的体积vi和价值wi,第i种物品的数量是si个;有一个体积为V的背包,怎么装物品才能使背包原创 2020-09-01 17:14:45 · 290 阅读 · 1 评论 -
ch3(数学)——容斥原理
1.自然语言描述在概率论课程中,容斥原理作为定理出现过;以最简单的情况举例:两个事件A,B,A∪B=A+B-A∩B;三个事件A,B,C,A∪B∪C=A+B+C-A∩B-A∩C-B∩C+A∩B∩C;推广到任意多个事件 容斥原理可以不重复、不遗漏地得到计算结果。2.代码描述题目:Acwing.890 能被整除的数题目链接#include <iostream>#include <cstdio>#include <cstring>#include <al原创 2020-09-01 11:41:26 · 167 阅读 · 0 评论 -
ch3(数学)——中国剩余定理、线性同余方程组解法
1.自然语言描述中国剩余定理:对于有k个线性同余方程(x≡ai(mod mi),mi之间两两互质)组成的线性同余方程组,通过以下步骤求解:1.求出所有模数m的乘积记作M;2.对于第i个线性同余方程:①令ni=M/mi;②求出ni在mod mi意义下的逆元ni^(-1);③令ci=nini ^(-1);3.方程组的唯一解为∑(i=1,k)aici(mod mi)中国剩余定理有严格的条件限制,即模数之间两两互质。一般的线性同余方程组,将两个方程合并为一个,合并k-1次,最终得到一个线性同余方程。2原创 2020-08-31 15:59:16 · 726 阅读 · 1 评论 -
ch3(数学)——扩展欧几里得算法
1.自然语言描述扩展欧几里得往往用于求线性同余方程 ax≡b(mod m) 的解;方程形式可以写成 ax+my=b ,求解x,y(解并不唯一,可正可负,所以原本是-y可以写成y便于求解)求解线性同余方程要用到裴蜀定理(贝祖定理)裴蜀定理:对于一对不全为0的整数a,b,存在整数x,y使得 ax+by=gcd(a,b) 成立。利用扩展欧几里得算法最后得到a,m的最大公约数(a,m),如果b mod (a,m) 不为0(即b无法被gcd(a,m)整除)则线性同余方程无解,否则有解;线性同余方程的解为x*b原创 2020-08-29 23:06:52 · 110 阅读 · 0 评论 -
ch3(数学)——快速幂
1.自然语言描述对于a^k mod p计算,暴力做法复杂度为O(n);将k转换为二进制数,求出a1,a2,a4,a8, … ,a ^ (2^log k)(k转换为2进制数意义在于此)组合为a^k。快速幂的复杂度为O(log n)。a*x≡1(mod p)(a与p互质)称x为a mod p的逆元,x = a^(-1) = a^(p-2) mod p。费马小定理:若a与p互质,则a^(p-1)≡1(mod p)。费马小定理的证明:oi wiki关于费马小定理、欧拉定理、扩展欧拉定理的证明2.代码描述原创 2020-08-29 19:07:55 · 112 阅读 · 1 评论 -
ch3(数学)——欧拉函数
1.自然语言描述自然数n的欧拉函数指1~n之间所有与n互质的数的个数;比如,6的欧拉函数值为2。欧拉函数表达式:phi(n) = n * (1 - 1/p1) * (1 - 1/p2) * (1-1/p3) * … * (1-1/pk)p为质因子的底数。用容斥原理证明:展开这个表达式,phi(n) = n - n/p1 - n/p2 - … - n/pk + n/(p1p2) + n/(p1p3) + … + n/(p(k-1)*pk) - …这样的形式,即在1~n这n个数中去掉所有不与n互质的数,首原创 2020-08-29 12:30:17 · 1214 阅读 · 0 评论 -
ch3(数学)——约数
1.自然语言描述试除法求约数:从1枚举到sqrt(n)(自然数n的算术平方根)若能够整除n则为n的约数。约数个数:自然数n可以分解质因数为(p1^a1) * (p2^a2) * (p3^a3) * … * (pk^ak)(p为质数,a为指数部分)自然数n的约数个数为(a1+1) * (a2+1) * (a3+1) * … * (ak+1)约数之和:自然数n的约数之和为 ( p1^0 + p1^1 + … + p1^a1 ) * ( p2^0 + p2^1 + … +p2^a2 ) * … * ( pk原创 2020-08-28 18:28:48 · 193 阅读 · 0 评论 -
ch3(数学)——质数
1.自然语言描述质数:除了1和它本身之外没有因数的数。试除法判定质数:根据指数定义,判断这个数能不能被1和它本身之外的数整除;若能则说明这个数不是质数,若不能则这个数是质数。分解质因数:任意一个合数都可以分解为若干个质数幂相乘的形式。质数筛:得到2~n之间所有的质数,用一个标记数组st[i]判断i是否是质数。2.代码描述题目:Acwing.866 试除法判定质数题目链接#include <iostream>#include <cstdio>#include <原创 2020-08-28 12:23:33 · 319 阅读 · 0 评论 -
ch2(搜索与图论)——二分图染色、二分图的最大匹配问题(匈牙利算法)
1.自然语言描述二分图:设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。(摘自百度百科)图G是二分图的充要条件是G中不含奇数环。二分图的匹配:设M为G的子图,M中的任意两条边都不依附于同一个顶点,则称M为G的一个匹配。最大匹配:M中边数最多的情况。匈牙利算法:找出二分图的最大匹配。策略是:左集合中的每一个点找自己的邻接点做匹配点;如果邻接点已原创 2020-08-26 17:57:23 · 150 阅读 · 0 评论 -
ch2(搜索与图论)——最小生成树(Prim算法、Kruskal算法)
1.自然语言描述Prim 算法是利用贪心思想。每次选距离当前生成树最近的点(注意是到生成树的距离,即该点到邻接的属于生成树的点的距离最小)直至所有的点被选完。Kruskal 算法是将所有的边按权值非递减排序,每次从中挑选最小的边(注意选择的边不能在图中的生成树上构成环)直至选择够(|V|-1)条边。2.代码描述题目:Acwing.858 Prim算法求最小生成树题目链接#include <iostream>#include <cstdio>#include <cs原创 2020-08-26 16:22:56 · 154 阅读 · 0 评论 -
ch2(搜索与图论)——floyd
1.自然语言描述floyd 算法是用来解决多源最短路问题的算法。其核心思想是DP,在每两个点之间试所有点做中间点来更新两点之间的距离使达到最短。复杂度较高(O(n^3))2.代码描述题目:Acwing.854 Floyd求最短路题目链接#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int原创 2020-08-26 15:41:14 · 86 阅读 · 0 评论 -
ch2(搜索与图论)——spfa
1.自然语言描述spfa 算法是bellman-ford算法的队列优化做法,bellman-ford算法中每次松弛会有很多用问更新点去更新邻接的未更新点的情况发生,浪费时间,所以利用队列每次只用已经更新过的点去更新它的邻接点。2.代码描述题目:Acwing.851 spfa 求最短路题目链接#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#inc原创 2020-08-26 07:08:24 · 72 阅读 · 0 评论 -
ch2(搜索与图论)——bellman-ford
1.自然语言描述bellman-ford 算法是对图中所有边进行n次松弛操作,可得到源点到所有点的最短路径,复杂度较高(O(nm))但可以处理带有负权边的图。2.代码描述题目:Acwing.853 有边数限制的最短路题目链接#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int MAXN=原创 2020-08-26 06:15:30 · 102 阅读 · 0 评论 -
ch2(搜索与图论)——dijkstra
1.自然语言描述dijkstra 算法是一种计算正权边单源最短路径的算法。每次从点集V中挑出距离源点最近的点,再对该点的所有邻接点距离源点的长度进行更新。dijkstra 实现可以用一般的朴素做法(复杂度O(n^2))和堆优化做法(复杂度O(nlogn))2.代码实现题目:Acwing.849 dijkstra求最短路径I题目链接#include <iostream>#include <cstdio>#include <cstring>#include &l原创 2020-08-26 05:50:06 · 108 阅读 · 0 评论 -
ch2(搜索与图论)——拓扑排序
1.自然语言描述有向无环图(DAG图)能够转化为一个序列,该序列的性质是对于每条边(x,y),x在序列中出现在y之前;该序列被称为拓扑序列。由拓扑序列性质可知一个DAG图的拓扑序列并不是唯一的。计算拓扑序列的方法是:每次去除入度为0的点并去掉其邻接边(即将其邻接点的入度减1)记录其每次去除顺序,直至所有点都被处理。若发现不能得到拓扑序列,则说明该图一定不是DAG图;也就是说,不含环的有向图一定存在拓扑序列。2.代码描述题目:Acwing.848 有向图的拓扑序列题目链接#include <io原创 2020-08-25 18:29:25 · 103 阅读 · 0 评论 -
ch2(搜索与图论)——BFS
1.自然语言描述BFS (广度优先搜索)是一种搜索策略;在问题的状态空间树上进行广度优先遍历,即每次先遍历所有合适的子结点,将其加入队列,然后重复处理直至队列清空,由此得到答案;往往用于寻找问题的最少耗费/最大收益。2.代码描述题目:Acwing.844 走迷宫题目链接#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <qu原创 2020-08-24 23:47:22 · 119 阅读 · 0 评论 -
ch2(搜索与图论)——DFS
1.自然语言描述DFS(深度优先搜索)是一种搜索策略;在问题的状态空间树上进行深度优先遍历,即“一条路走到黑”,遇到行不通的路就回溯到父结点的搜索策略。问题数据规模较大时,还需要进行合适的剪枝操作来避免遍历一些不必要的状态。2.代码描述题目:Acwing.842 排列数字题目链接#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using nam原创 2020-08-24 13:21:48 · 130 阅读 · 0 评论 -
ch1(数据结构篇)——散列表
1.自然语言描述又称哈希表,关键字本身与其在表中的位置有关系,用哈希函数来确定关键字的位置。哈希表的关键是处理地址冲突,教科书中给出了几种哈希方法,这里用最简单的线性探查来处理冲突。字符串哈希是将两个字符串转换成两个唯一整数,这里是字符串前缀哈希法:将字符串看作一个P进制的数,然后将每一位保存在哈希表中。这样做的好处是能够得到任意一个子串的哈希值,为h[r]-h[r-1]*p[r-l+1];就是将h[r]挪到r,然后做差得到哈希值。P=131或者13331可以使冲突概率极低。2.代码描述题目:Acw原创 2020-08-23 23:40:03 · 92 阅读 · 0 评论 -
ch1(数据结构篇)——堆排序
1.自然语言描述堆排序要用到堆这种数据结构,堆是一棵完全二叉树,其结点值总是不大于/不小于其父结点的值;如果是孩子结点的值<=父结点的值,这种堆被称为大顶(根)堆;反之则是小顶堆。关于堆排序,严教授的数据结构教科书中也有着比较清晰的过程描述,充分利用堆在每次输出最大/最小值后对自身的调整,使得整个输出序列最后有序。2.代码描述题目:Acwing.838 堆排序题目链接#include <iostream>#include <cstring>#include <原创 2020-08-22 23:44:36 · 139 阅读 · 0 评论 -
ch1(数据结构篇)——并查集
1.自然语言描述把有限的一系列点进行划分;开始各点独立,然后通过点与点之间连线,使得这些点形成>=1个连通分量。核心操作是合并和查询;合并是指将两个集合合并起来形成一个集合,查询是指检查某两个点是否在一个集合内。除了这两个基本操作,并查集还可以维护其他数据,比如每个集合有多少个点,每个点到其根节点的距离等等。2.代码描述题目:Acwing.836 合并集合题目链接#include <iostream>#include <cstdio>#include <cst原创 2020-08-22 21:29:55 · 104 阅读 · 0 评论 -
ch1(数据结构篇)——Trie树
1.自然语言描述将所有插入字典树的序列的每个字符进行编号,并在序列的结尾记上标记;沿着树枝进行查询操作原创 2020-08-22 11:36:41 · 90 阅读 · 0 评论 -
ch1(数据结构篇)——KMP
1.自然语言描述KMP 算法是用来寻找模式串S中的模板串P,看是否存在,或P在S中出现了多少次;暴力法解决字符串匹配问题时,当P在S的当前位置不能匹配时,向后移动一位继续匹配,每次都从P的开头进行匹配,时间复杂度O(nm)级别;可以发现暴力法中P不断向后移的过程中,没有利用之前匹配的信息,这些信息可以让P向后移动更多的距离,也就是利用next数组,每次不一定非要从P的开头进行匹配,KMP 利用模板串P每个位置上最大的前缀后缀相同长度来节省时间。KMP 算法的核心是next数组。next数组的含义是:设当原创 2020-08-21 20:56:36 · 115 阅读 · 0 评论 -
ch0(简单实用算法篇)——区间合并
1.自然语言描述考虑一系列已知的区间中有多少个交集。将所有涉及到的区间进行排序(利用sort对pair类型数据排序时以first为准的特性)这样两个集合之间有三种关系:设左端点first较小的区间为X,较大的为Y;一、X.second<Y.first:即两个集合不相交。二、X.second>=Y.first&&X.first<Y.first:即二者相交且交集为二者的真子集。三、X.second>=Y.second:即X包含Y。策略是,统计过程中,以st与原创 2020-08-20 15:27:12 · 320 阅读 · 0 评论 -
ch0(简单实用算法篇)——离散化
1.自然语言描述离散化是一种对无限集合内有限对象的处理方法;当问题的值域是一个无限集合,有用的对象之间相隔很远,遍历集合中的每个对象是天方夜谭,所以必须要通过一些方法把无限空间中有用的对象(符合条件的对象)映射到一个有限集合中,以便于后续操作。关于离散化更专业的解释请点这儿:百度百科对于离散化的解释离散化有三个主要步骤:排序:将无限集合中有限对象集中并排序。去重:去除集中后重复出现的对象。二分查找:对于每个要进行处理的对象,找出在序列中的位置。2.代码描述题目:Acwing.802 区间和题目原创 2020-08-20 15:26:58 · 274 阅读 · 0 评论 -
ch0(简单实用算法篇)——位运算
1.自然语言描述将一个十进制数转换为二进制数,方便一些情况的处理。例如:x&1:将x转换为二进制数,和1做与运算,这样可以得到x最低位。x>>=k:将x右移k位,相当于x=x*2^(-k)。基于基本的逻辑运算规则,位运算往往能较快地完成,是个节省时间的好东西。2.代码描述题目:Acwing.801 二进制中1的个数题目链接#include <iostream>#include <cstdio>#include <cstring>#原创 2020-08-20 15:26:45 · 666 阅读 · 0 评论 -
ch0(简单实用算法篇)——双指针算法
1.自然语言描述双指针算法并不是一种有确定模式的算法,而是一种思想/办法,它可以渗透进其他的具体算法中,而且往往起到了重要作用。一般情况下,双指针算法往往出现在对一个或两个序列的处理中(比如归并排序中,回归过程中两个子序列的合并就用到了双指针)2.代码描述题目:Acwing.799 最长连续不重复子序列题目链接#include <iostream>#include <cstdio>#include <cstring>#include <algorith原创 2020-08-20 15:26:29 · 188 阅读 · 0 评论 -
cho(简单实用算法篇)——前缀和与差分
1.自然语言描述前缀和:一个序列S(1,n),S(i)的前缀和F(i)=F(i-1)+S(i),即为S(1,i)之和。差分:一个序列S(1,n),差分序列F(1,n)中F(i)为S(i)-S(i-1),即保存每个元素与其前一个元素做差的值。2.代码描述题目:Acwing.795 前缀和题目链接#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>u原创 2020-08-20 15:26:14 · 1308 阅读 · 0 评论 -
ch0(简单实用算法篇)——高精度计算
1.自然语言描述高精度计算的算法都是模拟日常算术的做法,将平常列竖式计算的过程放在计算机上实现。高精度计算会极大地提高运算数的范围,摆脱限定字节长度数据类型的束缚。vector不定长数组作运算时的数据结构。高精度加法:设置一个局部变量保存当前数位运算的结果;向结果vector中保存模10结果,后令变量整除10;迭代直至算完所有数位;注意最后若局部变量仍不为0(其实在十进制计算中,这个局部变量不是0就是1)就说明最高数位产生进位,要再将1加入结果vector。高精度减法:设置一个局部变量保存当前数位运原创 2020-08-20 15:26:03 · 993 阅读 · 0 评论 -
ch0(简单实用算法篇)——二分
1.自然语言描述更合适地说,二分其实是一种思想。基本形式是从有序的很多个对象中将要寻找的对象择出来;每次迭代看当前区间的中间元素是否能满足需求条件(形象地理解为代入某个函数)根据结果判断要寻找的对象存在于左区间or右区间;重复进行直至左端点>=右端点。利用二分在序列中进行查找称为二分查找(折半查找)。2.代码描述题目:Acwing.789 数的范围题目链接#include <iostream>#include <cstdio>#include <cstri原创 2020-08-20 15:25:38 · 751 阅读 · 0 评论 -
ch0(简单实用算法篇)——归并排序
1.自然语言描述归并排序是将整个序列先递推分解为单个元素,再将序列回归至完整。回归时,利用双指针分别指向两个已经有序的子序列,使这两个子序列合并到临时序列中并使其有序。这样,归并排序用递归可以较容易地完成。PS:忘记细节可以画一画递归树来模拟这个过程。2.代码描述#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace s原创 2020-08-20 15:25:17 · 272 阅读 · 0 评论