- 博客(10)
- 收藏
- 关注
原创 kmp算法操作的小小理解
用于在一大串字符中查询一段字符。一大串字符用s[]表示需要查询的一段字符用p[]表示int next[]数组构造next数组int j;代表指向需要查询的字符段当中一个个字符的位置void kpm匹配算法(){//构造next数组 for(int i=2,j=0;i<=n;i++) //next数组与需要查询的字符串有关 { while(j&&p[i]!=p[j+1...
2021-09-08 21:04:29
80
原创 单向链表(用数组表示)
链表即为使用链式存储的一种数据结构其基本原型为typedef struct Node{ ElemType data; struct Node}
2021-09-07 22:57:36
302
1
原创 关于二进制运算总结
1.将十进制的n转化为二进制并输出其第k位。 n>>k&1; "n>>k"的含义是将n转为二进制,并右移k位 例: 10的二进制为1010. 当k为3时,n>>k的数为1 20的二进制为10100 当k为3时,n>>k的数为102.二进制的位数 例: 1 0 1 1 0 1 1 0位数 7 6 54 3 2 1 03.lowbit函数返回...
2021-09-06 22:30:58
405
原创 开平方根算法(二分查找)
double Sqrt(int a){ double l=-100,r=100;//开平方跟的数在[-100,100]这个区间中 while(r-l>1e-8) { double mid=(l+r)/2; if(mid*mid>a)r=mid; else l=mid; } return l;...
2021-09-06 16:37:03
261
原创 区间合并.(双指针)
模拟将各个零散的区间()进行合并,取有交集的区间的并集最后统计一共有多少个并集void merge(vector<pair(int,int)>arr){ int st=-2e9;int ed=-2e9; //设置两个指针指向第一位 vector<pair(int,int)>brr; //维护数据 for(auto item:arr) //遍历arr数组 { ...
2021-09-05 22:38:34
99
原创 离散化算法
在对于大范围的数组中对小范围的数进行运算时,缩小操作的数组,使用离散化算法可以降低时间复杂度。离散化算法是使用vector容器记录需要离散化数据的下标,对其下标进行下一步操作例:令一段数列中的第x个数加上c,执行n次,给出m个[l,r]的范围,求该范围的和思路:1.对于求和可以用前缀和的方式求和 即int a[N],s[N]保存数据2.记录所有操作的下标和操作3.将需要操作的下标和所有l,r的范围记录到离散化数组中4.对离散化数组去重(需要对数组中保存的下标先排序再去重)
2021-09-05 16:56:55
767
原创 前缀 和 差分 数
前缀和主要用于在一段范围内的数组中进行加减操作在数组a[n]中,其前缀和数组s[n]s[n]=s[n-1]+a[n]特别注意!!!s[0]一定要空出来,s[n]初始化一定要从1开始,防止数组越界例:求n个数中在[l,r]中的和const int N = 1000010;int a[N];int s[N];int main(){ int n; cin >> n; for (int i = 1; i <= n; i++) {...
2021-09-04 20:37:11
79
原创 大数相加减
高精度大数相加减vector容器中存储的数字都倒叙如:123为[3,2,1]vector<int> add(vector<int>&a,vector<int>&b){ if(a.size()<b.size()return add(a,b); int t=0;vector<int>c;//t为加出来多的数 for(int i=0;i<a.size();i+...
2021-09-04 19:30:10
73
原创 二分查找.
使用循环的方式二分查找最后l停留的位置就是查找到该数的位置int arr[1000010];void check(int n.int m)//n一共有多少数字 m查找的数字{ int l=0;int r=n-1; while(l<=r) { int mid=(r+l)/2; if(arr[mid]>=m)r=mid; ...
2021-09-04 16:13:09
58
原创 快排,递归排序总结
快排:int arr[10000]; void quickSort(int left, int right)//设置起始位置和截止位置指针{ //随意选取一个数 int mid; mid = (left + right) / 2; int i = left; int j = right; do { while (arr[i] < arr[mid])i++; while (arr[j] > arr[m...
2021-09-04 15:23:17
114
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人