算法
文章平均质量分 73
polarday.
须知少时凌云志,曾许人间第一流。
展开
-
算法模板总结
(小菜鸡的第一篇博客保存了一些ACM的模板+例题,以防用到的时候找不到)博客里面都是一些最最最基本的模板,大佬请自动忽略。。。。一、BFS//#include<bits/stdc++.h>#include<iostream>#include<vector>#include<queue>const int maxx = 205;using namespace std;int n, m;int vis[maxx][maxx];int dis[原创 2020-12-18 20:54:50 · 432 阅读 · 2 评论 -
算法笔记——差分数组
差分数组概念所谓差分数组就是对数组的相邻元素求差保存到一个新的数组中,这个数组就是差分数组。如下所示:序号01234原数组a15343差分数组d14-21-1作用用于频繁的区间修改区间修改是对数组的一段区间同时加上或减去某一个数对上面的数组我们执行如下操作:1.对区间[0,3]中的每个元素加32.对区间[1,2]中的每个元素减2我们不难想到可以通过遍历区间中的每个元素来实现,但是如果区间很大,执行的操作很多时,这种方法很容易超时原创 2021-08-31 10:54:34 · 212 阅读 · 0 评论 -
C++快速排序基准插入函数的两种方法
C++快速排序基准插入函数的两种方法今天做题的时候刷到一种新的快排的实现方法,主要是基准插入函数的不同,这种方法相比于常规方法时间复杂度较高,但是比较容易理解,在这里记录一下。第一种(最常见的双指针遍历)int partition(vector<int>&arr, int i, int j) { int key = arr[i]; while (i < j) { while (i < j && arr[j] >= k原创 2021-09-14 18:39:21 · 216 阅读 · 0 评论 -
并查集(模板+例题)
并查集概念并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题(即所谓的并、查)。比如说,我们可以用并查集来判断一个森林中有几棵树、某个节点是否属于某棵树等。实现属性:pre[]:记录每个结点的先驱结点size[]:记录当前结点所属集合的大小count:记录连通分量的个数方法:查找代表元(find):查找当前结点所属集合的代表元,树形结构,我们可以通过pre逐层向上查找,一直找到根节点即为当前集合的代表元。(这里的代表元就是一个集合中的代表元素,如果两个元素的代表元相同,则原创 2021-11-28 17:35:15 · 4369 阅读 · 0 评论 -
算法笔记——素数筛
算法笔记——素数筛求素数是我们经常会遇到的问题,如何能提高求解素数的效率对我们解决问题至关重要,本文会记录四种求素数的方法,分别是直观算法、朴素算法,埃氏筛法和欧拉筛法素数的定义素数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。(百度百科)这里需要注意素数的范围是大于1的自然数,即0和1都不是素数直观算法直观算法是通过素数的定义来实现的,即除了1和它本身外不再有其他因素,那么我们要判断n是不是素数,只需要遍历看n是否能被2到n-1中的某个数整除即可注:这种算法在实际判断原创 2022-04-05 16:59:35 · 1557 阅读 · 2 评论 -
算法笔记——字典树
算法笔记——字典树(Trie)字典树又称为前缀树,是一种保存字符串(不限于字符串)的树形结构,字典树充分利用了字符串的公共前缀,节省了存储空间,同时可以用于求解一些与前缀有关的问题结构字典树通过边来表示表示字符,每个节点所代表的字符序列就是从根节点到该节点的路径上的所有字符,同时为每个节点设置一个标志位来表示这个节点是否是单词的结尾。以"able"、“cat”、“cater”,“can”、“to”、"two"所构成的字典树为例实现节点定义:vector<TrieNode *>原创 2022-04-03 18:48:59 · 946 阅读 · 0 评论 -
算法笔记——动态规划
算法笔记——动态规划动态规划是一个非常灵活的算法,动态规划本身不难,无非就是一个状态转移的过程,难点就在于我们该如何去定义“状态”,而这就需要我们多做题来积累经验,这也是初学者遇到动态规划往往无从下手的原因。动态规划的核心在于状态和状态转移方程,状态具体该如何去定义,需要大家多做题来体会,下面主要是记录一下动态规划的一般解题思路。以122. 买卖股票的最佳时机 II为例给定一个数组 prices ,其中 prices[i] 表示股票第 i 天的价格。在每一天,你可能会决定购买和/或出售股票。原创 2022-03-24 23:16:04 · 1196 阅读 · 5 评论 -
算法笔记——回溯
算法笔记——回溯回溯法实际上就是把问题的解空间转化成了图或者树的结构表示,然后使用深度优先搜索策略进行遍历,如果遍历的过程中发现已不满足求解条件时,就“回溯”(即回退),尝试别的路径。思想回溯法从根结点出发,按照深度优先策略遍历解空间树,搜索满足约束条件的解。当搜索至树中的任一结点时,先判断该结点对应的部分解是否满足约束条件,或者是否超出目标函数的界限,也就是判断该结点是否可能包含问题的可行解:如果肯定不包含,则跳过对以该结点为根的子树的搜索,即所谓剪枝;否则,进入以该结点为根的子树,继续按照原创 2022-03-09 19:24:12 · 510 阅读 · 0 评论 -
算法笔记——深度/广度优先搜索
算法笔记——深度/广度优先搜索深度优先搜索和广度优先搜索主要是用在图的遍历中,模板性很强,我个人认为是比较简单的算法,下面主要写一下深搜和广搜的模板,照着模板多做题基本就能掌握了深度优先搜索过程:访问指定的起始顶点若当前访问的顶点的邻接顶点有未被访问的,则选择其中一个顶点访问,然后回到第一步若当前的顶点的邻接顶点都已经访问,则返回当前顶点的上一个顶点如下图,其实就是先沿一条边访问到底,然后再返回访问另一条边模板DFS一般通过递归来实现 void dfs(int x){原创 2022-03-06 17:32:54 · 458 阅读 · 0 评论 -
算法笔记——并查集
算法笔记——并查集并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题(即所谓的并、查)。关于并查集的讲解有很多大佬的博客都写的很好,这里我主要是参考这篇文章——并查集定义并查集实际上是一种树形结构,可以用来查询连通分支的个数,属于同一连通分支的在同一棵数上主要变量pre[]:记录结点的前驱结点rank[]:记录结点的高度count:记录连通分支的个数主要函数init():初始化join(x,y):合并x,y结点find(x):查找x结点所在树的根节点函数定义1原创 2022-03-04 17:45:23 · 223 阅读 · 0 评论 -
算法笔记——双指针
算法笔记——双指针双指针即使用两个指针对对象进行扫描,一般有快慢指针和左右指针两种,快慢指针指从一侧开始同时向另一侧移动但是移动速度不同,左右指针则是分别从两侧向对方移动双指针的内容不多,但是使用起来非常灵活,需要多做题体会思路快慢指针的常见用法1. 判断链表是否有环单链表的特点是每个节点只知道下一个节点,所以一个指针的话无法判断链表中是否含有环的。如果链表中不含环,那么这个指针最终会遇到空指针 null 表示链表到头了,这还好说,可以判断该链表不含环。但是如果链表中含有环,那么这个指针就原创 2022-03-01 17:54:33 · 591 阅读 · 0 评论 -
算法笔记——二分查找
算法学习第一天——二分查找二分查找:用于在有序数列中查找目标元素的位置关于区间边界的问题二分法,区间的定义一般为两种,左闭右闭即[left, right],或者左闭右开即[left, right)。左闭右闭while (left <= right) 要使用 <= ,因为left == right是有意义的,所以使用 <=if (nums[middle] > target) right 要赋值为 middle - 1,因为当前这个nums[middle]一定不是tar原创 2022-02-27 23:17:35 · 880 阅读 · 1 评论 -
等概率抽样——水塘抽样
等概率抽样——水塘抽样给出一个数据流,这个数据流的长度很大或者未知。并且对该数据流中数据只能访问一次,且不能使用额外的空间,请写出一个随机选择算法,使得数据流中所有数据被选中的概率相等。从头开始遍历数据,当遍历到第n个数据时,从0到n-1中随机选取一个数字,如果选到数字0,则将答案置为该数据的值,否则答案不变继续向下抽样,遍历完所有数据后,抽到每个数据的概率都是1n\frac {1}{n}n1证明:P(第i个数据为最终答案)=P(第i个数据抽到随机数0)×P(第i+1个数据没有抽到随机数0)×原创 2022-01-16 01:14:46 · 486 阅读 · 0 评论