基础算法
文章平均质量分 52
基本数据结构+算法
Valueyou24
温柔且坚定(˵¯͒¯͒˵)
展开
-
快速排序模板
【代码】快速排序模板。原创 2024-01-14 15:49:17 · 408 阅读 · 0 评论 -
01背包问题和完全背包一维数组版【模板可用】
接下来有 n 行,每行两个整数 v[ i ], w[ i ],用空格隔开,分别表示第 i 件物品的体积和价值。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。第一行两个整数,n,m,用空格隔开,分别表示物品数量和背包容积。有 n 件物品和一个容量是 m 的背包。每件物品只能使用一次。第 i 件物品的体积是 v[ i ],价值是 w[ i ]。我们只需要记住 f[ j ] 的转态转移方程即可。输出一个整数,表示最大价值。原创 2023-12-27 22:31:36 · 411 阅读 · 0 评论 -
整数二分的建模
二分法的难点在于如何建模和 check() 函数检查条件,其中可能会套用其他算法或数据结构。本题中,所有点两两之间的距离有一个最小值,题目要求使这个。原创 2023-12-07 22:25:39 · 203 阅读 · 0 评论 -
二分法中mid的处理以及STL二分函数
(1)upper_bound() : 查找第一个大于 x 的元素的位置,pos = upper_bound(a, a + n, x) - a;(3)upper_bound() - lower_bound() : 计算单调序列中 x 的个数。(2)lower_bound() : 查找第一个等于或大于 x 的元素;若需要找 x 或 x 的前驱,则用。left + right可能溢出。left + right无溢出。三种方法各有优缺点,综合起来,负数情况下有向0取整问题。原创 2023-12-06 19:57:16 · 314 阅读 · 0 评论 -
双指针算法
双指针,算法书上称为尺取法,用来解决序列的区间问题,操作简单,容易编程。如果区间是单调的,也常常可以用二分法求解,所以很多问题双指针和二分法都行。原创 2023-12-05 23:51:22 · 696 阅读 · 0 评论 -
算法的复杂度
在很多情况下,这是算法可能达到的最优复杂度,因为对输入的 n 个数,程序一般需要处理所有数,即计算 n 次。再如图问题,一个图中有 V 个点和 E 条边,大多数图问题都需要搜索到所有的点和边,复杂度至少为O(V + E)算法和数据结构是紧密结合的,而且有些数据结构有特定的处理办法,此时很难把数据结构和算法区分开来。因为一个算法的空间复杂度是容易分析的,而时间复杂度往往关系到算法的根本逻辑,不容易分析,更能说明一个程序的优劣。(4)确定性:算法中的每条指令必须有确切的含义,对于相同的输入只能得到相同的输出。原创 2023-12-04 19:02:15 · 140 阅读 · 0 评论 -
基础数据结构----二叉树
按照深度搜索的顺序访问二叉树,对父节点、左孩子、右孩子进行组合,有先序遍历、中序遍历、后序遍历这 3 种访问顺序,这里默认左孩子在右孩子的前面。(1)先序遍历,按父节点、左孩子、右孩子的顺序访问,在上图中,先序遍历输出的结果为EBADCGFIH,先序遍历的第一个节点是根。(3)后序遍历,按左孩子、右孩子、父节点的顺序访问。(3)如果节点 i 有孩子,那么它的左孩子是节点 2i,右孩子是节点 2i + 1。二叉树的一个节点的存储,包括节点的值、左右子节点,有动态和静态两种存储方法。原创 2023-12-03 21:20:35 · 150 阅读 · 0 评论 -
基础数据结构----栈
栈的特点是“先进后出”。栈在生活中的原型有:坐电梯,先进电梯的被挤到最里面,只能最后出来;一管泡腾片,最先放入管子的药片位于最底层,最后被拿出来。栈只有唯一的出入口,从这个口进入,也从这个口弹出,这是它与队列的最大的区别。编程中常用的递归就是用栈来实现的,栈需要用空间存储,如果栈的深度太大,或者存进数组的栈太大,那么总会超过系统为栈分配的空间。就会爆栈导致栈溢出。这是递归的主要问题,递归深度需要注意。编码时通常直接用STL stack,或者自己手写栈。为了避免爆栈,需要控制栈的大小。原创 2023-11-30 19:48:58 · 461 阅读 · 0 评论 -
基础数据结构----单调队列与最大子序和问题
如果 s[ 1 ] > s[ 2 ],那么保持 ans = s[ 1 ]不变,然后从窗口中抛弃 s[ 1 ],只留下 s[ 2 ],因为后面再把新的 s[ i ’ ] - s[ 2 ] 比 s[ i ’ ] - s[ 1 ]更大(注意s为前缀和,s[ 1 ] > s[ 2] 实际上是 a[ 2 ]一定小于0,留下s[ 2 ]是为了跳过负数 a[ 2 ])(2)dp[ i ]包括多个元素,从前面某个a[ v ]开始,v < i,到a[ i ]结束,即dp[ i - 1] + a[ i ]。原创 2023-11-29 20:04:42 · 282 阅读 · 1 评论 -
基础数据结构----单调队列与滑动窗口
如果他会魔法,他来排队时,队尾比他高的人就自动从队尾离开,新的队尾如果仍比他高,也会离开;他终于能看到菜了,让人兴奋的是,菜很好吃,所以他肯定不想走。不过,能不能看到和身高有关,站在队尾的人如果个子高,眼光就能越过前面的人看到里面的菜;假设每个新来的人的魔法本领都比队列中的人更高,这个队伍就会变成这样:每个新来的人都能排到队尾,但是都会被后面来的高个子赶走。下面举例描述算法流程,队列为{1,3,-1,-3,5,3,6,7},我们可以理解为身高。但是,让这个魔法纳闷的是,打饭阿姨一直忙自己的,顾不上打饭。原创 2023-11-28 23:01:53 · 197 阅读 · 0 评论 -
基础数据结构----双端队列和单调队列
前面我们写的队列都很“规矩”,队列的元素都是“先进先出”,队头只能弹出,队尾只能进入。双端队列是一种具有队列和栈性质的数据结构,他能在两端进行插入和删除,而且也只能在两端插入删除。其原理可以简单地概括为:序列中的n个元素,用单调队列处理时,每个元素只需要进出队列一次,复杂度为O(n)。单调队列中的元素是单调有序的,且元素在队列中的顺序和原来在序列中的顺序一致;(7)dq.push_front(e) :在队头添加一个元素 e。(1)dq[ i ] :返回队列中下标为 i 的元素。原创 2023-11-27 19:52:08 · 224 阅读 · 1 评论 -
基础数据结构----手写循环队列
这一节将给出循环队列的手写模板。我记得这个知识点在2023年上半年软考初级程序员中考过。代码中给出了静态分配空间和动态分配空间两种方式(动态分配写在注释中)。竞赛中一般用静态分配。原创 2023-11-27 09:11:50 · 53 阅读 · 1 评论 -
基础数据结构----STL queue
定义队列,Type为数据类型,如int、float、char等。下面是STL queue的写法,由于不用自己管理队列,代码很简洁。同时我们采用简易的哈希算法,提高效率。把item放入队列。返回队首元素,但不会删除。(4)q.pop();这一节主要讲解STL queue的用法和对应的例子。原创 2023-11-26 23:44:48 · 133 阅读 · 1 评论 -
基础数据结构----队列
循环队列是一种顺序表,使用一组连续的存储单元依次存放队列元素,用两个指针head和tail分别指示队头元素和队尾元素,当head和tail走到底时,下一步回到开始的位置,从而在这组连续空间内循环。如果不循环,head和tail都一直往前走,可能走到存储空间之外,导致溢出。队列中的数据存取方式是“先进先出”,只能向队尾插入数据,从队列头移动数据。队列的原型在生活中很常见,如食堂打饭的队伍,先到先服务。队列有两种实现方式:链队列和循环队列。这个队列不是循环的,tail可能超过N,导致溢出。原创 2023-11-26 21:21:47 · 44 阅读 · 1 评论 -
基础数据结构----STL list
在算法竞赛中常常使用C++ STL list。list是双向链表,由标准模板库STL管理,通过指针访问节点数据,高效率地删除和插入。原创 2023-11-25 19:09:47 · 48 阅读 · 0 评论 -
基础数据结构----静态链表
静态链表使用预先分配的一段连续空间存储链表。从物理存储的意义上讲,“连续空间”并不符合链表的本义,因为链表的优点就是能克服连续存储的弊端。定义一个一维数组nodes[ ],nodes[ i ]的 i 就是节点的值,而node[ i ]的值就是下一个节点。注意该方法使用环境很有限,因为它的节点只能存一个数据,就是 i。1.定义链表结构体数组,和动态链表结构差不多。一,使用结构体数组实现单向静态链表,注意静态分配要在全局定义。二,用结构体数组实现双向静态链表。三,用一维数组实现单向静态链表。原创 2023-11-24 23:56:07 · 60 阅读 · 0 评论 -
基础数据结构----动态链表
这是标准的教科书式写法,但在竞赛过程中一般不用。算法竞赛对内存管理要求没有那么严格,为了加快编码速度,一般就在题目允许的存储空间内静态分配,省去了动态分配和释放的麻烦。动态链表需要临时分配链表节点,使用完后释放链表节点,动态链表的优点是能及时释放空间,不使用多余内存;缺点是需要管理空间,容易出错。原创 2023-11-23 19:44:22 · 221 阅读 · 0 评论