算法打卡学习笔记
文章平均质量分 71
我的学习算法的日常,一些心得笔记,方便复习
不能say的秘密
Have Fun!
展开
-
算法全模板
逆序对的数量#include <bits/stdc++.h>typedef long long ll;using namespace std;const int N=100001;int q[N],tmp[N];ll merge_sort(int p[],int l,int r){ if(l>=r) return 0; ll res; int mid=l+r>>1; res = merge_sor原创 2021-09-20 23:07:04 · 126 阅读 · 0 评论 -
时空复杂度分析
转载 2020-11-30 22:45:43 · 126 阅读 · 0 评论 -
数据结构3
C++ STL简介vector, 变长数组,倍增的思想 size() 返回元素个数 empty() 返回是否为空 clear() 清空 front()/back() push_back()/pop_back() begin()/end() [] 支持比较运算,按字典序pair<int, int> first, 第一个元素 second, 第二个元素 支持比较运算,以first为第一关键字,以sec原创 2020-11-30 22:37:17 · 206 阅读 · 0 评论 -
数据结构2
KMP// s[]是长文本,p[]是模式串,n是s的长度,m是p的长度求模式串的Next数组:for (int i = 2, j = 0; i <= m; i ++ ){ while (j && p[i] != p[j + 1]) j = ne[j]; if (p[i] == p[j + 1]) j ++ ; ne[i] = j;}// 匹配for (int i = 1, j = 0; i <= n; i ++ ){ while原创 2020-11-29 15:14:45 · 98 阅读 · 0 评论 -
数据结构1
单链表:邻接表->存储图和树#include <iostream>using namespace std;const int N = 100010;// head 表示头结点的下标// e[i] 表示节点i的值// ne[i] 表示节点i的next指针是多少// idx 存储当前已经用到了哪个点int head, e[N], ne[N], idx;// 初始化void init(){ head = -1; idx = 0;}// 将x插到头结点原创 2020-11-29 15:09:11 · 99 阅读 · 0 评论 -
其余的基础算法
位运算 :求n的第k位数字: n >> k & 1返回n的最后一位1:lowbit(n) = n & -n双指针算法for (int i = 0, j = 0; i < n; i ++ ){ while (j < i && check(i, j)) j ++ ; // 具体问题的逻辑}常见问题分类: (1) 对于一个序列,用两个指针维护一段区间 (2) 对于两个序列,维护某种次序,比如归并排序中合并两个有原创 2020-11-29 15:00:24 · 140 阅读 · 0 评论 -
数学知识2
欧几里得算法:(a,b)=(b,a mod b)d|a,d|b->d|ax+by ("|"是整除的意思)int gcd(int a, int b){ return b ? gcd(b, a % b) : a;}求欧拉函数(1~n中与n互质的数的个数)int phi(int x){ int res = x; for (int i = 2; i <= x / i; i ++ ) if (x % i == 0) {原创 2020-11-29 14:53:36 · 302 阅读 · 0 评论 -
数学知识1
1、质数:在大于1的整数中,如果只包含1和本身这两个约数,就被称为质数,或者叫素数。(1)试除法——质数的判定 :(时间复杂度O(sqrt(n)))bool is_prime(int x){ if (x < 2) return false; for (int i = 2; i <= x / i; i ++ ) if (x % i == 0) return false; return true;}(2)试除法——分解质因数原创 2020-11-29 14:46:17 · 232 阅读 · 0 评论 -
搜索与图论4
拓扑排序时间复杂度 O(n+m), n 表示点数,m 表示边数bool topsort(){ int hh = 0, tt = -1; // d[i] 存储点i的入度 for (int i = 1; i <= n; i ++ ) if (!d[i]) q[ ++ tt] = i; while (hh <= tt) { int t = q[hh ++ ]; for (int原创 2020-11-29 14:22:59 · 263 阅读 · 0 评论 -
搜索与图论3
树与图的深度优先遍历例题:树的重心#include <iostream>#include <cstring>using namespace std;const int N=100010;bool state[N];//因为是双向边int h[N],e[2*N],ne[2*N],idx,ans=N;int n;int add(int a,int b){ e[idx]=b; ne[idx]=h[a]; h[a]=idx++;}//返回.原创 2020-11-29 14:11:22 · 83 阅读 · 0 评论 -
搜索与图论2
宽度优先搜索BFSqueue<int> q;st[1] = true; // 表示1号点已经被遍历过q.push(1);while (q.size()){ int t = q.front(); q.pop(); for (int i = h[t]; i != -1; i = ne[i]) { int j = e[i]; if (!st[j]) { st[j] = true; //原创 2020-11-29 10:52:41 · 100 阅读 · 0 评论 -
搜索与图论1
DFS(关键是顺序)int dfs(int u){ st[u] = true; // st[u] 表示点u已经被遍历过 for (int i = h[u]; i != -1; i = ne[i]) { int j = e[i]; if (!st[j]) dfs(j); }}例题:给定一个整数n,将数组1~n排成一排,将会有很多中排列方法。现在,请你按照字典序将所有排列方法输出。输入:3输出:1 2 31 3 22 1原创 2020-11-29 10:38:39 · 108 阅读 · 0 评论 -
前缀和与差分
前缀和快速算出一段数组中的一个范围中的数值和。利用前r端和减去前l-1端和。思想很重要模板代码:#include <iostream>using namespace std;const int N = 100010;int n,m;int a[N],s[N];int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n原创 2020-11-22 16:02:30 · 128 阅读 · 0 评论 -
高精度类型问题
高精度加法:大整数:数组的第零位存数的个位比较好!代码模板:#include <iostream>#include <vector>using namespace std;vector<int> add(vector<int> &A,vector<int> &B){ vector<int> C; int t = 0;//进位 for(int i=0;i<A.size()||i<B.size原创 2020-11-22 16:01:58 · 170 阅读 · 0 评论 -
二分排序算法
整数二分排序算法:什么时候会选择用到?——给定一个按照升序排列的长度为n的整数数组二分程序虽然简单,但是如果写之前不考虑好想要查找的是什么,十有八九会是死循环或者查找错误,就算侥幸写对了也只是运气好而已。用二分去查找元素要求数组的有序性或者拥有类似于有序的性质模板代码:bool check(int x) {/* ... */} // 检查x是否满足某种性质// 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用:int bsearch_1(int l, int r){原创 2020-11-22 15:59:15 · 2723 阅读 · 0 评论 -
归并排序算法
归并排序基于分治的思想1、以中间的数为分界点mid = (l+r)/22、递归排序left,right3、归并——合二为一模板代码#include <iostream>using namespace std;const int N = 1e6 + 10;int a[N], tmp[N];void merge_sort(int q[], int l, int r){ if (l >= r) return; int mid = l + r >>原创 2020-11-22 15:40:12 · 127 阅读 · 0 评论 -
快速排序算法
快速排序算法:此算法基于分治的思想(一般用不到的,但在面试的时候会用到)1、确定分界点q[l],q[(l+r)/2],q[r]随机数值;2、调整区间>=x,<=x;3、递归处理左、右两段模板代码:#include <iostream>using namespace std;const int N = 1e6+10;int n;int q[N];void quick_sort(int q[],int l,int r){ if(l>=r) return;原创 2020-11-22 15:39:33 · 107 阅读 · 0 评论