算法
文章平均质量分 50
c++算法为主
Gsding
路漫漫其修远兮
展开
-
数论之约数
文章目录试除法求约数约数的个数约数之和试除法求约数题目大意:输出n个数,分别输出这n个数所有的约数# include <iostream># include <algorithm># include <vector>using namespace std;const int N = 1e5 + 10;vector<int> solve (int n){ vector<int> a; // 当i是约数,那么n/原创 2021-09-26 17:58:33 · 121 阅读 · 0 评论 -
stl笔记
vector(变长数组),倍增的思想,支持比较运算(按字典序) 定义:: vector <int> a; 定义:一个vector数组a vector <int> a(10); 定义:一个长度为10的vector数组a vector <int> a(10,3); 定义:一个长度为10的vector数组a,并且所有元素都为3 常用函数:: size(); 返回元素个数 empty(原创 2021-09-24 09:32:05 · 152 阅读 · 0 评论 -
树与图的BFS——图中点的层次
题意:给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环。所有边的长度都是 1,点的编号为 1∼n。请你求出 1 号点到 n 号点的最短距离,如果从 1 号点无法走到 n 号点,输出 −1。输入:第一行包含两个整数 n 和 m。接下来 m 行,每行包含两个整数 a 和 b,表示存在一条从 a 走到 b 的长度为 1 的边。输出:输出一个整数,表示 1 号点到 n 号点的最短距离思路:层序遍历找出点和点的距离即可模板 有向图的存储和bfsint n, m, idx;int h[原创 2021-08-30 21:02:36 · 202 阅读 · 0 评论 -
树与图的深搜——树的重心
重心的定义重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中点数的最大值最小,那么这个节点被称为树的重心。举个例子我们去掉1,树将分为连通块(2,5,8),(3,4,6,9),(7),此时最大连通块点数是4,去掉点2,连通块为(8),(5),(1,4,7,3,6,9),最大连通块点数是6,依次类推,我们会发现1才是树的重心。思路假设我们删除红色节点,那么树会划分成ABC三个部分,我们只需要算出max(size(A),size(B),size(n-A-B))删除点x,对于y,df原创 2021-08-30 20:10:30 · 150 阅读 · 0 评论 -
DFS补题 红与黑 气候变暖
链接: ACWing 1113# include <bits/stdc++.h>using namespace std;const int N = 200;int dx[5] = {1,-1,0,0} , dy[5] = {0,0,-1,1};int h, w;char g[N][N];int dfs(int a, int b){ g[a][b] = '#'; int ans = 1; for (int i = 0; i < 4; i ++){ int原创 2021-08-28 15:05:54 · 85 阅读 · 0 评论 -
BFS补题 迷宫 八数码
迷宫问题链接: ACWing 844#include <bits/stdc++.h>using namespace std;typedef pair<int,int> PII;const int N = 200;int g[N][N],f[N][N];int m, n;int dx[5] = {1,-1,0,0} , dy[5] = {0,0,-1,1};void bfs(int a, int b){ queue<PII> q; q.push原创 2021-08-26 09:57:28 · 114 阅读 · 0 评论 -
DFS BFS简单理解
文章目录BFS DFS介绍实现思路DFS BFS怎么应用DFS BFS对比又水了一篇博客呜呜,第一次尝试写DFS和BFS,做题也迷迷糊糊,看着大佬文章简单写了写总结,后续会补上DFS和BFS的题目。BFS DFS介绍DFS:深度优先搜索,又叫回溯算法。这个算法的核心就是不断的往更深的地方搜索,如果更深的地方搜索失败了,就返回来搜,是一个回溯的过程。BFS:广度优先搜索,也是一种搜索算法,讲究搜索的广度,所以叫广度优先算法。这个算法的核心就是,先把周围的找完,再去找更深的地方。这里区分下dfs和bf原创 2021-08-25 22:17:51 · 326 阅读 · 1 评论 -
dfs回溯return问题
初学dfs时候一直不明白函数里要return干什么…后来看了看大佬们的讨论和文章有了点简单的理解。例题输入一个n,输出n的全排列,n<=9先看第一个代码#include <bits/stdc++.h>using namespace std ;const int N = 10 ;int num[N] ;int value[N] ;int n ;void dfs(int k){ if (k == n + 1){ for (int i = 1 ; i <=原创 2021-08-25 21:25:43 · 1228 阅读 · 1 评论 -
八皇后问题
DFS基本概念深度优先搜索算法(Depth First Search,简称DFS):一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止(不撞南墙不回头)。属于盲目搜索,最糟糕的情况算法时间复杂度为O(!n)。算法思想回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原原创 2021-08-25 21:07:45 · 121 阅读 · 0 评论 -
并查集路径优化实现
文章目录支持的操作:基本原理原理解释路径压缩代码实现支持的操作:合并两个集合询问两个元素是否在一个集合中基本原理每个集合用用一棵树表示,树的根节点的idex就是整个集合的idex。每个节点保存了它的父节点,p[x] 表示 x 的父节点。原理解释在同一个acm队里,你我可能互不认识,但是你我可以通过有相同的朋友来成为朋友,也就是朋友的朋友就是朋友。这样神似串联的合并模式岂不是太复杂了想成为朋友那岂不是猴年马月,那么想出一个办法,选出几个ac选手做leader,几个leader再选出leade原创 2021-08-16 20:26:26 · 158 阅读 · 0 评论 -
trie树 最大异或对
trie树trie树又叫字典树trie 高效地存储和查找字符串集合的数据结构本质根据字符串的每个字符作为节点建树凡是用到trie树,字符不会太多# include <bits/stdc++.h>using namespace std;const int N = 1e5 + 10;int cnt[N] // 以当前这个单词结尾的有多少个int son[N][26];//因为这里假设都是小写字母,所以最多只有26条边int idx; // 单链表用了哪一个点,下标是0的点,既原创 2021-08-12 22:06:06 · 244 阅读 · 0 评论 -
KMP算法
这里写目录标题KMP算法及其相关概念前缀后缀,部分匹配表介绍KMP算法图解习题KMP算法及其相关概念KMP算法是一个字符串匹配算法,对暴力的那种一一比对的方法进行了优化,使时间复杂度大大降低。KMP算法的作用是在一个已知字符串中查找子串的位置,也叫做串的模式匹配。比如主串s=“goodgoogle”,子串t=“google”。现在我们要找到子串t 在主串s 中的位置。·相关概念:s[] : 模式串,较长的字符串p[] : 模板串,简短的串前缀:除了最后一个字符以外,该字符串的全部头部组合后缀原创 2021-08-12 19:26:57 · 153 阅读 · 0 评论 -
单调栈和单调队列
文章目录栈和队列基本函数单调栈单调队列栈和队列基本函数#include 栈的头文件#include 队列的头文件定义栈如下:stack s;定义队列如下:queue q;栈的基本操作s.empty() 如果栈为空返回true,否则返回falses.size() 返回栈中元素的个数s.pop() 删除栈顶元素但不返回其值s.top() 返回栈顶的元素s.push() 在栈顶压入新元素队列的基本操作q.empty() 如果队列为空返回true,否则返回falseq.原创 2021-08-09 22:37:45 · 200 阅读 · 1 评论 -
单链表的添加删除操作(静态)
通过数组模拟链表进行操作对于单链表,一个数据有两个值:value和next,分表表示当前值,和下一个数据的指针,比如A,B,C ,A的值是a,他的next指的是B的指针,可以理解为老鹰捉小鸡游戏,后面的人的手抓住前面的人的衣服,通过·前面的衣服,就可以找出后一个人题目描述实现一个单链表,链表初始为空,支持三种操作:(1) 向链表头插入一个数;(2) 删除第k个插入的数后面的数;(3) 在第k个插入的数后插入一个数现在要对该链表进行M次操作,进行完所有操作后,从头到尾输出整个链表。注意:题目中原创 2021-08-05 20:38:32 · 177 阅读 · 0 评论 -
区间合并
题意 : 将重复区间合并思路 : 将区间顺序读入到结构体中 , 然后按照左端点升序排序 , 若左端点相等 , 按照右端点升序排序,一个区间的右端点大于下一个区间的左端点,那么让这个区间的右端点和下一个区间右端点比较更新最大值# include <iostream># include <algorithm># include <cstring>using namespace std ; const int N = 1e5 + 10 ; int a[N];.原创 2021-08-03 17:28:04 · 121 阅读 · 0 评论 -
前缀和&差分详解及经典例题补充
文章目录声明一维前缀和介绍前缀和优势二维前缀和介绍二维前缀和模板题一维差分一维差分例题二维差分二维差分习题声明前缀和 与 差分可以理解为互逆的 , 求前缀和 跟 差分通常设数组首项下标为1,方便思考的计算。一维前缀和介绍对于一维数组 a[n] , 存在数组 sum[n],使得 sum[i] = a[1] + a[2] + … + a[i]前缀和优势以O(1)的时间复杂度得到某块区间的总和举个例子:输入一个长度为 n 的整数序列。接下来再输入 m 个询问,每个询问输入一对 l,r。对于每个原创 2021-07-22 17:14:18 · 690 阅读 · 2 评论 -
二分查找算法
二分 模板介绍本质 不是单调性原创 2021-07-21 21:11:10 · 1189 阅读 · 0 评论 -
归并排序详解
归并排序(英语:merge sort)是一种采用了分治思想的排序算法。步骤 :step1: 将数列从中间划分为两部分step2: 调用递归将左右两个子数列继续进行归并排序step3:将两个有序的子序列合并成整个完整数列**(双指针)时间复杂度 :归并排序的最优时间复杂度、平均时间复杂度和最坏时间复杂度均为 O(nlogn)。每递归一层, 每个数列会产生两层子数列空间复杂度 O(n)步骤1 取中间int mid = (left+right)/...原创 2021-07-20 18:59:53 · 2229 阅读 · 0 评论 -
大数相加(c++)(包含string char int 转换)
引 : 字符和数字转换头文件 # include <sstream>string --> int原创 2021-06-05 23:00:31 · 244 阅读 · 0 评论 -
快速幂算法
取模运算:(a*b)%c = ((a%c)*(b%c))%c证明 : 设 a = k1*m + p1; b = k2*m + p2a*bn原创 2021-06-04 22:50:36 · 145 阅读 · 0 评论 -
POJ 2386 DFS
题目:有一个大小为NxM的园子,雨后积起了水。八连通的积水被认为是连接在一起的。请求出园子里总共有多少水洼?(N,M≤100)样例输入:10 12W........WW..WWW.....WWW....WW...WW..........WW..........W....W......W...W.W.....WW.W.W.W.....W..W.W......W...W.......W.样例输出:3————————————————版权声明:本文为CSDN博主「叶梨子」原创 2021-06-09 20:42:44 · 114 阅读 · 0 评论 -
搜索(c++)
二分查找# include <iostream># include <algorithm># include <cmath># include <string># include <cstring>using namespace std;int main(){ int m , n , x; cin >> n >> m ; int a[1000]; for (int i = 0 ; i < n原创 2021-06-09 20:33:33 · 162 阅读 · 0 评论